From ea29d032bb60d72bcd7c612a078fd7672d589158 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Mon, 29 Aug 2022 15:20:37 +0200 Subject: [PATCH 001/204] chore: move front related files to front folder --- .gitignore | 8 + assets/dist/BeerCrackerz.bundle.js | 1 - assets/dist/BeerCrackerzAuth.bundle.js | 1 - .../assets}/dist/BeerCrackerz.bundle.css | 3 + front/assets/dist/BeerCrackerz.bundle.js | 177 ++++++++++++++++++ .../assets}/dist/BeerCrackerzAuth.bundle.css | 3 + front/assets/dist/BeerCrackerzAuth.bundle.js | 117 ++++++++++++ .../assets}/html/modal/deletemark.html | 0 .../assets}/html/modal/editbar.html | 0 .../assets}/html/modal/editspot.html | 0 .../assets}/html/modal/editstore.html | 0 .../assets}/html/modal/hideshow.html | 0 .../assets}/html/modal/newbar.html | 0 .../assets}/html/modal/newspot.html | 0 .../assets}/html/modal/newstore.html | 0 {assets => front/assets}/html/modal/user.html | 0 {assets => front/assets}/html/popup/bar.html | 0 {assets => front/assets}/html/popup/spot.html | 0 .../assets}/html/popup/store.html | 0 .../img/favicon/android-icon-144x144.png | Bin .../img/favicon/android-icon-192x192.png | Bin .../img/favicon/android-icon-36x36.png | Bin .../img/favicon/android-icon-48x48.png | Bin .../img/favicon/android-icon-72x72.png | Bin .../img/favicon/android-icon-96x96.png | Bin .../img/favicon/apple-icon-114x114.png | Bin .../img/favicon/apple-icon-120x120.png | Bin .../img/favicon/apple-icon-144x144.png | Bin .../img/favicon/apple-icon-152x152.png | Bin .../img/favicon/apple-icon-180x180.png | Bin .../assets}/img/favicon/apple-icon-57x57.png | Bin .../assets}/img/favicon/apple-icon-60x60.png | Bin .../assets}/img/favicon/apple-icon-72x72.png | Bin .../assets}/img/favicon/apple-icon-76x76.png | Bin .../img/favicon/apple-icon-precomposed.png | Bin .../assets}/img/favicon/apple-icon.png | Bin .../assets}/img/favicon/browserconfig.xml | 0 .../assets}/img/favicon/favicon-16x16.png | Bin .../assets}/img/favicon/favicon-32x32.png | Bin .../assets}/img/favicon/favicon-96x96.png | Bin .../assets}/img/favicon/favicon.ico | Bin .../assets}/img/favicon/manifest.json | 0 .../assets}/img/favicon/ms-icon-144x144.png | Bin .../assets}/img/favicon/ms-icon-150x150.png | Bin .../assets}/img/favicon/ms-icon-310x310.png | Bin .../assets}/img/favicon/ms-icon-70x70.png | Bin {assets => front/assets}/img/logo-small.png | Bin {assets => front/assets}/img/logo-social.png | Bin {assets => front/assets}/img/logo-text.png | Bin {assets => front/assets}/img/logo.png | Bin {assets => front/assets}/img/logo.svg | 0 {assets => front/assets}/img/logo/center.svg | 0 {assets => front/assets}/img/logo/circle.svg | 0 {assets => front/assets}/img/logo/comment.svg | 0 {assets => front/assets}/img/logo/debug.svg | 0 {assets => front/assets}/img/logo/delete.svg | 0 {assets => front/assets}/img/logo/dollar.svg | 0 {assets => front/assets}/img/logo/edit.svg | 0 {assets => front/assets}/img/logo/hide.svg | 0 {assets => front/assets}/img/logo/info.svg | 0 {assets => front/assets}/img/logo/label.svg | 0 {assets => front/assets}/img/logo/photo.svg | 0 .../assets}/img/logo/precision.svg | 0 {assets => front/assets}/img/logo/star.svg | 0 .../assets}/img/marker/cluster-icon-blue.png | Bin .../assets}/img/marker/cluster-icon-green.png | Bin .../assets}/img/marker/cluster-icon-red.png | Bin .../assets}/img/marker/marker-icon-black.png | Bin .../assets}/img/marker/marker-icon-blue.png | Bin .../assets}/img/marker/marker-icon-gold.png | Bin .../assets}/img/marker/marker-icon-green.png | Bin .../assets}/img/marker/marker-icon-grey.png | Bin .../assets}/img/marker/marker-icon-orange.png | Bin .../assets}/img/marker/marker-icon-red.png | Bin .../assets}/img/marker/marker-icon-violet.png | Bin .../assets}/img/marker/marker-icon-yellow.png | Bin .../assets}/img/marker/marker-shadow.png | Bin .../img/marker/user-position-shadow.png | Bin .../assets}/img/marker/user-position.png | Bin {assets => front/assets}/nls/de.json | 0 {assets => front/assets}/nls/en.json | 0 {assets => front/assets}/nls/es.json | 0 {assets => front/assets}/nls/fr.json | 0 authindex.html => front/authindex.html | 0 .../doc}/beercrackerz/0.0.1/BeerCrackerz.html | 0 .../beercrackerz/0.0.1/BeerCrackerz.js.html | 0 .../doc}/beercrackerz/0.0.1/Utils.js.html | 0 .../0.0.1/fonts/OpenSans-Bold-webfont.eot | Bin .../0.0.1/fonts/OpenSans-Bold-webfont.svg | 0 .../0.0.1/fonts/OpenSans-Bold-webfont.woff | Bin .../fonts/OpenSans-BoldItalic-webfont.eot | Bin .../fonts/OpenSans-BoldItalic-webfont.svg | 0 .../fonts/OpenSans-BoldItalic-webfont.woff | Bin .../0.0.1/fonts/OpenSans-Italic-webfont.eot | Bin .../0.0.1/fonts/OpenSans-Italic-webfont.svg | 0 .../0.0.1/fonts/OpenSans-Italic-webfont.woff | Bin .../0.0.1/fonts/OpenSans-Light-webfont.eot | Bin .../0.0.1/fonts/OpenSans-Light-webfont.svg | 0 .../0.0.1/fonts/OpenSans-Light-webfont.woff | Bin .../fonts/OpenSans-LightItalic-webfont.eot | Bin .../fonts/OpenSans-LightItalic-webfont.svg | 0 .../fonts/OpenSans-LightItalic-webfont.woff | Bin .../0.0.1/fonts/OpenSans-Regular-webfont.eot | Bin .../0.0.1/fonts/OpenSans-Regular-webfont.svg | 0 .../0.0.1/fonts/OpenSans-Regular-webfont.woff | Bin .../doc}/beercrackerz/0.0.1/global.html | 0 .../doc}/beercrackerz/0.0.1/index.html | 0 .../doc}/beercrackerz/0.0.1/js_Utils.js.html | 0 .../beercrackerz/0.0.1/js_utils_Utils.js.html | 0 .../0.0.1/module-BeerCrackerz.html | 0 .../beercrackerz/0.0.1/scripts/linenumber.js | 0 .../scripts/prettify/Apache-License-2.0.txt | 0 .../0.0.1/scripts/prettify/lang-css.js | 0 .../0.0.1/scripts/prettify/prettify.js | 0 .../0.0.1/styles/jsdoc-default.css | 0 .../0.0.1/styles/prettify-jsdoc.css | 0 .../0.0.1/styles/prettify-tomorrow.css | 0 {doc => front/doc}/jsDoc.json | 0 index.html => front/index.html | 0 login.html => front/login.html | 0 package-lock.json => front/package-lock.json | 0 package.json => front/package.json | 0 register.html => front/register.html | 0 {src => front/src}/BeerCrackerz.js | 0 {src => front/src}/BeerCrackerz.scss | 0 {src => front/src}/BeerCrackerzAuth.js | 0 {src => front/src}/BeerCrackerzAuth.scss | 0 {src => front/src}/js/MapHelper.js | 0 {src => front/src}/js/ui/Notification.js | 0 {src => front/src}/js/ui/Rating.js | 0 {src => front/src}/js/ui/ZoomSlider.js | 0 {src => front/src}/js/utils/LangManager.js | 0 {src => front/src}/js/utils/MarkerEnum.js | 0 {src => front/src}/js/utils/ProviderEnum.js | 0 {src => front/src}/js/utils/Utils.js | 0 {src => front/src}/scss/_base.scss | 0 {src => front/src}/scss/_keyframes.scss | 0 {src => front/src}/scss/_responsive.scss | 0 {webpack => front/webpack}/.eslintrc | 0 {webpack => front/webpack}/loaders.js | 0 {webpack => front/webpack}/plugins.js | 0 {webpack => front/webpack}/postcss.config.js | 0 .../webpack}/stylelint.config.js | 0 {webpack => front/webpack}/webpack.common.js | 0 {webpack => front/webpack}/webpack.dev.js | 0 {webpack => front/webpack}/webpack.prod.js | 0 146 files changed, 308 insertions(+), 2 deletions(-) delete mode 100644 assets/dist/BeerCrackerz.bundle.js delete mode 100644 assets/dist/BeerCrackerzAuth.bundle.js rename {assets => front/assets}/dist/BeerCrackerz.bundle.css (95%) create mode 100644 front/assets/dist/BeerCrackerz.bundle.js rename {assets => front/assets}/dist/BeerCrackerzAuth.bundle.css (87%) create mode 100644 front/assets/dist/BeerCrackerzAuth.bundle.js rename {assets => front/assets}/html/modal/deletemark.html (100%) rename {assets => front/assets}/html/modal/editbar.html (100%) rename {assets => front/assets}/html/modal/editspot.html (100%) rename {assets => front/assets}/html/modal/editstore.html (100%) rename {assets => front/assets}/html/modal/hideshow.html (100%) rename {assets => front/assets}/html/modal/newbar.html (100%) rename {assets => front/assets}/html/modal/newspot.html (100%) rename {assets => front/assets}/html/modal/newstore.html (100%) rename {assets => front/assets}/html/modal/user.html (100%) rename {assets => front/assets}/html/popup/bar.html (100%) rename {assets => front/assets}/html/popup/spot.html (100%) rename {assets => front/assets}/html/popup/store.html (100%) rename {assets => front/assets}/img/favicon/android-icon-144x144.png (100%) rename {assets => front/assets}/img/favicon/android-icon-192x192.png (100%) rename {assets => front/assets}/img/favicon/android-icon-36x36.png (100%) rename {assets => front/assets}/img/favicon/android-icon-48x48.png (100%) rename {assets => front/assets}/img/favicon/android-icon-72x72.png (100%) rename {assets => front/assets}/img/favicon/android-icon-96x96.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-114x114.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-120x120.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-144x144.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-152x152.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-180x180.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-57x57.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-60x60.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-72x72.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-76x76.png (100%) rename {assets => front/assets}/img/favicon/apple-icon-precomposed.png (100%) rename {assets => front/assets}/img/favicon/apple-icon.png (100%) rename {assets => front/assets}/img/favicon/browserconfig.xml (100%) rename {assets => front/assets}/img/favicon/favicon-16x16.png (100%) rename {assets => front/assets}/img/favicon/favicon-32x32.png (100%) rename {assets => front/assets}/img/favicon/favicon-96x96.png (100%) rename {assets => front/assets}/img/favicon/favicon.ico (100%) rename {assets => front/assets}/img/favicon/manifest.json (100%) rename {assets => front/assets}/img/favicon/ms-icon-144x144.png (100%) rename {assets => front/assets}/img/favicon/ms-icon-150x150.png (100%) rename {assets => front/assets}/img/favicon/ms-icon-310x310.png (100%) rename {assets => front/assets}/img/favicon/ms-icon-70x70.png (100%) rename {assets => front/assets}/img/logo-small.png (100%) rename {assets => front/assets}/img/logo-social.png (100%) rename {assets => front/assets}/img/logo-text.png (100%) rename {assets => front/assets}/img/logo.png (100%) rename {assets => front/assets}/img/logo.svg (100%) rename {assets => front/assets}/img/logo/center.svg (100%) rename {assets => front/assets}/img/logo/circle.svg (100%) rename {assets => front/assets}/img/logo/comment.svg (100%) rename {assets => front/assets}/img/logo/debug.svg (100%) rename {assets => front/assets}/img/logo/delete.svg (100%) rename {assets => front/assets}/img/logo/dollar.svg (100%) rename {assets => front/assets}/img/logo/edit.svg (100%) rename {assets => front/assets}/img/logo/hide.svg (100%) rename {assets => front/assets}/img/logo/info.svg (100%) rename {assets => front/assets}/img/logo/label.svg (100%) rename {assets => front/assets}/img/logo/photo.svg (100%) rename {assets => front/assets}/img/logo/precision.svg (100%) rename {assets => front/assets}/img/logo/star.svg (100%) rename {assets => front/assets}/img/marker/cluster-icon-blue.png (100%) rename {assets => front/assets}/img/marker/cluster-icon-green.png (100%) rename {assets => front/assets}/img/marker/cluster-icon-red.png (100%) rename {assets => front/assets}/img/marker/marker-icon-black.png (100%) rename {assets => front/assets}/img/marker/marker-icon-blue.png (100%) rename {assets => front/assets}/img/marker/marker-icon-gold.png (100%) rename {assets => front/assets}/img/marker/marker-icon-green.png (100%) rename {assets => front/assets}/img/marker/marker-icon-grey.png (100%) rename {assets => front/assets}/img/marker/marker-icon-orange.png (100%) rename {assets => front/assets}/img/marker/marker-icon-red.png (100%) rename {assets => front/assets}/img/marker/marker-icon-violet.png (100%) rename {assets => front/assets}/img/marker/marker-icon-yellow.png (100%) rename {assets => front/assets}/img/marker/marker-shadow.png (100%) rename {assets => front/assets}/img/marker/user-position-shadow.png (100%) rename {assets => front/assets}/img/marker/user-position.png (100%) rename {assets => front/assets}/nls/de.json (100%) rename {assets => front/assets}/nls/en.json (100%) rename {assets => front/assets}/nls/es.json (100%) rename {assets => front/assets}/nls/fr.json (100%) rename authindex.html => front/authindex.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/BeerCrackerz.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/BeerCrackerz.js.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/Utils.js.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.eot (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.svg (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.eot (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.svg (100%) rename {doc => front/doc}/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff (100%) rename {doc => front/doc}/beercrackerz/0.0.1/global.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/index.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/js_Utils.js.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/js_utils_Utils.js.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/module-BeerCrackerz.html (100%) rename {doc => front/doc}/beercrackerz/0.0.1/scripts/linenumber.js (100%) rename {doc => front/doc}/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt (100%) rename {doc => front/doc}/beercrackerz/0.0.1/scripts/prettify/lang-css.js (100%) rename {doc => front/doc}/beercrackerz/0.0.1/scripts/prettify/prettify.js (100%) rename {doc => front/doc}/beercrackerz/0.0.1/styles/jsdoc-default.css (100%) rename {doc => front/doc}/beercrackerz/0.0.1/styles/prettify-jsdoc.css (100%) rename {doc => front/doc}/beercrackerz/0.0.1/styles/prettify-tomorrow.css (100%) rename {doc => front/doc}/jsDoc.json (100%) rename index.html => front/index.html (100%) rename login.html => front/login.html (100%) rename package-lock.json => front/package-lock.json (100%) rename package.json => front/package.json (100%) rename register.html => front/register.html (100%) rename {src => front/src}/BeerCrackerz.js (100%) rename {src => front/src}/BeerCrackerz.scss (100%) rename {src => front/src}/BeerCrackerzAuth.js (100%) rename {src => front/src}/BeerCrackerzAuth.scss (100%) rename {src => front/src}/js/MapHelper.js (100%) rename {src => front/src}/js/ui/Notification.js (100%) rename {src => front/src}/js/ui/Rating.js (100%) rename {src => front/src}/js/ui/ZoomSlider.js (100%) rename {src => front/src}/js/utils/LangManager.js (100%) rename {src => front/src}/js/utils/MarkerEnum.js (100%) rename {src => front/src}/js/utils/ProviderEnum.js (100%) rename {src => front/src}/js/utils/Utils.js (100%) rename {src => front/src}/scss/_base.scss (100%) rename {src => front/src}/scss/_keyframes.scss (100%) rename {src => front/src}/scss/_responsive.scss (100%) rename {webpack => front/webpack}/.eslintrc (100%) rename {webpack => front/webpack}/loaders.js (100%) rename {webpack => front/webpack}/plugins.js (100%) rename {webpack => front/webpack}/postcss.config.js (100%) rename {webpack => front/webpack}/stylelint.config.js (100%) rename {webpack => front/webpack}/webpack.common.js (100%) rename {webpack => front/webpack}/webpack.dev.js (100%) rename {webpack => front/webpack}/webpack.prod.js (100%) diff --git a/.gitignore b/.gitignore index 3c3629e..68134fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,9 @@ node_modules +.idea +.DS_Store + +# Byte-compiled / optimized / DLL files + __pycache__/ + *.pyc + *.py[cod] + *$py.class \ No newline at end of file diff --git a/assets/dist/BeerCrackerz.bundle.js b/assets/dist/BeerCrackerz.bundle.js deleted file mode 100644 index 3618cfd..0000000 --- a/assets/dist/BeerCrackerz.bundle.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return w}});var r=Object.freeze({blue:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-blue.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),gold:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-gold.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),red:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-red.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),green:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-green.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),orange:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-orange.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),yellow:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-yellow.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),violet:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-violet.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),grey:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-grey.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),black:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-black.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),user:new window.L.Icon({iconUrl:"assets/img/marker/user-position.png",shadowUrl:"assets/img/marker/user-position-shadow.png",iconSize:[32,32],iconAnchor:[16,16],popupAnchor:[1,-34],shadowSize:[32,32]})});function n(e,t){for(var r=0;r : -"),n.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),o.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(r),t.appendChild(n),t.appendChild(a),t.appendChild(o),t.appendChild(i),t.appendChild(c),t.appendChild(s),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,r,n){if(!0===window.DEBUG){var a=window.BeerCrackerz,o=a.nls.debug.bind(a.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(o("lat")," : ").concat(r.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(o("lng")," : ").concat(r.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(o("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(o("accuracy")," : ").concat(e.precisionRound(r.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(o("highAccuracy")," : ").concat(!0===n.enableHighAccuracy?o("enabled"):o("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(o("posAge")," : ").concat(n.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(o("posTimeout")," : ").concat(n.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(o("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(o("marks")," : ").concat(c,"\n ")}}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&o(t.prototype,null),r&&o(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function c(e,t){for(var r=0;ri.CIRCLE_RADIUS&&console.log("Too far"),o!==t.user.username?a.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),r(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var r=0;rOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var r=0;r".concat(e.nls.map("planLayerOSM"),"

")]=r,a["

".concat(e.nls.map("satLayerEsri"),"

")]=n,i.getPreference("map-plan-layer"))switch(i.getPreference("map-plan-layer")){case e.nls.map("planLayerOSM"):r.addTo(e._map);break;case e.nls.map("satLayerEsri"):n.addTo(e._map);break;default:r.addTo(e._map)}else r.addTo(e._map);window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){document.getElementById("user-profile").addEventListener("click",e.userProfileModal.bind(e)),document.getElementById("hide-show").addEventListener("click",e.hidShowModal.bind(e)),document.getElementById("center-on").addEventListener("click",e.toggleFocusLock.bind(e)),document.getElementById("overlay").addEventListener("click",e.closeModal.bind(e)),e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0))),e.updateDebugUI()})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var r={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);for(var n=function(t){e.markPopupFactory(t).then((function(r){t.dom=r,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))},a=JSON.parse(i.getPreference("saved-spot"))||[],o=0;o=i.CIRCLE_RADIUS&&t[r].circle.visible&&(t[r].circle.visible=!1,t[r].circle.setStyle({opacity:0,fillOpacity:0}))}};"true"===i.getPreference("poi-show-circle")&&(t(this._marks.spot),t(this._marks.store),t(this._marks.bar),t([this._user]))}},{key:"formatSavedMarker",value:function(e){return{type:e.type,lat:e.lat,lng:e.lng,name:e.name,description:e.description,user:e.username||this.user.username,userId:e.userId||this.user.id,dom:null,rate:e.rate,marker:null,circle:null}}},{key:"editMarker",value:function(e){this._map.closePopup(),this.editMarkModal(e)}},{key:"deleteMarker",value:function(e){var t=this;this.deleteMarkModal((function(r){if(!0===r){for(var n=t._marks[e.type],a=0;a : -"),r.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),i.innerHTML="".concat(e("accuracy")," : -"),o.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),u.innerHTML="".concat(e("zoom")," : -"),l.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),n.appendChild(t),n.appendChild(r),n.appendChild(a),n.appendChild(i),n.appendChild(o),n.appendChild(c),n.appendChild(s),n.appendChild(u),n.appendChild(l),n.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),n}},{key:"updateDebugInterface",value:function(n,t,r){if(!0===window.DEBUG){var a=window.BeerCrackerz,i=a.nls.debug.bind(a.nls),o=parseInt(n.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;n.querySelector(".debug-user-lat").innerHTML="\n ".concat(i("lat")," : ").concat(t.lat,"\n "),n.querySelector(".debug-user-lng").innerHTML="\n ".concat(i("lng")," : ").concat(t.lng,"\n "),n.querySelector(".debug-updates-amount").innerHTML="\n ".concat(i("updates")," : ").concat(o,"\n "),n.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(i("accuracy")," : ").concat(e.precisionRound(t.accuracy,2),"m\n "),n.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(i("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?i("enabled"):i("disabled"),"\n "),n.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(i("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),n.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(i("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),n.querySelector(".debug-zoom-level").innerHTML="\n ".concat(i("zoom")," : ").concat(a.map.getZoom(),"\n "),n.querySelector(".debug-marks-amount").innerHTML="\n ".concat(i("marks")," : ").concat(c,"\n ")}}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,n){localStorage.setItem(e,n)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&t(n.prototype,null),r&&t(n,r),Object.defineProperty(n,"prototype",{writable:!1}),e}();function a(e,n){for(var t=0;t { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/BeerCrackerz.js": +/*!*****************************!*\ + !*** ./src/BeerCrackerz.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
\n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Boolean}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
\n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server\n _this2._user.id = 42;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-store', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

\".concat(_this5.nls.map('planLayerOSM'), \"

\")] = osm; //baseMaps[`

${this.nls.map('planLayerGeo')}

`] = plan; \n\n baseMaps[\"

\".concat(_this5.nls.map('satLayerEsri'), \"

\")] = esri; //baseMaps[`

${this.nls.map('satLayerGeo')}

`] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.store, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.store, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.store, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.store, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this7._map.addLayer(_this7._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')) || [];\n\n for (var i = 0; i < marks.length; ++i) {\n iterateMarkers(marks[i]);\n }\n\n marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-store')) || [];\n\n for (var _i = 0; _i < marks.length; ++_i) {\n iterateMarkers(marks[_i]);\n }\n\n marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-bar')) || [];\n\n for (var _i2 = 0; _i2 < marks.length; ++_i2) {\n iterateMarkers(marks[_i2]);\n }\n\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
\n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/stores/bars marks. This label is basically the\n * mark name given by its creator.\n *
\n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.store, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/stores/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
\n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.store, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/stores/bars must be given as an argument\n *
\n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
\n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
\n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate(\"assets/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(submit, \"{{\".concat(options.type.toUpperCase(), \"_SUBMIT}}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(cancel, \"{{\".concat(options.type.toUpperCase(), \"_CANCEL}}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i3 = 0; _i3 < _this8._marks[options.type].length; ++_i3) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i3]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
\n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{{MODAL_DESC}}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{{MODAL_CANCEL}}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{{MODAL_DELETE}}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
\n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{{ACCURACY_USER_MODAL}}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{{DEBUG_USER_MODAL}}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{{BEERCRACKERZ_DESC}}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/stores/bars\n *
\n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{{MODAL_TITLE}}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{{LABELS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{{CIRCLES_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{{SPOTS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-stores\"), \"{{STORES_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowStores'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{{BARS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{{MODAL_CLOSE}}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === 'true') {\n document.getElementById('show-stores').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-stores').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'store'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
\n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
\n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
\n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"saved-\".concat(options.type))) || [];\n marks.push(this.formatSavedMarker(options));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(marks));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/stores/bars) and for the user marker\n *
\n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.store);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
\n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n type: mark.type,\n lat: mark.lat,\n lng: mark.lng,\n name: mark.name,\n description: mark.description,\n user: mark.username || this.user.username,\n userId: mark.userId || this.user.id,\n dom: null,\n rate: mark.rate,\n marker: null,\n circle: null\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * This method will open a mark edition modal\n *
\n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * This method will delete a mark after prompting the user if he trully wants to\n *
\n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i4 = 0; _i4 < _this13._marks[options.type].length; ++_i4) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i4]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The addDebugUI() method appends the debug DOM element to the document body\n *
\n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The removeDebugUI() method remove the debug DOM element from the document body\n *
\n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The updateDebugUI() method will update informations held in the debug DOM\n *
\n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
\n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
\n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); + +/***/ }), + +/***/ "./src/js/MapHelper.js": +/*!*****************************!*\ + !*** ./src/js/MapHelper.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"assets/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"assets/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); + +/***/ }), + +/***/ "./src/js/ui/Notification.js": +/*!***********************************!*\ + !*** ./src/js/ui/Notification.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); + +/***/ }), + +/***/ "./src/js/ui/Rating.js": +/*!*****************************!*\ + !*** ./src/js/ui/Rating.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); + +/***/ }), + +/***/ "./src/js/ui/ZoomSlider.js": +/*!*********************************!*\ + !*** ./src/js/ui/ZoomSlider.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); + +/***/ }), + +/***/ "./src/js/utils/LangManager.js": +/*!*************************************!*\ + !*** ./src/js/utils/LangManager.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"assets/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); + +/***/ }), + +/***/ "./src/js/utils/MarkerEnum.js": +/*!************************************!*\ + !*** ./src/js/utils/MarkerEnum.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-blue.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-gold.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-red.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-green.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-orange.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-yellow.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-violet.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-grey.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-black.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: 'assets/img/marker/user-position.png',\n shadowUrl: 'assets/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/ProviderEnum.js": +/*!**************************************!*\ + !*** ./src/js/utils/ProviderEnum.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/Utils.js": +/*!*******************************!*\ + !*** ./src/js/utils/Utils.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default'\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); + +/***/ }), + +/***/ "./src/BeerCrackerz.scss": +/*!*******************************!*\ + !*** ./src/BeerCrackerz.scss ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.scss?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerz.js"); +/******/ window.BeerCrackerz = __webpack_exports__["default"]; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/assets/dist/BeerCrackerzAuth.bundle.css b/front/assets/dist/BeerCrackerzAuth.bundle.css similarity index 87% rename from assets/dist/BeerCrackerzAuth.bundle.css rename to front/assets/dist/BeerCrackerzAuth.bundle.css index e1a088f..1c16b47 100644 --- a/assets/dist/BeerCrackerzAuth.bundle.css +++ b/front/assets/dist/BeerCrackerzAuth.bundle.css @@ -1 +1,4 @@ +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerzAuth.scss ***! + \**********************************************************************************************************************************************************************************************************************/ @-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}body{background:#fff;position:relative}aside,body{height:100%;width:100%}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:grey;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;justify-content:space-between;max-width:40rem;position:absolute;right:0;text-align:center}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside main{margin:0 4rem;text-align:left}aside main button{margin:2.9rem auto 1.2rem}aside main p{text-align:right}aside main .login-error{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s}aside main .login-error.visible{color:#ff5454}aside footer{margin-bottom:5rem} diff --git a/front/assets/dist/BeerCrackerzAuth.bundle.js b/front/assets/dist/BeerCrackerzAuth.bundle.js new file mode 100644 index 0000000..1bb8466 --- /dev/null +++ b/front/assets/dist/BeerCrackerzAuth.bundle.js @@ -0,0 +1,117 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/BeerCrackerzAuth.js": +/*!*********************************!*\ + !*** ./src/BeerCrackerzAuth.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n\n var _init = function _init() {};\n\n if (document.body.className.includes('login')) {\n _init = this._handleLogin.bind(this);\n } else if (document.body.className.includes('register')) {\n _init = this._handleRegister.bind(this);\n } // The BeerCrackerz app is only initialized once nls are set up\n\n\n this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](window.navigator.language.substring(0, 2), _init.bind(this));\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_handleLogin\",\n value: function _handleLogin() {\n var _this = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_SUBTITLE}}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_HIDDEN_ERROR}}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_USERNAME_LABEL}}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_USERNAME_PASSWORD}}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_BUTTON}}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_NOT_REGISTERED}}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_REGISTER}}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('serverError');\n });\n }\n }, false);\n }\n }, {\n key: \"_handleRegister\",\n value: function _handleRegister() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_SUBTITLE}}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_HIDDEN_ERROR}}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_LABEL}}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_1}}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_2}}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_BUTTON}}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_ALREADY_DONE}}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_LOGIN}}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('serverError');\n });\n }\n }, false);\n }\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); + +/***/ }), + +/***/ "./src/js/utils/LangManager.js": +/*!*************************************!*\ + !*** ./src/js/utils/LangManager.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"assets/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); + +/***/ }), + +/***/ "./src/js/utils/Utils.js": +/*!*******************************!*\ + !*** ./src/js/utils/Utils.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default'\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); + +/***/ }), + +/***/ "./src/BeerCrackerzAuth.scss": +/*!***********************************!*\ + !*** ./src/BeerCrackerzAuth.scss ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.scss?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerzAuth.js"); +/******/ window.BeerCrackerz = __webpack_exports__["default"]; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/assets/html/modal/deletemark.html b/front/assets/html/modal/deletemark.html similarity index 100% rename from assets/html/modal/deletemark.html rename to front/assets/html/modal/deletemark.html diff --git a/assets/html/modal/editbar.html b/front/assets/html/modal/editbar.html similarity index 100% rename from assets/html/modal/editbar.html rename to front/assets/html/modal/editbar.html diff --git a/assets/html/modal/editspot.html b/front/assets/html/modal/editspot.html similarity index 100% rename from assets/html/modal/editspot.html rename to front/assets/html/modal/editspot.html diff --git a/assets/html/modal/editstore.html b/front/assets/html/modal/editstore.html similarity index 100% rename from assets/html/modal/editstore.html rename to front/assets/html/modal/editstore.html diff --git a/assets/html/modal/hideshow.html b/front/assets/html/modal/hideshow.html similarity index 100% rename from assets/html/modal/hideshow.html rename to front/assets/html/modal/hideshow.html diff --git a/assets/html/modal/newbar.html b/front/assets/html/modal/newbar.html similarity index 100% rename from assets/html/modal/newbar.html rename to front/assets/html/modal/newbar.html diff --git a/assets/html/modal/newspot.html b/front/assets/html/modal/newspot.html similarity index 100% rename from assets/html/modal/newspot.html rename to front/assets/html/modal/newspot.html diff --git a/assets/html/modal/newstore.html b/front/assets/html/modal/newstore.html similarity index 100% rename from assets/html/modal/newstore.html rename to front/assets/html/modal/newstore.html diff --git a/assets/html/modal/user.html b/front/assets/html/modal/user.html similarity index 100% rename from assets/html/modal/user.html rename to front/assets/html/modal/user.html diff --git a/assets/html/popup/bar.html b/front/assets/html/popup/bar.html similarity index 100% rename from assets/html/popup/bar.html rename to front/assets/html/popup/bar.html diff --git a/assets/html/popup/spot.html b/front/assets/html/popup/spot.html similarity index 100% rename from assets/html/popup/spot.html rename to front/assets/html/popup/spot.html diff --git a/assets/html/popup/store.html b/front/assets/html/popup/store.html similarity index 100% rename from assets/html/popup/store.html rename to front/assets/html/popup/store.html diff --git a/assets/img/favicon/android-icon-144x144.png b/front/assets/img/favicon/android-icon-144x144.png similarity index 100% rename from assets/img/favicon/android-icon-144x144.png rename to front/assets/img/favicon/android-icon-144x144.png diff --git a/assets/img/favicon/android-icon-192x192.png b/front/assets/img/favicon/android-icon-192x192.png similarity index 100% rename from assets/img/favicon/android-icon-192x192.png rename to front/assets/img/favicon/android-icon-192x192.png diff --git a/assets/img/favicon/android-icon-36x36.png b/front/assets/img/favicon/android-icon-36x36.png similarity index 100% rename from assets/img/favicon/android-icon-36x36.png rename to front/assets/img/favicon/android-icon-36x36.png diff --git a/assets/img/favicon/android-icon-48x48.png b/front/assets/img/favicon/android-icon-48x48.png similarity index 100% rename from assets/img/favicon/android-icon-48x48.png rename to front/assets/img/favicon/android-icon-48x48.png diff --git a/assets/img/favicon/android-icon-72x72.png b/front/assets/img/favicon/android-icon-72x72.png similarity index 100% rename from assets/img/favicon/android-icon-72x72.png rename to front/assets/img/favicon/android-icon-72x72.png diff --git a/assets/img/favicon/android-icon-96x96.png b/front/assets/img/favicon/android-icon-96x96.png similarity index 100% rename from assets/img/favicon/android-icon-96x96.png rename to front/assets/img/favicon/android-icon-96x96.png diff --git a/assets/img/favicon/apple-icon-114x114.png b/front/assets/img/favicon/apple-icon-114x114.png similarity index 100% rename from assets/img/favicon/apple-icon-114x114.png rename to front/assets/img/favicon/apple-icon-114x114.png diff --git a/assets/img/favicon/apple-icon-120x120.png b/front/assets/img/favicon/apple-icon-120x120.png similarity index 100% rename from assets/img/favicon/apple-icon-120x120.png rename to front/assets/img/favicon/apple-icon-120x120.png diff --git a/assets/img/favicon/apple-icon-144x144.png b/front/assets/img/favicon/apple-icon-144x144.png similarity index 100% rename from assets/img/favicon/apple-icon-144x144.png rename to front/assets/img/favicon/apple-icon-144x144.png diff --git a/assets/img/favicon/apple-icon-152x152.png b/front/assets/img/favicon/apple-icon-152x152.png similarity index 100% rename from assets/img/favicon/apple-icon-152x152.png rename to front/assets/img/favicon/apple-icon-152x152.png diff --git a/assets/img/favicon/apple-icon-180x180.png b/front/assets/img/favicon/apple-icon-180x180.png similarity index 100% rename from assets/img/favicon/apple-icon-180x180.png rename to front/assets/img/favicon/apple-icon-180x180.png diff --git a/assets/img/favicon/apple-icon-57x57.png b/front/assets/img/favicon/apple-icon-57x57.png similarity index 100% rename from assets/img/favicon/apple-icon-57x57.png rename to front/assets/img/favicon/apple-icon-57x57.png diff --git a/assets/img/favicon/apple-icon-60x60.png b/front/assets/img/favicon/apple-icon-60x60.png similarity index 100% rename from assets/img/favicon/apple-icon-60x60.png rename to front/assets/img/favicon/apple-icon-60x60.png diff --git a/assets/img/favicon/apple-icon-72x72.png b/front/assets/img/favicon/apple-icon-72x72.png similarity index 100% rename from assets/img/favicon/apple-icon-72x72.png rename to front/assets/img/favicon/apple-icon-72x72.png diff --git a/assets/img/favicon/apple-icon-76x76.png b/front/assets/img/favicon/apple-icon-76x76.png similarity index 100% rename from assets/img/favicon/apple-icon-76x76.png rename to front/assets/img/favicon/apple-icon-76x76.png diff --git a/assets/img/favicon/apple-icon-precomposed.png b/front/assets/img/favicon/apple-icon-precomposed.png similarity index 100% rename from assets/img/favicon/apple-icon-precomposed.png rename to front/assets/img/favicon/apple-icon-precomposed.png diff --git a/assets/img/favicon/apple-icon.png b/front/assets/img/favicon/apple-icon.png similarity index 100% rename from assets/img/favicon/apple-icon.png rename to front/assets/img/favicon/apple-icon.png diff --git a/assets/img/favicon/browserconfig.xml b/front/assets/img/favicon/browserconfig.xml similarity index 100% rename from assets/img/favicon/browserconfig.xml rename to front/assets/img/favicon/browserconfig.xml diff --git a/assets/img/favicon/favicon-16x16.png b/front/assets/img/favicon/favicon-16x16.png similarity index 100% rename from assets/img/favicon/favicon-16x16.png rename to front/assets/img/favicon/favicon-16x16.png diff --git a/assets/img/favicon/favicon-32x32.png b/front/assets/img/favicon/favicon-32x32.png similarity index 100% rename from assets/img/favicon/favicon-32x32.png rename to front/assets/img/favicon/favicon-32x32.png diff --git a/assets/img/favicon/favicon-96x96.png b/front/assets/img/favicon/favicon-96x96.png similarity index 100% rename from assets/img/favicon/favicon-96x96.png rename to front/assets/img/favicon/favicon-96x96.png diff --git a/assets/img/favicon/favicon.ico b/front/assets/img/favicon/favicon.ico similarity index 100% rename from assets/img/favicon/favicon.ico rename to front/assets/img/favicon/favicon.ico diff --git a/assets/img/favicon/manifest.json b/front/assets/img/favicon/manifest.json similarity index 100% rename from assets/img/favicon/manifest.json rename to front/assets/img/favicon/manifest.json diff --git a/assets/img/favicon/ms-icon-144x144.png b/front/assets/img/favicon/ms-icon-144x144.png similarity index 100% rename from assets/img/favicon/ms-icon-144x144.png rename to front/assets/img/favicon/ms-icon-144x144.png diff --git a/assets/img/favicon/ms-icon-150x150.png b/front/assets/img/favicon/ms-icon-150x150.png similarity index 100% rename from assets/img/favicon/ms-icon-150x150.png rename to front/assets/img/favicon/ms-icon-150x150.png diff --git a/assets/img/favicon/ms-icon-310x310.png b/front/assets/img/favicon/ms-icon-310x310.png similarity index 100% rename from assets/img/favicon/ms-icon-310x310.png rename to front/assets/img/favicon/ms-icon-310x310.png diff --git a/assets/img/favicon/ms-icon-70x70.png b/front/assets/img/favicon/ms-icon-70x70.png similarity index 100% rename from assets/img/favicon/ms-icon-70x70.png rename to front/assets/img/favicon/ms-icon-70x70.png diff --git a/assets/img/logo-small.png b/front/assets/img/logo-small.png similarity index 100% rename from assets/img/logo-small.png rename to front/assets/img/logo-small.png diff --git a/assets/img/logo-social.png b/front/assets/img/logo-social.png similarity index 100% rename from assets/img/logo-social.png rename to front/assets/img/logo-social.png diff --git a/assets/img/logo-text.png b/front/assets/img/logo-text.png similarity index 100% rename from assets/img/logo-text.png rename to front/assets/img/logo-text.png diff --git a/assets/img/logo.png b/front/assets/img/logo.png similarity index 100% rename from assets/img/logo.png rename to front/assets/img/logo.png diff --git a/assets/img/logo.svg b/front/assets/img/logo.svg similarity index 100% rename from assets/img/logo.svg rename to front/assets/img/logo.svg diff --git a/assets/img/logo/center.svg b/front/assets/img/logo/center.svg similarity index 100% rename from assets/img/logo/center.svg rename to front/assets/img/logo/center.svg diff --git a/assets/img/logo/circle.svg b/front/assets/img/logo/circle.svg similarity index 100% rename from assets/img/logo/circle.svg rename to front/assets/img/logo/circle.svg diff --git a/assets/img/logo/comment.svg b/front/assets/img/logo/comment.svg similarity index 100% rename from assets/img/logo/comment.svg rename to front/assets/img/logo/comment.svg diff --git a/assets/img/logo/debug.svg b/front/assets/img/logo/debug.svg similarity index 100% rename from assets/img/logo/debug.svg rename to front/assets/img/logo/debug.svg diff --git a/assets/img/logo/delete.svg b/front/assets/img/logo/delete.svg similarity index 100% rename from assets/img/logo/delete.svg rename to front/assets/img/logo/delete.svg diff --git a/assets/img/logo/dollar.svg b/front/assets/img/logo/dollar.svg similarity index 100% rename from assets/img/logo/dollar.svg rename to front/assets/img/logo/dollar.svg diff --git a/assets/img/logo/edit.svg b/front/assets/img/logo/edit.svg similarity index 100% rename from assets/img/logo/edit.svg rename to front/assets/img/logo/edit.svg diff --git a/assets/img/logo/hide.svg b/front/assets/img/logo/hide.svg similarity index 100% rename from assets/img/logo/hide.svg rename to front/assets/img/logo/hide.svg diff --git a/assets/img/logo/info.svg b/front/assets/img/logo/info.svg similarity index 100% rename from assets/img/logo/info.svg rename to front/assets/img/logo/info.svg diff --git a/assets/img/logo/label.svg b/front/assets/img/logo/label.svg similarity index 100% rename from assets/img/logo/label.svg rename to front/assets/img/logo/label.svg diff --git a/assets/img/logo/photo.svg b/front/assets/img/logo/photo.svg similarity index 100% rename from assets/img/logo/photo.svg rename to front/assets/img/logo/photo.svg diff --git a/assets/img/logo/precision.svg b/front/assets/img/logo/precision.svg similarity index 100% rename from assets/img/logo/precision.svg rename to front/assets/img/logo/precision.svg diff --git a/assets/img/logo/star.svg b/front/assets/img/logo/star.svg similarity index 100% rename from assets/img/logo/star.svg rename to front/assets/img/logo/star.svg diff --git a/assets/img/marker/cluster-icon-blue.png b/front/assets/img/marker/cluster-icon-blue.png similarity index 100% rename from assets/img/marker/cluster-icon-blue.png rename to front/assets/img/marker/cluster-icon-blue.png diff --git a/assets/img/marker/cluster-icon-green.png b/front/assets/img/marker/cluster-icon-green.png similarity index 100% rename from assets/img/marker/cluster-icon-green.png rename to front/assets/img/marker/cluster-icon-green.png diff --git a/assets/img/marker/cluster-icon-red.png b/front/assets/img/marker/cluster-icon-red.png similarity index 100% rename from assets/img/marker/cluster-icon-red.png rename to front/assets/img/marker/cluster-icon-red.png diff --git a/assets/img/marker/marker-icon-black.png b/front/assets/img/marker/marker-icon-black.png similarity index 100% rename from assets/img/marker/marker-icon-black.png rename to front/assets/img/marker/marker-icon-black.png diff --git a/assets/img/marker/marker-icon-blue.png b/front/assets/img/marker/marker-icon-blue.png similarity index 100% rename from assets/img/marker/marker-icon-blue.png rename to front/assets/img/marker/marker-icon-blue.png diff --git a/assets/img/marker/marker-icon-gold.png b/front/assets/img/marker/marker-icon-gold.png similarity index 100% rename from assets/img/marker/marker-icon-gold.png rename to front/assets/img/marker/marker-icon-gold.png diff --git a/assets/img/marker/marker-icon-green.png b/front/assets/img/marker/marker-icon-green.png similarity index 100% rename from assets/img/marker/marker-icon-green.png rename to front/assets/img/marker/marker-icon-green.png diff --git a/assets/img/marker/marker-icon-grey.png b/front/assets/img/marker/marker-icon-grey.png similarity index 100% rename from assets/img/marker/marker-icon-grey.png rename to front/assets/img/marker/marker-icon-grey.png diff --git a/assets/img/marker/marker-icon-orange.png b/front/assets/img/marker/marker-icon-orange.png similarity index 100% rename from assets/img/marker/marker-icon-orange.png rename to front/assets/img/marker/marker-icon-orange.png diff --git a/assets/img/marker/marker-icon-red.png b/front/assets/img/marker/marker-icon-red.png similarity index 100% rename from assets/img/marker/marker-icon-red.png rename to front/assets/img/marker/marker-icon-red.png diff --git a/assets/img/marker/marker-icon-violet.png b/front/assets/img/marker/marker-icon-violet.png similarity index 100% rename from assets/img/marker/marker-icon-violet.png rename to front/assets/img/marker/marker-icon-violet.png diff --git a/assets/img/marker/marker-icon-yellow.png b/front/assets/img/marker/marker-icon-yellow.png similarity index 100% rename from assets/img/marker/marker-icon-yellow.png rename to front/assets/img/marker/marker-icon-yellow.png diff --git a/assets/img/marker/marker-shadow.png b/front/assets/img/marker/marker-shadow.png similarity index 100% rename from assets/img/marker/marker-shadow.png rename to front/assets/img/marker/marker-shadow.png diff --git a/assets/img/marker/user-position-shadow.png b/front/assets/img/marker/user-position-shadow.png similarity index 100% rename from assets/img/marker/user-position-shadow.png rename to front/assets/img/marker/user-position-shadow.png diff --git a/assets/img/marker/user-position.png b/front/assets/img/marker/user-position.png similarity index 100% rename from assets/img/marker/user-position.png rename to front/assets/img/marker/user-position.png diff --git a/assets/nls/de.json b/front/assets/nls/de.json similarity index 100% rename from assets/nls/de.json rename to front/assets/nls/de.json diff --git a/assets/nls/en.json b/front/assets/nls/en.json similarity index 100% rename from assets/nls/en.json rename to front/assets/nls/en.json diff --git a/assets/nls/es.json b/front/assets/nls/es.json similarity index 100% rename from assets/nls/es.json rename to front/assets/nls/es.json diff --git a/assets/nls/fr.json b/front/assets/nls/fr.json similarity index 100% rename from assets/nls/fr.json rename to front/assets/nls/fr.json diff --git a/authindex.html b/front/authindex.html similarity index 100% rename from authindex.html rename to front/authindex.html diff --git a/doc/beercrackerz/0.0.1/BeerCrackerz.html b/front/doc/beercrackerz/0.0.1/BeerCrackerz.html similarity index 100% rename from doc/beercrackerz/0.0.1/BeerCrackerz.html rename to front/doc/beercrackerz/0.0.1/BeerCrackerz.html diff --git a/doc/beercrackerz/0.0.1/BeerCrackerz.js.html b/front/doc/beercrackerz/0.0.1/BeerCrackerz.js.html similarity index 100% rename from doc/beercrackerz/0.0.1/BeerCrackerz.js.html rename to front/doc/beercrackerz/0.0.1/BeerCrackerz.js.html diff --git a/doc/beercrackerz/0.0.1/Utils.js.html b/front/doc/beercrackerz/0.0.1/Utils.js.html similarity index 100% rename from doc/beercrackerz/0.0.1/Utils.js.html rename to front/doc/beercrackerz/0.0.1/Utils.js.html diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.eot diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.svg diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.eot similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.eot rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.eot diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.svg similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.svg rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.svg diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.eot similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.eot rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.eot diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.svg similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.svg rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.svg diff --git a/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff similarity index 100% rename from doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff rename to front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff diff --git a/doc/beercrackerz/0.0.1/global.html b/front/doc/beercrackerz/0.0.1/global.html similarity index 100% rename from doc/beercrackerz/0.0.1/global.html rename to front/doc/beercrackerz/0.0.1/global.html diff --git a/doc/beercrackerz/0.0.1/index.html b/front/doc/beercrackerz/0.0.1/index.html similarity index 100% rename from doc/beercrackerz/0.0.1/index.html rename to front/doc/beercrackerz/0.0.1/index.html diff --git a/doc/beercrackerz/0.0.1/js_Utils.js.html b/front/doc/beercrackerz/0.0.1/js_Utils.js.html similarity index 100% rename from doc/beercrackerz/0.0.1/js_Utils.js.html rename to front/doc/beercrackerz/0.0.1/js_Utils.js.html diff --git a/doc/beercrackerz/0.0.1/js_utils_Utils.js.html b/front/doc/beercrackerz/0.0.1/js_utils_Utils.js.html similarity index 100% rename from doc/beercrackerz/0.0.1/js_utils_Utils.js.html rename to front/doc/beercrackerz/0.0.1/js_utils_Utils.js.html diff --git a/doc/beercrackerz/0.0.1/module-BeerCrackerz.html b/front/doc/beercrackerz/0.0.1/module-BeerCrackerz.html similarity index 100% rename from doc/beercrackerz/0.0.1/module-BeerCrackerz.html rename to front/doc/beercrackerz/0.0.1/module-BeerCrackerz.html diff --git a/doc/beercrackerz/0.0.1/scripts/linenumber.js b/front/doc/beercrackerz/0.0.1/scripts/linenumber.js similarity index 100% rename from doc/beercrackerz/0.0.1/scripts/linenumber.js rename to front/doc/beercrackerz/0.0.1/scripts/linenumber.js diff --git a/doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt b/front/doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt similarity index 100% rename from doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt rename to front/doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt diff --git a/doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js b/front/doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js similarity index 100% rename from doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js rename to front/doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js diff --git a/doc/beercrackerz/0.0.1/scripts/prettify/prettify.js b/front/doc/beercrackerz/0.0.1/scripts/prettify/prettify.js similarity index 100% rename from doc/beercrackerz/0.0.1/scripts/prettify/prettify.js rename to front/doc/beercrackerz/0.0.1/scripts/prettify/prettify.js diff --git a/doc/beercrackerz/0.0.1/styles/jsdoc-default.css b/front/doc/beercrackerz/0.0.1/styles/jsdoc-default.css similarity index 100% rename from doc/beercrackerz/0.0.1/styles/jsdoc-default.css rename to front/doc/beercrackerz/0.0.1/styles/jsdoc-default.css diff --git a/doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css b/front/doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css similarity index 100% rename from doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css rename to front/doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css diff --git a/doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css b/front/doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css similarity index 100% rename from doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css rename to front/doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css diff --git a/doc/jsDoc.json b/front/doc/jsDoc.json similarity index 100% rename from doc/jsDoc.json rename to front/doc/jsDoc.json diff --git a/index.html b/front/index.html similarity index 100% rename from index.html rename to front/index.html diff --git a/login.html b/front/login.html similarity index 100% rename from login.html rename to front/login.html diff --git a/package-lock.json b/front/package-lock.json similarity index 100% rename from package-lock.json rename to front/package-lock.json diff --git a/package.json b/front/package.json similarity index 100% rename from package.json rename to front/package.json diff --git a/register.html b/front/register.html similarity index 100% rename from register.html rename to front/register.html diff --git a/src/BeerCrackerz.js b/front/src/BeerCrackerz.js similarity index 100% rename from src/BeerCrackerz.js rename to front/src/BeerCrackerz.js diff --git a/src/BeerCrackerz.scss b/front/src/BeerCrackerz.scss similarity index 100% rename from src/BeerCrackerz.scss rename to front/src/BeerCrackerz.scss diff --git a/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js similarity index 100% rename from src/BeerCrackerzAuth.js rename to front/src/BeerCrackerzAuth.js diff --git a/src/BeerCrackerzAuth.scss b/front/src/BeerCrackerzAuth.scss similarity index 100% rename from src/BeerCrackerzAuth.scss rename to front/src/BeerCrackerzAuth.scss diff --git a/src/js/MapHelper.js b/front/src/js/MapHelper.js similarity index 100% rename from src/js/MapHelper.js rename to front/src/js/MapHelper.js diff --git a/src/js/ui/Notification.js b/front/src/js/ui/Notification.js similarity index 100% rename from src/js/ui/Notification.js rename to front/src/js/ui/Notification.js diff --git a/src/js/ui/Rating.js b/front/src/js/ui/Rating.js similarity index 100% rename from src/js/ui/Rating.js rename to front/src/js/ui/Rating.js diff --git a/src/js/ui/ZoomSlider.js b/front/src/js/ui/ZoomSlider.js similarity index 100% rename from src/js/ui/ZoomSlider.js rename to front/src/js/ui/ZoomSlider.js diff --git a/src/js/utils/LangManager.js b/front/src/js/utils/LangManager.js similarity index 100% rename from src/js/utils/LangManager.js rename to front/src/js/utils/LangManager.js diff --git a/src/js/utils/MarkerEnum.js b/front/src/js/utils/MarkerEnum.js similarity index 100% rename from src/js/utils/MarkerEnum.js rename to front/src/js/utils/MarkerEnum.js diff --git a/src/js/utils/ProviderEnum.js b/front/src/js/utils/ProviderEnum.js similarity index 100% rename from src/js/utils/ProviderEnum.js rename to front/src/js/utils/ProviderEnum.js diff --git a/src/js/utils/Utils.js b/front/src/js/utils/Utils.js similarity index 100% rename from src/js/utils/Utils.js rename to front/src/js/utils/Utils.js diff --git a/src/scss/_base.scss b/front/src/scss/_base.scss similarity index 100% rename from src/scss/_base.scss rename to front/src/scss/_base.scss diff --git a/src/scss/_keyframes.scss b/front/src/scss/_keyframes.scss similarity index 100% rename from src/scss/_keyframes.scss rename to front/src/scss/_keyframes.scss diff --git a/src/scss/_responsive.scss b/front/src/scss/_responsive.scss similarity index 100% rename from src/scss/_responsive.scss rename to front/src/scss/_responsive.scss diff --git a/webpack/.eslintrc b/front/webpack/.eslintrc similarity index 100% rename from webpack/.eslintrc rename to front/webpack/.eslintrc diff --git a/webpack/loaders.js b/front/webpack/loaders.js similarity index 100% rename from webpack/loaders.js rename to front/webpack/loaders.js diff --git a/webpack/plugins.js b/front/webpack/plugins.js similarity index 100% rename from webpack/plugins.js rename to front/webpack/plugins.js diff --git a/webpack/postcss.config.js b/front/webpack/postcss.config.js similarity index 100% rename from webpack/postcss.config.js rename to front/webpack/postcss.config.js diff --git a/webpack/stylelint.config.js b/front/webpack/stylelint.config.js similarity index 100% rename from webpack/stylelint.config.js rename to front/webpack/stylelint.config.js diff --git a/webpack/webpack.common.js b/front/webpack/webpack.common.js similarity index 100% rename from webpack/webpack.common.js rename to front/webpack/webpack.common.js diff --git a/webpack/webpack.dev.js b/front/webpack/webpack.dev.js similarity index 100% rename from webpack/webpack.dev.js rename to front/webpack/webpack.dev.js diff --git a/webpack/webpack.prod.js b/front/webpack/webpack.prod.js similarity index 100% rename from webpack/webpack.prod.js rename to front/webpack/webpack.prod.js From ab7995293a992ba0d7be460e8c50f60bd2960e77 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Mon, 29 Aug 2022 16:38:29 +0200 Subject: [PATCH 002/204] chore: init django project and docker config --- .conf/development/back/Dockerfile | 17 +++ .conf/development/conf.env | 17 +++ .gitignore | 5 +- back/app/__init__.py | 0 back/app/admin.py | 3 + back/app/apps.py | 6 + back/app/management/__init__.py | 0 back/app/management/commands/__init__.py | 0 back/app/management/commands/wait_for_db.py | 26 ++++ back/app/migrations/__init__.py | 0 back/app/tests.py | 3 + back/back/__init__.py | 0 back/back/asgi.py | 16 +++ back/back/settings.py | 150 ++++++++++++++++++++ back/back/urls.py | 21 +++ back/back/wsgi.py | 16 +++ back/manage.py | 22 +++ back/requirements.txt | 8 ++ docker-compose.yml | 41 ++++++ front/package.json | 4 +- 20 files changed, 351 insertions(+), 4 deletions(-) create mode 100644 .conf/development/back/Dockerfile create mode 100644 .conf/development/conf.env create mode 100644 back/app/__init__.py create mode 100644 back/app/admin.py create mode 100644 back/app/apps.py create mode 100644 back/app/management/__init__.py create mode 100644 back/app/management/commands/__init__.py create mode 100644 back/app/management/commands/wait_for_db.py create mode 100644 back/app/migrations/__init__.py create mode 100644 back/app/tests.py create mode 100644 back/back/__init__.py create mode 100644 back/back/asgi.py create mode 100644 back/back/settings.py create mode 100644 back/back/urls.py create mode 100644 back/back/wsgi.py create mode 100755 back/manage.py create mode 100644 back/requirements.txt create mode 100644 docker-compose.yml diff --git a/.conf/development/back/Dockerfile b/.conf/development/back/Dockerfile new file mode 100644 index 0000000..c2b8ce1 --- /dev/null +++ b/.conf/development/back/Dockerfile @@ -0,0 +1,17 @@ +FROM python:3.9-alpine + +ENV PYTHONUNBUFFERED=1 + +WORKDIR /back +COPY ./back/requirements.txt . + +RUN apk add --update --no-cache postgresql-client && \ + apk add --update --no-cache --virtual .tmp-deps \ + build-base postgresql-dev musl-dev linux-headers && \ + pip install -r requirements.txt && \ + apk del .tmp-deps && \ + adduser --disabled-password --no-create-home back + +COPY ./back . + +USER back diff --git a/.conf/development/conf.env b/.conf/development/conf.env new file mode 100644 index 0000000..bf5fb41 --- /dev/null +++ b/.conf/development/conf.env @@ -0,0 +1,17 @@ +# BACKEND +BACKEND_NAME=beer_crackerz_back +BACKEND_HOST=localhost +BACKEND_PORT=8000 +BACKEND_CONTAINER_PORT=8000 +BACKEND_SECRET_KEY=secretKeyHasToBeChanged! +BACKEND_DEBUG=1 +BACKEND_ALLOWED_HOSTS=* + +# DATABASE +DB_POSTGRES_VERSION=14.2-alpine +DB_HOST=beer_crackerz_db +DB_PORT=5432 +DB_CONTAINER_PORT=5432 +DB_NAME=beer_crackerz +DB_USER=postgres +DB_PASSWORD=postgres \ No newline at end of file diff --git a/.gitignore b/.gitignore index 68134fe..5613bbb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ node_modules .DS_Store # Byte-compiled / optimized / DLL files - __pycache__/ - *.pyc - *.py[cod] +__pycache__/ +*.py[cod] *$py.class \ No newline at end of file diff --git a/back/app/__init__.py b/back/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/admin.py b/back/app/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/back/app/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/back/app/apps.py b/back/app/apps.py new file mode 100644 index 0000000..ed327d2 --- /dev/null +++ b/back/app/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class AppConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'app' diff --git a/back/app/management/__init__.py b/back/app/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/management/commands/__init__.py b/back/app/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/management/commands/wait_for_db.py b/back/app/management/commands/wait_for_db.py new file mode 100644 index 0000000..70e6abf --- /dev/null +++ b/back/app/management/commands/wait_for_db.py @@ -0,0 +1,26 @@ +""" +Django command to wait for the database to be available +""" +import time + +from psycopg2 import OperationalError as Psycopg2OpError + +from django.db.utils import OperationalError +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + """Django command to wait for the database""" + def handle(self, *args, **kwargs): + """Entrypoint for command""" + self.stdout.write('Waiting for database...') + db_up = False + while db_up is False: + try: + self.check(databases=['default']) + db_up = True + except (Psycopg2OpError, OperationalError): + self.stdout.write('Database unavailable, waiting 1 second...') + time.sleep(1) + + self.stdout.write(self.style.SUCCESS('Database ready!')) \ No newline at end of file diff --git a/back/app/migrations/__init__.py b/back/app/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/tests.py b/back/app/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/back/app/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/back/back/__init__.py b/back/back/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/back/asgi.py b/back/back/asgi.py new file mode 100644 index 0000000..ef1c359 --- /dev/null +++ b/back/back/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for back project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'back.settings') + +application = get_asgi_application() diff --git a/back/back/settings.py b/back/back/settings.py new file mode 100644 index 0000000..2246b70 --- /dev/null +++ b/back/back/settings.py @@ -0,0 +1,150 @@ +""" +Django settings for back project. + +Generated by 'django-admin startproject' using Django 4.1. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.1/ref/settings/ +""" + +import os +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = os.environ.get('SECRET_KEY', 'secret') + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = bool(int(os.environ.get('DEBUG', 0))) + +ALLOWED_HOSTS = [] +ALLOWED_HOSTS.extend( + filter( + None, + os.environ.get('ALLOWED_HOSTS', '').split(';') + ) +) + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django_extensions', + 'rest_framework', + 'django_filters', + 'corsheaders', + 'app', +] + +MIDDLEWARE = [ + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'back.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'back.wsgi.application' + +CORS_ORIGIN_ALLOW_ALL = True + +# Database +# https://docs.djangoproject.com/en/4.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql', + 'HOST': os.environ.get('DB_HOST'), + 'PORT': os.environ.get('DB_PORT'), + 'NAME': os.environ.get('DB_NAME'), + 'USER': os.environ.get('DB_USER'), + 'PASSWORD': os.environ.get('DB_PASSWORD'), + } +} + +# Default primary key field type +# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + +# Password validation +# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +REST_FRAMEWORK = { + 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], +} + +EXTENDED_PAGINATION_DEFAULT_SIZE = 20 +EXTENDED_PAGINATION_DEFAULT_SIZE_QUERY_PARAM = 'size' + +# Internationalization +# https://docs.djangoproject.com/en/4.1/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'Europe/Paris' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.1/howto/static-files/ + +STATIC_URL = 'static/' + diff --git a/back/back/urls.py b/back/back/urls.py new file mode 100644 index 0000000..5eb84db --- /dev/null +++ b/back/back/urls.py @@ -0,0 +1,21 @@ +"""back URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/back/back/wsgi.py b/back/back/wsgi.py new file mode 100644 index 0000000..7a52296 --- /dev/null +++ b/back/back/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for back project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'back.settings') + +application = get_wsgi_application() diff --git a/back/manage.py b/back/manage.py new file mode 100755 index 0000000..600455f --- /dev/null +++ b/back/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'back.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/back/requirements.txt b/back/requirements.txt new file mode 100644 index 0000000..7ba36d1 --- /dev/null +++ b/back/requirements.txt @@ -0,0 +1,8 @@ +Django==4.1 +django-cors-headers==3.13.0 +djangorestframework==3.12.4 +pytz==2022.2.1 +django-filter==2.4.0 +django_extensions==3.1.3 +psycopg2>=2.8.6,<2.8.7 +uWSGI>=2.0.19.1,<2.1 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4bf5cdf --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,41 @@ +version: "3.9" + +services: + backend: + container_name: ${BACKEND_NAME} + build: + context: . + dockerfile: ./.conf/development/back/Dockerfile + command: > + sh -c "python manage.py wait_for_db && + python manage.py migrate && + python manage.py runserver 0.0.0.0:8000" + environment: + SECRET_KEY: ${BACKEND_SECRET_KEY} + DEBUG: ${BACKEND_DEBUG} + ALLOWED_HOSTS: ${BACKEND_ALLOWED_HOSTS} + DB_HOST: ${DB_HOST} + DB_PORT: ${DB_PORT} + DB_NAME: ${DB_NAME} + DB_USER: ${DB_USER} + DB_PASSWORD: ${DB_PASSWORD} + ports: + - ${BACKEND_PORT}:${BACKEND_CONTAINER_PORT} + volumes: + - ./back:/back + depends_on: + - db + db: + image: postgres:${DB_POSTGRES_VERSION} + container_name: ${DB_HOST} + environment: + POSTGRES_DB: ${DB_NAME} + POSTGRES_USER: ${DB_USER} + POSTGRES_PASSWORD: ${DB_PASSWORD} + ports: + - ${DB_PORT}:${DB_CONTAINER_PORT} + volumes: + - beer_crakerz_db:/var/lib/postgresql/data +volumes: + beer_crakerz_db: + name: beer_crakerz_db diff --git a/front/package.json b/front/package.json index 87ed75a..9808705 100644 --- a/front/package.json +++ b/front/package.json @@ -9,7 +9,9 @@ "watch": "webpack --watch --config webpack/webpack.dev.js", "server": "http-server -p 1337 -c-1 -o index.html", "doc": "jsdoc -c doc/jsDoc.json", - "beforecommit": "npm run doc && npm run build" + "beforecommit": "npm run doc && npm run build", + "docker:build": "docker compose --file ../docker-compose.yml --env-file ../.conf/development/conf.env build", + "docker:up": "docker compose --file ../docker-compose.yml --env-file ../.conf/development/conf.env up" }, "homepage": "https://github.com/MesseBasseProduction/BeerCrackerz/README.md", "repository": { From 345e1955baf2198ba3ae4d157fbd7f9e7e3810cd Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Tue, 30 Aug 2022 16:49:16 +0200 Subject: [PATCH 003/204] feat: add user, spot, shop & bar models, serializers and views --- back/app/migrations/0001_initial.py | 44 ++++++++++++++++++ back/app/migrations/0002_spot.py | 30 +++++++++++++ ...tude_spot_lat_rename_longitude_spot_lng.py | 23 ++++++++++ back/app/migrations/0004_shop_bar.py | 45 +++++++++++++++++++ back/app/models/__init__.py | 1 + back/app/models/bar.py | 9 ++++ back/app/models/point.py | 12 +++++ back/app/models/shop.py | 10 +++++ back/app/models/spot.py | 9 ++++ back/app/models/user.py | 10 +++++ back/app/serializers/__init__.py | 0 back/app/serializers/bar/__init__.py | 0 back/app/serializers/bar/bar.py | 21 +++++++++ back/app/serializers/bar/bar_extended.py | 15 +++++++ back/app/serializers/shop/__init__.py | 0 back/app/serializers/shop/shop.py | 21 +++++++++ back/app/serializers/shop/shop_extended.py | 15 +++++++ back/app/serializers/spot/__init__.py | 0 back/app/serializers/spot/spot.py | 21 +++++++++ back/app/serializers/spot/spot_extended.py | 15 +++++++ back/app/serializers/user/__init__.py | 0 back/app/serializers/user/user.py | 9 ++++ back/app/urls.py | 15 +++++++ back/app/utils.py | 5 +++ back/app/views/__init__.py | 4 ++ back/app/views/bar.py | 17 +++++++ back/app/views/shop.py | 17 +++++++ back/app/views/spot.py | 17 +++++++ back/app/views/user.py | 9 ++++ back/back/settings.py | 2 + back/back/urls.py | 3 +- 31 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 back/app/migrations/0001_initial.py create mode 100644 back/app/migrations/0002_spot.py create mode 100644 back/app/migrations/0003_rename_latitude_spot_lat_rename_longitude_spot_lng.py create mode 100644 back/app/migrations/0004_shop_bar.py create mode 100644 back/app/models/__init__.py create mode 100644 back/app/models/bar.py create mode 100644 back/app/models/point.py create mode 100644 back/app/models/shop.py create mode 100644 back/app/models/spot.py create mode 100644 back/app/models/user.py create mode 100644 back/app/serializers/__init__.py create mode 100644 back/app/serializers/bar/__init__.py create mode 100644 back/app/serializers/bar/bar.py create mode 100644 back/app/serializers/bar/bar_extended.py create mode 100644 back/app/serializers/shop/__init__.py create mode 100644 back/app/serializers/shop/shop.py create mode 100644 back/app/serializers/shop/shop_extended.py create mode 100644 back/app/serializers/spot/__init__.py create mode 100644 back/app/serializers/spot/spot.py create mode 100644 back/app/serializers/spot/spot_extended.py create mode 100644 back/app/serializers/user/__init__.py create mode 100644 back/app/serializers/user/user.py create mode 100644 back/app/urls.py create mode 100644 back/app/utils.py create mode 100644 back/app/views/__init__.py create mode 100644 back/app/views/bar.py create mode 100644 back/app/views/shop.py create mode 100644 back/app/views/spot.py create mode 100644 back/app/views/user.py diff --git a/back/app/migrations/0001_initial.py b/back/app/migrations/0001_initial.py new file mode 100644 index 0000000..1674d93 --- /dev/null +++ b/back/app/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 4.1 on 2022-08-30 13:16 + +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/back/app/migrations/0002_spot.py b/back/app/migrations/0002_spot.py new file mode 100644 index 0000000..b4878b6 --- /dev/null +++ b/back/app/migrations/0002_spot.py @@ -0,0 +1,30 @@ +# Generated by Django 4.1 on 2022-08-30 14:46 + +import app.models.user +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Spot', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('description', models.CharField(blank=True, max_length=280, null=True)), + ('longitude', models.FloatField()), + ('latitude', models.FloatField()), + ('creation_date', models.DateField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=models.SET(app.models.user.get_default_user), related_name='spots', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/back/app/migrations/0003_rename_latitude_spot_lat_rename_longitude_spot_lng.py b/back/app/migrations/0003_rename_latitude_spot_lat_rename_longitude_spot_lng.py new file mode 100644 index 0000000..6593900 --- /dev/null +++ b/back/app/migrations/0003_rename_latitude_spot_lat_rename_longitude_spot_lng.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1 on 2022-08-31 21:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0002_spot'), + ] + + operations = [ + migrations.RenameField( + model_name='spot', + old_name='latitude', + new_name='lat', + ), + migrations.RenameField( + model_name='spot', + old_name='longitude', + new_name='lng', + ), + ] diff --git a/back/app/migrations/0004_shop_bar.py b/back/app/migrations/0004_shop_bar.py new file mode 100644 index 0000000..4d46f93 --- /dev/null +++ b/back/app/migrations/0004_shop_bar.py @@ -0,0 +1,45 @@ +# Generated by Django 4.1 on 2022-08-31 21:44 + +import app.models.user +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0003_rename_latitude_spot_lat_rename_longitude_spot_lng'), + ] + + operations = [ + migrations.CreateModel( + name='Shop', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('description', models.CharField(blank=True, max_length=280, null=True)), + ('lng', models.FloatField()), + ('lat', models.FloatField()), + ('creation_date', models.DateField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=models.SET(app.models.user.get_default_user), related_name='shops', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Bar', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('description', models.CharField(blank=True, max_length=280, null=True)), + ('lng', models.FloatField()), + ('lat', models.FloatField()), + ('creation_date', models.DateField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=models.SET(app.models.user.get_default_user), related_name='bar', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/back/app/models/__init__.py b/back/app/models/__init__.py new file mode 100644 index 0000000..ee4c00b --- /dev/null +++ b/back/app/models/__init__.py @@ -0,0 +1 @@ +from .user import User diff --git a/back/app/models/bar.py b/back/app/models/bar.py new file mode 100644 index 0000000..dfb0776 --- /dev/null +++ b/back/app/models/bar.py @@ -0,0 +1,9 @@ +from django.conf import settings +from django.db import models + +from .point import Point +from .user import get_default_user + + +class Bar(Point): + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET(get_default_user), related_name='bar') diff --git a/back/app/models/point.py b/back/app/models/point.py new file mode 100644 index 0000000..50ff853 --- /dev/null +++ b/back/app/models/point.py @@ -0,0 +1,12 @@ +from django.db import models + + +class Point(models.Model): + name = models.CharField(max_length=50) + description = models.CharField(max_length=280, null=True, blank=True) + lng = models.FloatField() + lat = models.FloatField() + creation_date = models.DateField(auto_now_add=True) + + class Meta: + abstract = True diff --git a/back/app/models/shop.py b/back/app/models/shop.py new file mode 100644 index 0000000..cf0e56f --- /dev/null +++ b/back/app/models/shop.py @@ -0,0 +1,10 @@ +from django.conf import settings +from django.db import models + +from .point import Point +from .user import get_default_user + + +class Shop(Point): + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET(get_default_user), related_name='shops') + diff --git a/back/app/models/spot.py b/back/app/models/spot.py new file mode 100644 index 0000000..f22cd4c --- /dev/null +++ b/back/app/models/spot.py @@ -0,0 +1,9 @@ +from django.conf import settings +from django.db import models + +from .point import Point +from .user import get_default_user + + +class Spot(Point): + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET(get_default_user), related_name='spots') diff --git a/back/app/models/user.py b/back/app/models/user.py new file mode 100644 index 0000000..cb204cd --- /dev/null +++ b/back/app/models/user.py @@ -0,0 +1,10 @@ +from django.contrib.auth.models import AbstractUser +from django.contrib.auth import get_user_model + + +class User(AbstractUser): + pass + + +def get_default_user(): + return get_user_model().objetcs.get_or_create(username="Deleted user")[0] diff --git a/back/app/serializers/__init__.py b/back/app/serializers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/serializers/bar/__init__.py b/back/app/serializers/bar/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/serializers/bar/bar.py b/back/app/serializers/bar/bar.py new file mode 100644 index 0000000..ad6ea6e --- /dev/null +++ b/back/app/serializers/bar/bar.py @@ -0,0 +1,21 @@ +from rest_framework import serializers + +from app.models import User +from app.models.bar import Bar +from app.utils import get_or_raise_error + + +class BarSerializer(serializers.ModelSerializer): + userId = serializers.ModelField(model_field=Bar()._meta.get_field('user'), required=True, allow_null=False) + + class Meta: + model = Bar + fields = ('id', 'name', 'description', 'lng', 'lat', 'userId') + + def validate(self, data): + # Map userId to user object + if 'userId' in data: + data['user'] = get_or_raise_error(User, id=data.pop('userId'), + error=serializers.ValidationError('This user doesn\'t exist')) + + return data diff --git a/back/app/serializers/bar/bar_extended.py b/back/app/serializers/bar/bar_extended.py new file mode 100644 index 0000000..44f22a4 --- /dev/null +++ b/back/app/serializers/bar/bar_extended.py @@ -0,0 +1,15 @@ +from rest_framework import serializers + +from app.models.bar import Bar + + +class BarExtendedSerializer(serializers.ModelSerializer): + type = serializers.CharField(default='bar') + rate = serializers.FloatField(default=0) + user = serializers.CharField(source='user.username') + userId = serializers.CharField(source='user.id') + creationDate = serializers.DateField(source='creation_date') + + class Meta: + model = Bar + fields = ('id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'user', 'userId', 'creationDate') diff --git a/back/app/serializers/shop/__init__.py b/back/app/serializers/shop/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/serializers/shop/shop.py b/back/app/serializers/shop/shop.py new file mode 100644 index 0000000..a8c6a52 --- /dev/null +++ b/back/app/serializers/shop/shop.py @@ -0,0 +1,21 @@ +from rest_framework import serializers + +from app.models import User +from app.models.shop import Shop +from app.utils import get_or_raise_error + + +class ShopSerializer(serializers.ModelSerializer): + userId = serializers.ModelField(model_field=Shop()._meta.get_field('user'), required=True, allow_null=False) + + class Meta: + model = Shop + fields = ('id', 'name', 'description', 'lng', 'lat', 'userId') + + def validate(self, data): + # Map userId to user object + if 'userId' in data: + data['user'] = get_or_raise_error(User, id=data.pop('userId'), + error=serializers.ValidationError('This user doesn\'t exist')) + + return data diff --git a/back/app/serializers/shop/shop_extended.py b/back/app/serializers/shop/shop_extended.py new file mode 100644 index 0000000..88acc2e --- /dev/null +++ b/back/app/serializers/shop/shop_extended.py @@ -0,0 +1,15 @@ +from rest_framework import serializers + +from app.models.shop import Shop + + +class ShopExtendedSerializer(serializers.ModelSerializer): + type = serializers.CharField(default='shop') + rate = serializers.FloatField(default=0) + user = serializers.CharField(source='user.username') + userId = serializers.CharField(source='user.id') + creationDate = serializers.DateField(source='creation_date') + + class Meta: + model = Shop + fields = ('id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'user', 'userId', 'creationDate') diff --git a/back/app/serializers/spot/__init__.py b/back/app/serializers/spot/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/serializers/spot/spot.py b/back/app/serializers/spot/spot.py new file mode 100644 index 0000000..c341a97 --- /dev/null +++ b/back/app/serializers/spot/spot.py @@ -0,0 +1,21 @@ +from rest_framework import serializers + +from app.models import User +from app.models.spot import Spot +from app.utils import get_or_raise_error + + +class SpotSerializer(serializers.ModelSerializer): + userId = serializers.ModelField(model_field=Spot()._meta.get_field('user'), required=True, allow_null=False) + + class Meta: + model = Spot + fields = ('id', 'name', 'description', 'lng', 'lat', 'userId') + + def validate(self, data): + # Map userId to user object + if 'userId' in data: + data['user'] = get_or_raise_error(User, id=data.pop('userId'), + error=serializers.ValidationError('This user doesn\'t exist')) + + return data diff --git a/back/app/serializers/spot/spot_extended.py b/back/app/serializers/spot/spot_extended.py new file mode 100644 index 0000000..848e937 --- /dev/null +++ b/back/app/serializers/spot/spot_extended.py @@ -0,0 +1,15 @@ +from rest_framework import serializers + +from app.models.spot import Spot + + +class SpotExtendedSerializer(serializers.ModelSerializer): + type = serializers.CharField(default='spot') + rate = serializers.FloatField(default=0) + user = serializers.CharField(source='user.username') + userId = serializers.CharField(source='user.id') + creationDate = serializers.DateField(source='creation_date') + + class Meta: + model = Spot + fields = ('id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'user', 'userId', 'creationDate') diff --git a/back/app/serializers/user/__init__.py b/back/app/serializers/user/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/back/app/serializers/user/user.py b/back/app/serializers/user/user.py new file mode 100644 index 0000000..0fc02ab --- /dev/null +++ b/back/app/serializers/user/user.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from app.models.user import User + + +class UserSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ('id', 'username') diff --git a/back/app/urls.py b/back/app/urls.py new file mode 100644 index 0000000..cd5645a --- /dev/null +++ b/back/app/urls.py @@ -0,0 +1,15 @@ +from django.urls import include, path +from rest_framework import routers + +from app.views import UserViewSet, SpotViewSet, ShopViewSet, BarViewSet + +router = routers.DefaultRouter() +router.register(r'user', UserViewSet, basename='user') +router.register(r'spot', SpotViewSet, basename='spot') +router.register(r'shop', ShopViewSet, basename='shop') +router.register(r'bar', BarViewSet, basename='bar') + +urlpatterns = [ + path('', include(router.urls)), + path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), +] diff --git a/back/app/utils.py b/back/app/utils.py new file mode 100644 index 0000000..2521b85 --- /dev/null +++ b/back/app/utils.py @@ -0,0 +1,5 @@ +def get_or_raise_error(model, error, **kwargs): + try: + return model.objects.get(**kwargs) + except model.DoesNotExist: + raise error diff --git a/back/app/views/__init__.py b/back/app/views/__init__.py new file mode 100644 index 0000000..0d16058 --- /dev/null +++ b/back/app/views/__init__.py @@ -0,0 +1,4 @@ +from .bar import BarViewSet +from .shop import ShopViewSet +from .spot import SpotViewSet +from .user import UserViewSet diff --git a/back/app/views/bar.py b/back/app/views/bar.py new file mode 100644 index 0000000..a6ce754 --- /dev/null +++ b/back/app/views/bar.py @@ -0,0 +1,17 @@ +from rest_framework import viewsets + +from app.models.bar import Bar +from app.serializers.bar.bar import BarSerializer +from app.serializers.bar.bar_extended import BarExtendedSerializer + + +class BarViewSet(viewsets.ModelViewSet): + queryset = Bar.objects.all() + + def get_serializer_class(self): + if hasattr(self, 'action'): + if self.action == 'list' or self.action == 'retrieve': + return BarExtendedSerializer + + # Case for create, update, partial_update and destroy + return BarSerializer diff --git a/back/app/views/shop.py b/back/app/views/shop.py new file mode 100644 index 0000000..5bf4a8c --- /dev/null +++ b/back/app/views/shop.py @@ -0,0 +1,17 @@ +from rest_framework import viewsets + +from app.models.shop import Shop +from app.serializers.shop.shop import ShopSerializer +from app.serializers.shop.shop_extended import ShopExtendedSerializer + + +class ShopViewSet(viewsets.ModelViewSet): + queryset = Shop.objects.all() + + def get_serializer_class(self): + if hasattr(self, 'action'): + if self.action == 'list' or self.action == 'retrieve': + return ShopExtendedSerializer + + # Case for create, update, partial_update and destroy + return ShopSerializer diff --git a/back/app/views/spot.py b/back/app/views/spot.py new file mode 100644 index 0000000..dbc3d46 --- /dev/null +++ b/back/app/views/spot.py @@ -0,0 +1,17 @@ +from rest_framework import viewsets + +from app.models.spot import Spot +from app.serializers.spot.spot import SpotSerializer +from app.serializers.spot.spot_extended import SpotExtendedSerializer + + +class SpotViewSet(viewsets.ModelViewSet): + queryset = Spot.objects.all() + + def get_serializer_class(self): + if hasattr(self, 'action'): + if self.action == 'list' or self.action == 'retrieve': + return SpotExtendedSerializer + + # Case for create, update, partial_update and destroy + return SpotSerializer diff --git a/back/app/views/user.py b/back/app/views/user.py new file mode 100644 index 0000000..d76e36c --- /dev/null +++ b/back/app/views/user.py @@ -0,0 +1,9 @@ +from rest_framework import viewsets + +from app.models import User +from app.serializers.user.user import UserSerializer + + +class UserViewSet(viewsets.ModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer diff --git a/back/back/settings.py b/back/back/settings.py index 2246b70..4858873 100644 --- a/back/back/settings.py +++ b/back/back/settings.py @@ -122,6 +122,8 @@ }, ] +AUTH_USER_MODEL = "app.User" + REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], } diff --git a/back/back/urls.py b/back/back/urls.py index 5eb84db..d8f30d7 100644 --- a/back/back/urls.py +++ b/back/back/urls.py @@ -14,8 +14,9 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), + path('', include('app.urls')) ] From a48f55b2fd4574715b3e2dcca0f4b35ce22d57a5 Mon Sep 17 00:00:00 2001 From: Asiberus Date: Thu, 1 Sep 2022 00:04:27 +0200 Subject: [PATCH 004/204] chore: move serializers and views to api app --- back/{app/serializers => api}/__init__.py | 0 back/api/admin.py | 3 +++ back/api/apps.py | 6 ++++++ back/{app/serializers/bar => api/migrations}/__init__.py | 0 back/api/models.py | 3 +++ back/{app/serializers/shop => api/serializers}/__init__.py | 0 back/api/serializers/bar/__init__.py | 2 ++ back/{app => api}/serializers/bar/bar.py | 0 back/{app => api}/serializers/bar/bar_extended.py | 0 back/api/serializers/shop/__init__.py | 2 ++ back/{app => api}/serializers/shop/shop.py | 0 back/{app => api}/serializers/shop/shop_extended.py | 0 back/api/serializers/spot/__init__.py | 2 ++ back/{app => api}/serializers/spot/spot.py | 0 back/{app => api}/serializers/spot/spot_extended.py | 0 back/api/serializers/user/__init__.py | 1 + back/{app => api}/serializers/user/user.py | 0 back/api/tests.py | 3 +++ back/{app => api}/urls.py | 2 +- back/api/views.py | 3 +++ back/{app => api}/views/__init__.py | 0 back/{app => api}/views/bar.py | 3 +-- back/{app => api}/views/shop.py | 3 +-- back/{app => api}/views/spot.py | 3 +-- back/{app => api}/views/user.py | 2 +- back/app/serializers/spot/__init__.py | 0 back/app/serializers/user/__init__.py | 0 back/back/settings.py | 1 + back/back/urls.py | 2 +- 29 files changed, 32 insertions(+), 9 deletions(-) rename back/{app/serializers => api}/__init__.py (100%) create mode 100644 back/api/admin.py create mode 100644 back/api/apps.py rename back/{app/serializers/bar => api/migrations}/__init__.py (100%) create mode 100644 back/api/models.py rename back/{app/serializers/shop => api/serializers}/__init__.py (100%) create mode 100644 back/api/serializers/bar/__init__.py rename back/{app => api}/serializers/bar/bar.py (100%) rename back/{app => api}/serializers/bar/bar_extended.py (100%) create mode 100644 back/api/serializers/shop/__init__.py rename back/{app => api}/serializers/shop/shop.py (100%) rename back/{app => api}/serializers/shop/shop_extended.py (100%) create mode 100644 back/api/serializers/spot/__init__.py rename back/{app => api}/serializers/spot/spot.py (100%) rename back/{app => api}/serializers/spot/spot_extended.py (100%) create mode 100644 back/api/serializers/user/__init__.py rename back/{app => api}/serializers/user/user.py (100%) create mode 100644 back/api/tests.py rename back/{app => api}/urls.py (88%) create mode 100644 back/api/views.py rename back/{app => api}/views/__init__.py (100%) rename back/{app => api}/views/bar.py (78%) rename back/{app => api}/views/shop.py (77%) rename back/{app => api}/views/spot.py (77%) rename back/{app => api}/views/user.py (77%) delete mode 100644 back/app/serializers/spot/__init__.py delete mode 100644 back/app/serializers/user/__init__.py diff --git a/back/app/serializers/__init__.py b/back/api/__init__.py similarity index 100% rename from back/app/serializers/__init__.py rename to back/api/__init__.py diff --git a/back/api/admin.py b/back/api/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/back/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/back/api/apps.py b/back/api/apps.py new file mode 100644 index 0000000..66656fd --- /dev/null +++ b/back/api/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'api' diff --git a/back/app/serializers/bar/__init__.py b/back/api/migrations/__init__.py similarity index 100% rename from back/app/serializers/bar/__init__.py rename to back/api/migrations/__init__.py diff --git a/back/api/models.py b/back/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/back/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/back/app/serializers/shop/__init__.py b/back/api/serializers/__init__.py similarity index 100% rename from back/app/serializers/shop/__init__.py rename to back/api/serializers/__init__.py diff --git a/back/api/serializers/bar/__init__.py b/back/api/serializers/bar/__init__.py new file mode 100644 index 0000000..0ff3656 --- /dev/null +++ b/back/api/serializers/bar/__init__.py @@ -0,0 +1,2 @@ +from .bar import BarSerializer +from .bar_extended import BarExtendedSerializer \ No newline at end of file diff --git a/back/app/serializers/bar/bar.py b/back/api/serializers/bar/bar.py similarity index 100% rename from back/app/serializers/bar/bar.py rename to back/api/serializers/bar/bar.py diff --git a/back/app/serializers/bar/bar_extended.py b/back/api/serializers/bar/bar_extended.py similarity index 100% rename from back/app/serializers/bar/bar_extended.py rename to back/api/serializers/bar/bar_extended.py diff --git a/back/api/serializers/shop/__init__.py b/back/api/serializers/shop/__init__.py new file mode 100644 index 0000000..c8292df --- /dev/null +++ b/back/api/serializers/shop/__init__.py @@ -0,0 +1,2 @@ +from .shop import ShopSerializer +from .shop_extended import ShopExtendedSerializer diff --git a/back/app/serializers/shop/shop.py b/back/api/serializers/shop/shop.py similarity index 100% rename from back/app/serializers/shop/shop.py rename to back/api/serializers/shop/shop.py diff --git a/back/app/serializers/shop/shop_extended.py b/back/api/serializers/shop/shop_extended.py similarity index 100% rename from back/app/serializers/shop/shop_extended.py rename to back/api/serializers/shop/shop_extended.py diff --git a/back/api/serializers/spot/__init__.py b/back/api/serializers/spot/__init__.py new file mode 100644 index 0000000..31319dc --- /dev/null +++ b/back/api/serializers/spot/__init__.py @@ -0,0 +1,2 @@ +from .spot import SpotSerializer +from .spot_extended import SpotExtendedSerializer \ No newline at end of file diff --git a/back/app/serializers/spot/spot.py b/back/api/serializers/spot/spot.py similarity index 100% rename from back/app/serializers/spot/spot.py rename to back/api/serializers/spot/spot.py diff --git a/back/app/serializers/spot/spot_extended.py b/back/api/serializers/spot/spot_extended.py similarity index 100% rename from back/app/serializers/spot/spot_extended.py rename to back/api/serializers/spot/spot_extended.py diff --git a/back/api/serializers/user/__init__.py b/back/api/serializers/user/__init__.py new file mode 100644 index 0000000..ea15766 --- /dev/null +++ b/back/api/serializers/user/__init__.py @@ -0,0 +1 @@ +from .user import UserSerializer \ No newline at end of file diff --git a/back/app/serializers/user/user.py b/back/api/serializers/user/user.py similarity index 100% rename from back/app/serializers/user/user.py rename to back/api/serializers/user/user.py diff --git a/back/api/tests.py b/back/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/back/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/back/app/urls.py b/back/api/urls.py similarity index 88% rename from back/app/urls.py rename to back/api/urls.py index cd5645a..5921094 100644 --- a/back/app/urls.py +++ b/back/api/urls.py @@ -1,7 +1,7 @@ from django.urls import include, path from rest_framework import routers -from app.views import UserViewSet, SpotViewSet, ShopViewSet, BarViewSet +from api.views import UserViewSet, SpotViewSet, ShopViewSet, BarViewSet router = routers.DefaultRouter() router.register(r'user', UserViewSet, basename='user') diff --git a/back/api/views.py b/back/api/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/back/api/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/back/app/views/__init__.py b/back/api/views/__init__.py similarity index 100% rename from back/app/views/__init__.py rename to back/api/views/__init__.py diff --git a/back/app/views/bar.py b/back/api/views/bar.py similarity index 78% rename from back/app/views/bar.py rename to back/api/views/bar.py index a6ce754..b19cf0a 100644 --- a/back/app/views/bar.py +++ b/back/api/views/bar.py @@ -1,8 +1,7 @@ from rest_framework import viewsets +from api.serializers.bar import BarExtendedSerializer, BarSerializer from app.models.bar import Bar -from app.serializers.bar.bar import BarSerializer -from app.serializers.bar.bar_extended import BarExtendedSerializer class BarViewSet(viewsets.ModelViewSet): diff --git a/back/app/views/shop.py b/back/api/views/shop.py similarity index 77% rename from back/app/views/shop.py rename to back/api/views/shop.py index 5bf4a8c..d32b378 100644 --- a/back/app/views/shop.py +++ b/back/api/views/shop.py @@ -1,8 +1,7 @@ from rest_framework import viewsets +from api.serializers.shop import ShopExtendedSerializer, ShopSerializer from app.models.shop import Shop -from app.serializers.shop.shop import ShopSerializer -from app.serializers.shop.shop_extended import ShopExtendedSerializer class ShopViewSet(viewsets.ModelViewSet): diff --git a/back/app/views/spot.py b/back/api/views/spot.py similarity index 77% rename from back/app/views/spot.py rename to back/api/views/spot.py index dbc3d46..4da1ed8 100644 --- a/back/app/views/spot.py +++ b/back/api/views/spot.py @@ -1,8 +1,7 @@ from rest_framework import viewsets +from api.serializers.spot import SpotExtendedSerializer, SpotSerializer from app.models.spot import Spot -from app.serializers.spot.spot import SpotSerializer -from app.serializers.spot.spot_extended import SpotExtendedSerializer class SpotViewSet(viewsets.ModelViewSet): diff --git a/back/app/views/user.py b/back/api/views/user.py similarity index 77% rename from back/app/views/user.py rename to back/api/views/user.py index d76e36c..94960fd 100644 --- a/back/app/views/user.py +++ b/back/api/views/user.py @@ -1,7 +1,7 @@ from rest_framework import viewsets +from api.serializers.user import UserSerializer from app.models import User -from app.serializers.user.user import UserSerializer class UserViewSet(viewsets.ModelViewSet): diff --git a/back/app/serializers/spot/__init__.py b/back/app/serializers/spot/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/back/app/serializers/user/__init__.py b/back/app/serializers/user/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/back/back/settings.py b/back/back/settings.py index 4858873..ef9432a 100644 --- a/back/back/settings.py +++ b/back/back/settings.py @@ -49,6 +49,7 @@ 'django_filters', 'corsheaders', 'app', + 'api', ] MIDDLEWARE = [ diff --git a/back/back/urls.py b/back/back/urls.py index d8f30d7..af89994 100644 --- a/back/back/urls.py +++ b/back/back/urls.py @@ -18,5 +18,5 @@ urlpatterns = [ path('admin/', admin.site.urls), - path('', include('app.urls')) + path('api/', include('api.urls')) ] From 92cbcb4ba1e6f9a13094ace0935f789affe06958 Mon Sep 17 00:00:00 2001 From: Asiberus Date: Thu, 1 Sep 2022 15:26:46 +0200 Subject: [PATCH 005/204] feat: provide static with nginx Provide index.html with django --- .conf/development/back/Dockerfile | 12 +- .conf/development/back/run.sh | 10 + .conf/development/conf.env | 5 +- .conf/development/nginx/Dockerfile | 9 + .conf/development/nginx/default.conf.tpl | 17 ++ back/app/templates/index.html | 87 +++++++++ back/app/urls.py | 7 + back/app/views.py | 5 + back/back/settings.py | 4 +- back/back/urls.py | 3 +- docker-compose.yml | 23 ++- static/dist/BeerCrackerz.bundle.css | 4 + static/dist/BeerCrackerz.bundle.js | 177 +++++++++++++++++ static/dist/BeerCrackerzAuth.bundle.css | 4 + static/dist/BeerCrackerzAuth.bundle.js | 117 ++++++++++++ static/html/modal/deletemark.html | 9 + static/html/modal/editbar.html | 20 ++ static/html/modal/editspot.html | 20 ++ static/html/modal/editstore.html | 20 ++ static/html/modal/hideshow.html | 30 +++ static/html/modal/newbar.html | 19 ++ static/html/modal/newspot.html | 21 ++ static/html/modal/newstore.html | 19 ++ static/html/modal/user.html | 15 ++ static/html/popup/bar.html | 23 +++ static/html/popup/spot.html | 23 +++ static/html/popup/store.html | 23 +++ static/img/favicon/android-icon-144x144.png | Bin 0 -> 26520 bytes static/img/favicon/android-icon-192x192.png | Bin 0 -> 36166 bytes static/img/favicon/android-icon-36x36.png | Bin 0 -> 4953 bytes static/img/favicon/android-icon-48x48.png | Bin 0 -> 6710 bytes static/img/favicon/android-icon-72x72.png | Bin 0 -> 10559 bytes static/img/favicon/android-icon-96x96.png | Bin 0 -> 15584 bytes static/img/favicon/apple-icon-114x114.png | Bin 0 -> 19589 bytes static/img/favicon/apple-icon-120x120.png | Bin 0 -> 20817 bytes static/img/favicon/apple-icon-144x144.png | Bin 0 -> 26520 bytes static/img/favicon/apple-icon-152x152.png | Bin 0 -> 28529 bytes static/img/favicon/apple-icon-180x180.png | Bin 0 -> 35717 bytes static/img/favicon/apple-icon-57x57.png | Bin 0 -> 7985 bytes static/img/favicon/apple-icon-60x60.png | Bin 0 -> 8492 bytes static/img/favicon/apple-icon-72x72.png | Bin 0 -> 10559 bytes static/img/favicon/apple-icon-76x76.png | Bin 0 -> 11490 bytes static/img/favicon/apple-icon-precomposed.png | Bin 0 -> 37850 bytes static/img/favicon/apple-icon.png | Bin 0 -> 37850 bytes static/img/favicon/browserconfig.xml | 2 + static/img/favicon/favicon-16x16.png | Bin 0 -> 2524 bytes static/img/favicon/favicon-32x32.png | Bin 0 -> 4365 bytes static/img/favicon/favicon-96x96.png | Bin 0 -> 15584 bytes static/img/favicon/favicon.ico | Bin 0 -> 1150 bytes static/img/favicon/manifest.json | 41 ++++ static/img/favicon/ms-icon-144x144.png | Bin 0 -> 26520 bytes static/img/favicon/ms-icon-150x150.png | Bin 0 -> 27906 bytes static/img/favicon/ms-icon-310x310.png | Bin 0 -> 72237 bytes static/img/favicon/ms-icon-70x70.png | Bin 0 -> 10329 bytes static/img/logo-small.png | Bin 0 -> 39243 bytes static/img/logo-social.png | Bin 0 -> 1402462 bytes static/img/logo-text.png | Bin 0 -> 40227 bytes static/img/logo.png | Bin 0 -> 134117 bytes static/img/logo.svg | 113 +++++++++++ static/img/logo/center.svg | 88 +++++++++ static/img/logo/circle.svg | 44 +++++ static/img/logo/comment.svg | 1 + static/img/logo/debug.svg | 1 + static/img/logo/delete.svg | 1 + static/img/logo/dollar.svg | 42 ++++ static/img/logo/edit.svg | 51 +++++ static/img/logo/hide.svg | 75 ++++++++ static/img/logo/info.svg | 180 ++++++++++++++++++ static/img/logo/label.svg | 91 +++++++++ static/img/logo/photo.svg | 47 +++++ static/img/logo/precision.svg | 1 + static/img/logo/star.svg | 1 + static/img/marker/cluster-icon-blue.png | Bin 0 -> 25884 bytes static/img/marker/cluster-icon-green.png | Bin 0 -> 25889 bytes static/img/marker/cluster-icon-red.png | Bin 0 -> 26867 bytes static/img/marker/marker-icon-black.png | Bin 0 -> 3183 bytes static/img/marker/marker-icon-blue.png | Bin 0 -> 4033 bytes static/img/marker/marker-icon-gold.png | Bin 0 -> 4274 bytes static/img/marker/marker-icon-green.png | Bin 0 -> 4203 bytes static/img/marker/marker-icon-grey.png | Bin 0 -> 3534 bytes static/img/marker/marker-icon-orange.png | Bin 0 -> 4167 bytes static/img/marker/marker-icon-red.png | Bin 0 -> 4230 bytes static/img/marker/marker-icon-violet.png | Bin 0 -> 4190 bytes static/img/marker/marker-icon-yellow.png | Bin 0 -> 4159 bytes static/img/marker/marker-shadow.png | Bin 0 -> 608 bytes static/img/marker/user-position-shadow.png | Bin 0 -> 5439 bytes static/img/marker/user-position.png | Bin 0 -> 5225 bytes static/nls/de.json | 121 ++++++++++++ static/nls/en.json | 121 ++++++++++++ static/nls/es.json | 121 ++++++++++++ static/nls/fr.json | 121 ++++++++++++ 91 files changed, 1977 insertions(+), 12 deletions(-) create mode 100644 .conf/development/back/run.sh create mode 100644 .conf/development/nginx/Dockerfile create mode 100644 .conf/development/nginx/default.conf.tpl create mode 100644 back/app/templates/index.html create mode 100644 back/app/urls.py create mode 100644 back/app/views.py create mode 100755 static/dist/BeerCrackerz.bundle.css create mode 100755 static/dist/BeerCrackerz.bundle.js create mode 100755 static/dist/BeerCrackerzAuth.bundle.css create mode 100755 static/dist/BeerCrackerzAuth.bundle.js create mode 100755 static/html/modal/deletemark.html create mode 100755 static/html/modal/editbar.html create mode 100755 static/html/modal/editspot.html create mode 100755 static/html/modal/editstore.html create mode 100755 static/html/modal/hideshow.html create mode 100755 static/html/modal/newbar.html create mode 100755 static/html/modal/newspot.html create mode 100755 static/html/modal/newstore.html create mode 100755 static/html/modal/user.html create mode 100755 static/html/popup/bar.html create mode 100755 static/html/popup/spot.html create mode 100755 static/html/popup/store.html create mode 100755 static/img/favicon/android-icon-144x144.png create mode 100755 static/img/favicon/android-icon-192x192.png create mode 100755 static/img/favicon/android-icon-36x36.png create mode 100755 static/img/favicon/android-icon-48x48.png create mode 100755 static/img/favicon/android-icon-72x72.png create mode 100755 static/img/favicon/android-icon-96x96.png create mode 100755 static/img/favicon/apple-icon-114x114.png create mode 100755 static/img/favicon/apple-icon-120x120.png create mode 100755 static/img/favicon/apple-icon-144x144.png create mode 100755 static/img/favicon/apple-icon-152x152.png create mode 100755 static/img/favicon/apple-icon-180x180.png create mode 100755 static/img/favicon/apple-icon-57x57.png create mode 100755 static/img/favicon/apple-icon-60x60.png create mode 100755 static/img/favicon/apple-icon-72x72.png create mode 100755 static/img/favicon/apple-icon-76x76.png create mode 100755 static/img/favicon/apple-icon-precomposed.png create mode 100755 static/img/favicon/apple-icon.png create mode 100755 static/img/favicon/browserconfig.xml create mode 100755 static/img/favicon/favicon-16x16.png create mode 100755 static/img/favicon/favicon-32x32.png create mode 100755 static/img/favicon/favicon-96x96.png create mode 100755 static/img/favicon/favicon.ico create mode 100755 static/img/favicon/manifest.json create mode 100755 static/img/favicon/ms-icon-144x144.png create mode 100755 static/img/favicon/ms-icon-150x150.png create mode 100755 static/img/favicon/ms-icon-310x310.png create mode 100755 static/img/favicon/ms-icon-70x70.png create mode 100755 static/img/logo-small.png create mode 100755 static/img/logo-social.png create mode 100755 static/img/logo-text.png create mode 100755 static/img/logo.png create mode 100755 static/img/logo.svg create mode 100755 static/img/logo/center.svg create mode 100755 static/img/logo/circle.svg create mode 100755 static/img/logo/comment.svg create mode 100755 static/img/logo/debug.svg create mode 100755 static/img/logo/delete.svg create mode 100755 static/img/logo/dollar.svg create mode 100755 static/img/logo/edit.svg create mode 100755 static/img/logo/hide.svg create mode 100755 static/img/logo/info.svg create mode 100755 static/img/logo/label.svg create mode 100755 static/img/logo/photo.svg create mode 100755 static/img/logo/precision.svg create mode 100755 static/img/logo/star.svg create mode 100755 static/img/marker/cluster-icon-blue.png create mode 100755 static/img/marker/cluster-icon-green.png create mode 100755 static/img/marker/cluster-icon-red.png create mode 100755 static/img/marker/marker-icon-black.png create mode 100755 static/img/marker/marker-icon-blue.png create mode 100755 static/img/marker/marker-icon-gold.png create mode 100755 static/img/marker/marker-icon-green.png create mode 100755 static/img/marker/marker-icon-grey.png create mode 100755 static/img/marker/marker-icon-orange.png create mode 100755 static/img/marker/marker-icon-red.png create mode 100755 static/img/marker/marker-icon-violet.png create mode 100755 static/img/marker/marker-icon-yellow.png create mode 100755 static/img/marker/marker-shadow.png create mode 100755 static/img/marker/user-position-shadow.png create mode 100755 static/img/marker/user-position.png create mode 100755 static/nls/de.json create mode 100755 static/nls/en.json create mode 100755 static/nls/es.json create mode 100755 static/nls/fr.json diff --git a/.conf/development/back/Dockerfile b/.conf/development/back/Dockerfile index c2b8ce1..22dd886 100644 --- a/.conf/development/back/Dockerfile +++ b/.conf/development/back/Dockerfile @@ -3,6 +3,10 @@ FROM python:3.9-alpine ENV PYTHONUNBUFFERED=1 WORKDIR /back + +COPY ./.conf/development/back/run.sh /scripts/run.sh +ENV PATH="/scripts:$PATH" + COPY ./back/requirements.txt . RUN apk add --update --no-cache postgresql-client && \ @@ -10,8 +14,12 @@ RUN apk add --update --no-cache postgresql-client && \ build-base postgresql-dev musl-dev linux-headers && \ pip install -r requirements.txt && \ apk del .tmp-deps && \ - adduser --disabled-password --no-create-home back + adduser --disabled-password --no-create-home back && \ + mkdir /static && \ + chmod -R +x /scripts COPY ./back . -USER back +# TODO : Set user back, was removed for the collectstatic command to run succesfully +#USER back +CMD ["run.sh"] diff --git a/.conf/development/back/run.sh b/.conf/development/back/run.sh new file mode 100644 index 0000000..d54eae0 --- /dev/null +++ b/.conf/development/back/run.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +BACKEND_PORT=${BACKEND_PORT} +set -e + +python manage.py wait_for_db +python manage.py collectstatic --noinput +python manage.py migrate + +python manage.py runserver 0.0.0.0:$BACKEND_PORT \ No newline at end of file diff --git a/.conf/development/conf.env b/.conf/development/conf.env index bf5fb41..48a7b32 100644 --- a/.conf/development/conf.env +++ b/.conf/development/conf.env @@ -1,3 +1,6 @@ +SERVER_HTTP_PORT=8080 +NGINX_NAME=beer_crackerz_nginx + # BACKEND BACKEND_NAME=beer_crackerz_back BACKEND_HOST=localhost @@ -14,4 +17,4 @@ DB_PORT=5432 DB_CONTAINER_PORT=5432 DB_NAME=beer_crackerz DB_USER=postgres -DB_PASSWORD=postgres \ No newline at end of file +DB_PASSWORD=postgres diff --git a/.conf/development/nginx/Dockerfile b/.conf/development/nginx/Dockerfile new file mode 100644 index 0000000..011070f --- /dev/null +++ b/.conf/development/nginx/Dockerfile @@ -0,0 +1,9 @@ +FROM nginx:1.22.0-alpine-perl + +ENV NGINX_ENVSUBST_TEMPLATE_SUFFIX=.tpl + +COPY ./.conf/development/nginx/default.conf.tpl /etc/nginx/templates/default.conf.tpl + +COPY ./static /vol/static + +CMD ["nginx", "-g", "daemon off;"] diff --git a/.conf/development/nginx/default.conf.tpl b/.conf/development/nginx/default.conf.tpl new file mode 100644 index 0000000..60400be --- /dev/null +++ b/.conf/development/nginx/default.conf.tpl @@ -0,0 +1,17 @@ +server { + listen ${SERVER_HTTP_PORT}; + listen [::]:${SERVER_HTTP_PORT}; + + location /assets { + alias /vol/static; + } + + location / { + proxy_pass http://${BACKEND_NAME}:${BACKEND_PORT}; + proxy_redirect off; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $server_name; + } +} \ No newline at end of file diff --git a/back/app/templates/index.html b/back/app/templates/index.html new file mode 100644 index 0000000..b83bc15 --- /dev/null +++ b/back/app/templates/index.html @@ -0,0 +1,87 @@ +{% load static %} + + + + + + Beer Crackerz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

+
+ +
+
+

+

+
+
+
+

+
+
+ + + + + + + + + diff --git a/back/app/urls.py b/back/app/urls.py new file mode 100644 index 0000000..81f905b --- /dev/null +++ b/back/app/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from .views import IndexView + +urlpatterns = [ + path('', IndexView.as_view(), name='index') +] \ No newline at end of file diff --git a/back/app/views.py b/back/app/views.py new file mode 100644 index 0000000..cccc50e --- /dev/null +++ b/back/app/views.py @@ -0,0 +1,5 @@ +from django.views.generic import TemplateView + + +class IndexView(TemplateView): + template_name = 'index.html' diff --git a/back/back/settings.py b/back/back/settings.py index ef9432a..54f98d5 100644 --- a/back/back/settings.py +++ b/back/back/settings.py @@ -149,5 +149,5 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ -STATIC_URL = 'static/' - +STATIC_URL = '/assets/' +STATIC_ROOT = '/static' diff --git a/back/back/urls.py b/back/back/urls.py index af89994..c194655 100644 --- a/back/back/urls.py +++ b/back/back/urls.py @@ -17,6 +17,7 @@ from django.urls import path, include urlpatterns = [ + path('', include('app.urls')), + path('api/', include('api.urls')), path('admin/', admin.site.urls), - path('api/', include('api.urls')) ] diff --git a/docker-compose.yml b/docker-compose.yml index 4bf5cdf..9bfa768 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,26 @@ version: "3.9" services: + nginx: + container_name: ${NGINX_NAME} + build: + context: . + dockerfile: ./.conf/development/nginx/Dockerfile + ports: + - ${SERVER_HTTP_PORT}:${SERVER_HTTP_PORT} + environment: + SERVER_HTTP_PORT: ${SERVER_HTTP_PORT} + BACKEND_NAME: ${BACKEND_NAME} + BACKEND_PORT: ${BACKEND_PORT} + volumes: + - beer_crackerz_static:/vol/static backend: container_name: ${BACKEND_NAME} build: context: . dockerfile: ./.conf/development/back/Dockerfile - command: > - sh -c "python manage.py wait_for_db && - python manage.py migrate && - python manage.py runserver 0.0.0.0:8000" environment: + BACKEND_PORT: ${BACKEND_PORT} SECRET_KEY: ${BACKEND_SECRET_KEY} DEBUG: ${BACKEND_DEBUG} ALLOWED_HOSTS: ${BACKEND_ALLOWED_HOSTS} @@ -19,10 +29,9 @@ services: DB_NAME: ${DB_NAME} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} - ports: - - ${BACKEND_PORT}:${BACKEND_CONTAINER_PORT} volumes: - ./back:/back + - beer_crackerz_static:/static depends_on: - db db: @@ -39,3 +48,5 @@ services: volumes: beer_crakerz_db: name: beer_crakerz_db + beer_crackerz_static: + name: beer_crackerz_static diff --git a/static/dist/BeerCrackerz.bundle.css b/static/dist/BeerCrackerz.bundle.css new file mode 100755 index 0000000..355eee7 --- /dev/null +++ b/static/dist/BeerCrackerz.bundle.css @@ -0,0 +1,4 @@ +/*!******************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerz.scss ***! + \******************************************************************************************************************************************************************************************************************/ +@-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif;position:relative}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}main.beer-crakerz-map{height:100%;width:100%;z-index:10}main.beer-crakerz-map .new-poi{text-align:center}main.beer-crakerz-map .new-poi p{font-size:1.6rem;font-weight:700}main.beer-crakerz-map .new-poi button{margin:1.2rem 0}main.beer-crakerz-map .marker-tooltip{font-style:italic;text-align:center}nav{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:absolute;right:1rem;top:1rem;width:4.8rem;z-index:20}nav img{border-radius:50%;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;cursor:pointer;width:100%}nav .cmd-bar .cmd-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin:1rem 0;padding:.2rem}nav .cmd-bar .cmd-wrapper:first-child{margin-top:0}nav .cmd-bar .cmd-wrapper img{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-transition:all .2s;transition:all .2s}nav .cmd-bar .cmd-wrapper img:active,nav .cmd-bar .cmd-wrapper img:focus,nav .cmd-bar .cmd-wrapper img:hover{border:1px solid #b9b9b9;border-radius:.5rem;-webkit-filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);padding:.2rem}nav .cmd-bar .cmd-wrapper img[class$=-on]{-webkit-filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%);filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%)}nav .cmd-bar .cmd-wrapper.logo img{padding:.1rem}nav .cmd-bar .cmd-wrapper.logo img:active,nav .cmd-bar .cmd-wrapper.logo img:focus,nav .cmd-bar .cmd-wrapper.logo img:hover{-webkit-filter:inherit;filter:inherit}.notification-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:3rem;justify-content:center;left:calc(50% - 15rem);opacity:0;position:absolute;top:-4rem;-webkit-transition:top .3s,opacity .2s ease-out;transition:top .3s,opacity .2s ease-out;width:30rem;z-index:40}.notification-wrapper.opened{opacity:1;top:1rem}.notification-wrapper .notification-message{font-style:italic;margin:0}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .3s,opacity .2s ease-out;transition:right .3s,opacity .2s ease-out;width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:1rem}.zoom-slider p{cursor:pointer;font-size:1.6rem;font-weight:700;margin:.5rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider .slider-wrapper{border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:lime;bottom:0;position:absolute;-webkit-transition:height .2s;transition:height .2s;width:100%}.overlay{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:hsla(0,0%,100%,.8);display:none;height:100%;justify-content:center;opacity:0;position:absolute;top:0;-webkit-transition:opacity .3s;transition:opacity .3s;width:100%;z-index:30}.overlay [class$=-modal]{background:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;padding:3rem 4rem;position:relative;text-align:center}.overlay [class$=-modal] h1{margin-bottom:3rem}.overlay [class$=-modal] button{margin-top:3rem}.overlay [class$=-modal] .modal-close{color:#999;cursor:pointer;font-size:2.2rem;font-weight:700;line-height:1.4rem;position:absolute;right:1rem;top:1rem}.overlay [class$=-modal] .button-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center}.overlay [class$=-modal] .button-wrapper button{margin-left:1rem;margin-right:1rem}.overlay .edit-mark-modal,.overlay .new-mark-modal{width:calc(100% - 2rem)}.overlay .edit-mark-modal h1,.overlay .edit-mark-modal p,.overlay .new-mark-modal h1,.overlay .new-mark-modal p{text-align:center}.overlay .edit-mark-modal .rating,.overlay .new-mark-modal .rating{margin-bottom:1.2rem}.overlay .edit-mark-modal .rating img,.overlay .new-mark-modal .rating img{cursor:pointer;height:2.5rem;margin:0 .25rem;width:2.5rem}.overlay .edit-mark-modal .rating img.active,.overlay .new-mark-modal .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.overlay .edit-mark-modal .rating img.active.selected,.overlay .new-mark-modal .rating img.active.selected{-webkit-filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%);filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%)}.overlay .hide-show-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:15rem}.overlay .hide-show-modal .item img{height:2rem;margin-right:2rem}.overlay .hide-show-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .hide-show-modal .item input{margin:0;width:auto}.overlay .user-profile-modal{height:calc(100% - 2rem);width:calc(100% - 2rem)}.overlay .user-profile-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:25rem}.overlay .user-profile-modal .item img{height:2rem;margin-right:2rem}.overlay .user-profile-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .user-profile-modal .item input{margin:0;width:auto}.debug-container{background-color:hsla(0,0%,100%,.8);border-radius:.5rem;color:#000;left:1rem;padding:1rem;position:absolute;top:1rem;z-index:20}.debug-container p{margin-bottom:.2rem}.popup h1,.popup h2,.popup p{margin:0;text-align:center}.popup h1{font-size:2rem;margin-bottom:1.2rem}.popup .rating{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;width:100%}.popup .rating img{height:1.2rem}.popup .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.popup .rating p{font-style:inherit;margin-left:.5rem}.popup p{font-style:italic}.popup h2{font-size:1.3rem;font-weight:inherit;margin-top:1.2rem}.popup footer{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin-top:1.2rem;position:relative}.popup footer img{cursor:pointer;height:2rem;margin-left:.5rem}.cluster-icon-wrapper{position:relative}.cluster-icon-wrapper .cluster-icon{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);height:50px;line-height:50px;margin-left:-21px;margin-top:-13px;-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s;width:auto}.cluster-icon-wrapper .cluster-icon:active,.cluster-icon-wrapper .cluster-icon:focus,.cluster-icon-wrapper .cluster-icon:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8);-webkit-transform:scale(1.066);transform:scale(1.066)}.cluster-icon-wrapper .cluster-label{background-color:#fff;border:1px solid #000;border-radius:.75rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;color:#000;font-size:1.1rem;font-weight:700;left:15px;padding:.1rem .4rem;position:absolute;top:-15px}.leaflet-control-layers.leaflet-control{-webkit-transition:all .2s;transition:all .2s}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)}@media (min-width:720px){.overlay [class$=-modal]{max-width:50%}} diff --git a/static/dist/BeerCrackerz.bundle.js b/static/dist/BeerCrackerz.bundle.js new file mode 100755 index 0000000..6d614a2 --- /dev/null +++ b/static/dist/BeerCrackerz.bundle.js @@ -0,0 +1,177 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/BeerCrackerz.js": +/*!*****************************!*\ + !*** ./src/BeerCrackerz.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
\n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Boolean}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
\n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server\n _this2._user.id = 42;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-store', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

\".concat(_this5.nls.map('planLayerOSM'), \"

\")] = osm; //baseMaps[`

${this.nls.map('planLayerGeo')}

`] = plan; \n\n baseMaps[\"

\".concat(_this5.nls.map('satLayerEsri'), \"

\")] = esri; //baseMaps[`

${this.nls.map('satLayerGeo')}

`] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.store, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.store, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.store, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.store, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
\n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this7._map.addLayer(_this7._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')) || [];\n\n for (var i = 0; i < marks.length; ++i) {\n iterateMarkers(marks[i]);\n }\n\n marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-store')) || [];\n\n for (var _i = 0; _i < marks.length; ++_i) {\n iterateMarkers(marks[_i]);\n }\n\n marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-bar')) || [];\n\n for (var _i2 = 0; _i2 < marks.length; ++_i2) {\n iterateMarkers(marks[_i2]);\n }\n\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
\n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/stores/bars marks. This label is basically the\n * mark name given by its creator.\n *
\n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.store, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/stores/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
\n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.store, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/stores/bars must be given as an argument\n *
\n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
\n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
\n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate(\"assets/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(submit, \"{{\".concat(options.type.toUpperCase(), \"_SUBMIT}}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(cancel, \"{{\".concat(options.type.toUpperCase(), \"_CANCEL}}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i3 = 0; _i3 < _this8._marks[options.type].length; ++_i3) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i3]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
\n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{{MODAL_DESC}}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{{MODAL_CANCEL}}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{{MODAL_DELETE}}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
\n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{{ACCURACY_USER_MODAL}}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{{DEBUG_USER_MODAL}}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{{BEERCRACKERZ_DESC}}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/stores/bars\n *
\n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{{MODAL_TITLE}}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{{LABELS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{{CIRCLES_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{{SPOTS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-stores\"), \"{{STORES_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowStores'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{{BARS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{{MODAL_CLOSE}}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === 'true') {\n document.getElementById('show-stores').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-stores').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'store'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
\n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
\n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
\n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"saved-\".concat(options.type))) || [];\n marks.push(this.formatSavedMarker(options));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(marks));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/stores/bars) and for the user marker\n *
\n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.store);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
\n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n type: mark.type,\n lat: mark.lat,\n lng: mark.lng,\n name: mark.name,\n description: mark.description,\n user: mark.username || this.user.username,\n userId: mark.userId || this.user.id,\n dom: null,\n rate: mark.rate,\n marker: null,\n circle: null\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * This method will open a mark edition modal\n *
\n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
\n * This method will delete a mark after prompting the user if he trully wants to\n *
\n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i4 = 0; _i4 < _this13._marks[options.type].length; ++_i4) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i4]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The addDebugUI() method appends the debug DOM element to the document body\n *
\n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The removeDebugUI() method remove the debug DOM element from the document body\n *
\n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
\n * The updateDebugUI() method will update informations held in the debug DOM\n *
\n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
\n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
\n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); + +/***/ }), + +/***/ "./src/js/MapHelper.js": +/*!*****************************!*\ + !*** ./src/js/MapHelper.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"assets/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"assets/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); + +/***/ }), + +/***/ "./src/js/ui/Notification.js": +/*!***********************************!*\ + !*** ./src/js/ui/Notification.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); + +/***/ }), + +/***/ "./src/js/ui/Rating.js": +/*!*****************************!*\ + !*** ./src/js/ui/Rating.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); + +/***/ }), + +/***/ "./src/js/ui/ZoomSlider.js": +/*!*********************************!*\ + !*** ./src/js/ui/ZoomSlider.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); + +/***/ }), + +/***/ "./src/js/utils/LangManager.js": +/*!*************************************!*\ + !*** ./src/js/utils/LangManager.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"assets/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); + +/***/ }), + +/***/ "./src/js/utils/MarkerEnum.js": +/*!************************************!*\ + !*** ./src/js/utils/MarkerEnum.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-blue.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-gold.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-red.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-green.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-orange.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-yellow.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-violet.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-grey.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-black.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: 'assets/img/marker/user-position.png',\n shadowUrl: 'assets/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/ProviderEnum.js": +/*!**************************************!*\ + !*** ./src/js/utils/ProviderEnum.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/Utils.js": +/*!*******************************!*\ + !*** ./src/js/utils/Utils.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default'\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); + +/***/ }), + +/***/ "./src/BeerCrackerz.scss": +/*!*******************************!*\ + !*** ./src/BeerCrackerz.scss ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.scss?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerz.js"); +/******/ window.BeerCrackerz = __webpack_exports__["default"]; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/static/dist/BeerCrackerzAuth.bundle.css b/static/dist/BeerCrackerzAuth.bundle.css new file mode 100755 index 0000000..1c16b47 --- /dev/null +++ b/static/dist/BeerCrackerzAuth.bundle.css @@ -0,0 +1,4 @@ +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerzAuth.scss ***! + \**********************************************************************************************************************************************************************************************************************/ +@-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}body{background:#fff;position:relative}aside,body{height:100%;width:100%}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:grey;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;justify-content:space-between;max-width:40rem;position:absolute;right:0;text-align:center}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside main{margin:0 4rem;text-align:left}aside main button{margin:2.9rem auto 1.2rem}aside main p{text-align:right}aside main .login-error{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s}aside main .login-error.visible{color:#ff5454}aside footer{margin-bottom:5rem} diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js new file mode 100755 index 0000000..1bb8466 --- /dev/null +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -0,0 +1,117 @@ +/* + * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/BeerCrackerzAuth.js": +/*!*********************************!*\ + !*** ./src/BeerCrackerzAuth.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n\n var _init = function _init() {};\n\n if (document.body.className.includes('login')) {\n _init = this._handleLogin.bind(this);\n } else if (document.body.className.includes('register')) {\n _init = this._handleRegister.bind(this);\n } // The BeerCrackerz app is only initialized once nls are set up\n\n\n this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](window.navigator.language.substring(0, 2), _init.bind(this));\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_handleLogin\",\n value: function _handleLogin() {\n var _this = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_SUBTITLE}}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_HIDDEN_ERROR}}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_USERNAME_LABEL}}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_USERNAME_PASSWORD}}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_BUTTON}}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_NOT_REGISTERED}}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_REGISTER}}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('serverError');\n });\n }\n }, false);\n }\n }, {\n key: \"_handleRegister\",\n value: function _handleRegister() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_SUBTITLE}}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_HIDDEN_ERROR}}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_LABEL}}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_1}}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_2}}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_BUTTON}}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_ALREADY_DONE}}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_LOGIN}}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('serverError');\n });\n }\n }, false);\n }\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); + +/***/ }), + +/***/ "./src/js/utils/LangManager.js": +/*!*************************************!*\ + !*** ./src/js/utils/LangManager.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"assets/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); + +/***/ }), + +/***/ "./src/js/utils/Utils.js": +/*!*******************************!*\ + !*** ./src/js/utils/Utils.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default'\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); + +/***/ }), + +/***/ "./src/BeerCrackerzAuth.scss": +/*!***********************************!*\ + !*** ./src/BeerCrackerzAuth.scss ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.scss?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerzAuth.js"); +/******/ window.BeerCrackerz = __webpack_exports__["default"]; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/static/html/modal/deletemark.html b/static/html/modal/deletemark.html new file mode 100755 index 0000000..90c09b0 --- /dev/null +++ b/static/html/modal/deletemark.html @@ -0,0 +1,9 @@ +
+ +

{{MODAL_TITLE}}

+

{{MODAL_DESC}}

+
+ + +
+
diff --git a/static/html/modal/editbar.html b/static/html/modal/editbar.html new file mode 100755 index 0000000..567b294 --- /dev/null +++ b/static/html/modal/editbar.html @@ -0,0 +1,20 @@ +
+ +

{{MODAL_TITLE}}

+ + + + + +
+ rating-star + rating-star + rating-star + rating-star + rating-star +
+
+ + +
+
diff --git a/static/html/modal/editspot.html b/static/html/modal/editspot.html new file mode 100755 index 0000000..b3430a8 --- /dev/null +++ b/static/html/modal/editspot.html @@ -0,0 +1,20 @@ +
+ +

{{MODAL_TITLE}}

+ + + + + +
+ rating-star + rating-star + rating-star + rating-star + rating-star +
+
+ + +
+
diff --git a/static/html/modal/editstore.html b/static/html/modal/editstore.html new file mode 100755 index 0000000..a734711 --- /dev/null +++ b/static/html/modal/editstore.html @@ -0,0 +1,20 @@ +
+ +

{{MODAL_TITLE}}

+ + + + + +
+ rating-star + rating-star + rating-star + rating-star + rating-star +
+
+ + +
+
diff --git a/static/html/modal/hideshow.html b/static/html/modal/hideshow.html new file mode 100755 index 0000000..ac4adaa --- /dev/null +++ b/static/html/modal/hideshow.html @@ -0,0 +1,30 @@ +
+ +

{{MODAL_TITLE}}

+
+ label-toggle + + +
+
+ circle-toggle + + +
+
+ show-spots + + +
+
+ show-stores + + +
+
+ show-bars + + +
+ +
diff --git a/static/html/modal/newbar.html b/static/html/modal/newbar.html new file mode 100755 index 0000000..19b9f64 --- /dev/null +++ b/static/html/modal/newbar.html @@ -0,0 +1,19 @@ +
+ +

{{BAR_TITLE}}

+

{{BAR_SUBTITLE}}

+ + + + + +
+ rating-star + rating-star + rating-star +
+
+ + +
+
diff --git a/static/html/modal/newspot.html b/static/html/modal/newspot.html new file mode 100755 index 0000000..bd47f37 --- /dev/null +++ b/static/html/modal/newspot.html @@ -0,0 +1,21 @@ +
+ +

{{SPOT_TITLE}}

+

{{SPOT_SUBTITLE}}

+ + + + + +
+ rating-star + rating-star + rating-star + rating-star + rating-star +
+
+ + +
+
diff --git a/static/html/modal/newstore.html b/static/html/modal/newstore.html new file mode 100755 index 0000000..df6d5d1 --- /dev/null +++ b/static/html/modal/newstore.html @@ -0,0 +1,19 @@ +
+ +

{{STORE_TITLE}}

+

{{STORE_SUBTITLE}}

+ + + + + +
+ rating-star + rating-star + rating-star +
+
+ + +
+
diff --git a/static/html/modal/user.html b/static/html/modal/user.html new file mode 100755 index 0000000..5e08a14 --- /dev/null +++ b/static/html/modal/user.html @@ -0,0 +1,15 @@ + diff --git a/static/html/popup/bar.html b/static/html/popup/bar.html new file mode 100755 index 0000000..247c625 --- /dev/null +++ b/static/html/popup/bar.html @@ -0,0 +1,23 @@ + diff --git a/static/html/popup/spot.html b/static/html/popup/spot.html new file mode 100755 index 0000000..a8bc30d --- /dev/null +++ b/static/html/popup/spot.html @@ -0,0 +1,23 @@ + diff --git a/static/html/popup/store.html b/static/html/popup/store.html new file mode 100755 index 0000000..25791ce --- /dev/null +++ b/static/html/popup/store.html @@ -0,0 +1,23 @@ + diff --git a/static/img/favicon/android-icon-144x144.png b/static/img/favicon/android-icon-144x144.png new file mode 100755 index 0000000000000000000000000000000000000000..b4d43bb36e435bf61fd0caf942e6329e24293e51 GIT binary patch literal 26520 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/android-icon-192x192.png b/static/img/favicon/android-icon-192x192.png new file mode 100755 index 0000000000000000000000000000000000000000..197cde42dedb880e18aca2e1efc473e2f92d5096 GIT binary patch literal 36166 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 AIsgCw literal 0 HcmV?d00001 diff --git a/static/img/favicon/android-icon-72x72.png b/static/img/favicon/android-icon-72x72.png new file mode 100755 index 0000000000000000000000000000000000000000..b0938fdbae5920f09f164b6a1313a06064800c07 GIT binary patch literal 10559 zcma)i2RPM#-~UNMWMxwso$S4xjBH0XN%lJSJPsK}k(3b*vdPX*NcKuXR+1zMA!LWh zi1@$H?|$z4xu55{pX>T}#ku&tKi|)KkJsz<_Rv62laid39DzVkqP5hF;8Tn6MMeVO zudP*UA`mBnTvb&KTpb(`h`=u??-g8(PtbR5PK6k<78OOXsG(XoQ8#FWx(xG~i776{ zC8&`mr501p6>+jR;OH$Ws6quz&s%2s`};5uw^P%|$ndB$@%d_TC_k9ards&w*SM?S zFcqEjHBSP$7FwS$s9uD}B0u!N+q}RZdogPESgUyl)s=6qay^ z$XpB~y84OoV~u1NSL&*kiBv6Lionp6M@XEXvu5UZzjH_8=Z<81C#;+>UYFb+WIi{cIP)w>z16r+K`r(j!pe+w|a6TGB(PWN)CB%tLo3SDt?px z5%T-)H{t738`GR6b!IJMv+LWE^b=67dPcxlnlG*c+d5=JFS)$dHO#;8HWd-3({4;iy>i_auE7itOKXl@} zpLT`oMDKlV8iU7-=g!mGurm999CEEaSR3{h>2uAl8-|y8JQ>=}#GA;QVfUVcSpdPonlnYuiEj`qp92FVe82wq6<9 znXqMz^XJcN;gMwFPfq0%D{CQ~$iiu;)lO(!QP}qt5heMIL@%EThHp8C<3eQN$yr&4 zqtphPnxuD#9xxDdTF~4h;<%14tg#hkUfDgMw646qwtH}@ZAxF1nfOYc!4soWgHjXx zQ_~Rj6gSH}gKdiN_e5EEWT_6mko5^W+0o7LU*#tyPm^Cs;~?8QrEGSJ{@~V2i!8ko zUl*4L?d{4Wq@=#G=VIgIXEy^k_HQwrKt^-1#*sv{-x>4Z=Hd!}`jl6Yk%A<`PKUnB z>4_S?@FX62?PLLBO4@9S^@{PGhcv`?=^SLo0yJdwaj~&x!NI|ci;GX{>zSG--|g+m zTE~-C4r+4HaL|y^oFPd>y4o9t-%-iCQfiWK!Y@K3ATOWABH@&foUEpzLd2caTVcYl zuZ6EM#uv6BRHwKNrpT`(O*3=f4eDFi5~?vT|6N?nZEkM9xW3-K7BGuL`8HYxwpzDX zi@aPx&>Kk^(qj^IxanXAwdT4W9)hl}u7xEfbaZsH^y-^_Xnd&5>5qH$CqBp!xkS$l zFcQxkwA*eRy?m)?Y-M$xl9KYwnKMrq)s39rAvrnkQY#%M6o2PFR8&&T)hFR)K4Zg1W=@mX)PRy`)XWV*V#K8}ot$;v($Uh4F!AO7$`B_N=V z@ABo4f-w(axR4kmdfgv~lWh~$k~#C9-hxhq?6p48-B$%`Yisv^{=}MFSX7O#O$4u$ zPu$*}JST^}x4i83qjBNFSvtCOIX~_wYIdi4?E3CL~;OaJWbkakr*M(%#-)xLR)X zEE+#I7@gnKv&idKoALX1a4gA5efdpd3P!;vm6h?F2Q+uD+!9~PBpz8d9;NEn|2Ytr$-A81FfaSAuY`q(-p2)a`M$Y)~mGX8sETiTjy(Lir;E$t4jzAYd3hNEy1`Po##{(d zcD?eAeU&H*rEP3XclqXzxsRpBPfhrZjEv0MLKRM(It9M%P-R9#d?LO(qJRGN!qy3n zXf9MXRh&iy68(8CAR{A#S3qEPt~UuT=ZR_ASd+g%45N_!*Oq-X4UPN}H8JX;Le%qo$-}xB$Ka+n{A<*Z1-g z4%z)t^zvoSxOZDNgMg`lg+;$e=qANss1jV+DGElP<3GDexw-MCWks#6+11X2*dG&e zsLPjG&Yg3-b?aQ)l+tEdsR{EL60VCE(c0Qv5)w&SS?6GPKFyQKsi`pF0zW@L4e?z# zU(*W9-oyPZv2>lo!v!TC8JX1PA5AgQ(d3Z8(iK9auciuL;^O*Nh(yPqw9$(~4@-TJ zAXfhT%}18}s5?dn0a`nb(mJ=C-xwasjK%$G>cjBd6A#j}G@ezSKN? z{aVFCnho|f|GCORQc7yZN4CN}0uqiR4P4;T(vqNcOIp#@R3l5vx4lU`V^t2M*REYV zLrqP0hU7Fc5pRk%EMJuQ%-bxvq{ojL3Af3gB52iA^WH<+I}y2rezL$O##@s@5x!9= zoVt<@H?Dr|8bdh8`{7|#$XD@7N3x!to{$sjye0{^E+!^MSXZt4C~W0(YlsZ{?QPo0 z$w{p2roVcgK|(^pt7rxRv*rLHr|R^{=9|?H-Biy^1>lF={IgusZKOWeyqqFl?jLl&Mi=x9Q^ zaCE$9T%zZDxaWI@Lw^ZmWM)EOIuGTmw`{zoKpc*@{b7SF_Gaam^)I_q${d1%vG?u~m{@~MOLK1c!B#EM=J-})J@rQ)qVZ_OKWRgE|M?oyU2C8lU8G5 zR!&Z?u()VDssv7RZ!82O|d=a4jdyt^O>WC}~(M4psIq57P2Z@;OqY9@e;+FF0}%eFnGmM?F~ zjg5^ZKYlDOEzRA1+t`?wT=`1b2tGMkQnl3N(+U677mHkXa>9;+?ubUJY#Q0v*qFMy z^4-3D`!fkC3o9!GC~<0kBoYnjD(BWuG@)Y^`~m ziWuz?A3eE|v2pLacTQhhg4ER2?P|@(YTcPG2dvuSaP)0c@xx0<0Rf7%jhNz#gjv=C zK9yTUA<n3*`88Tnz?BBieCAyQpFcCt zIylH?>rHso9}2w7l!^CW`BddSrKotcH(MsWlc;&YZoV(&x(RiW5&G6Gc{nNpZh?UK z_U#+5pdeC4hAF964RWcJl$2$I&j~Q&ph;uYVh=kMtDg$Jyz;5Mpr$6duTML?o#R40 zX~}Re%<16Z0QU`$Xy_pB@17Te*~;N>kxzgKRphfK}JhaFyo1TO#U zqp|$nbOdDefYr~+H*T;%0#DQ7&I$Z>nw)~7c zY-|O!wJC{-wEd1phg_ozMiL*?>CWn(iw&TjUsrh~KJobV;BY&-fb<(iw3 zp&cBIB9Bzj^Th=O{G5qm$8Ikg(vzPe*g!!oZfnbpSN#3p(IYA-x)9Ivb>m*(G)AVT zZ%U0zywcQ#goJKww3Ev3&n3OhRm%PF!3Z{GU3v3tp>LKRk7-%Tj~`xwj8`|2BtIVq z(MAv}_w4N7s)xzMQK(>AS(I%sM_h3<8*V^=?m zF^X8f9oAQhGcB7RkePBEt+2Wm6}8n#r~e#|K+Vu`_s8VNk00MpOz3E9lMgEFo+~Xa z9d@F91^JHPzQ2}79^~^@_rU&xehv*85(*2ffh;`XHcLeD=Uk$aVb|5ArFOWnX&?vb z3cbC(^b8EX06v?VnkpJ)(ReaqqFej(sp47?^cSV1QUFPY?lw=+o+04_UxM^9Gh?TH z^(qhEJ6K_BVUR~jDK})jHTBQIuHW>l6B-&C2E6pckCxzdvccQD0@o{$a&qb4zdNO? z=Q-n=C%3n^MHLmjAQy-vAeVf4sB|$2R6XZeSzmkA&jvJOd=5j~JRF$>&F)xNEWd_Zi9z{@A(t#^z<}T2<%_?983oNa+7`C<0p*D&tp;2U zXg<$z^K48dGyMlLH2#B1W4eJW)XF}TNHo{}{yvmrs}YMF{)Knhv!iWCQfx9_NPrAL zS2)NB$sh38%fp{n>paKrkFH?a!%sc4sHdtNy$aFi{4NX5ee1m{weQhkkepr!U_irC z6KqZ}>cji@SFT@Yg7>!^A01$&E)nBlGyp-M6<92mm9A)G3-K4xbTF8s z08x7u5JvXRuV{z|K*TB9kz*d;p;S!gMP10x%e(72UZ>0U1g;tCOXHuN@hUSxvvSjP zb>no&^iOfucep5_pv8Y(D+`=U)a>c) zoq3<9YI5xwEelKUt5>gTKEcl6wF_TE)-i8lS;Vj0y@F^vE@RE^n0d9Z#UjZ%5ZiB} zLvt^%aZ$G z5OyBY<26hq8~Y2n)vm+b(b3Ta5N=;Jjcw%R<(>Xy;avng4g#t_XB!Z#mac9QY0Uer2B&0TDP$xny7WYJ(u?AE zVmX`II|JZQ^ufh+b#;M3z3%A1T>qm1a1UVk;_`C-^XCbGPO5@`xdp6$9oShL2l2qs z$?4}}L45w`3LL!i!Oj{aX>kdOpw+5wK<+g)H9o($UF{tlf{ykV_D3p1r9AII8U#4F zvEgIO^$Y*_@f%2Cv5*(9d16)Z^}VHt(uj7ByS6mhdQn3z$jg^AfiKPAP_ABH8kM8{ zBx@R-3tK~DW4(i+I}&4`zt7Ey0>reozL1`t4j_lXK(Ah<0N_30+kM{A(b2YkoKHxo zsJuLmKzM$wj1Essyd`D7MG#TSO>HFHS?~${u>8BH{S3{_v`kGI{r&x8V`F>1D%wb4 zt#YW(Cd~1NBhm0~mW0yUEw&W!`8w|@JxHxn`|ob@^7GrzzKJ{B9}IJXc!!Zb{X+H6 zL;nPiX|-*=y9`tbqOV=)utN!9U}dEX@DOsQ!_MlM{O`qrn)-VEm@ea7PRHa^%C8*7 z#iXSJy4H11^;{k@%lrUAdM zK^T>d08Sf|hZ)}GDh=kTMhP#gXXteIBxjMoPtz_{G12W5Aixq2>Bf4VP9gv`?Y0ee zcWht#P5_|-Ch`mkt0;Ug;z@Zm^sj#pRD(+ZYn9`p=f8GKx>1Geh zdiz!fihyk31_$^kguLtIxUDDg($(X!A1b@{fjyy}dwUyqcfv#3 zT}8;7->`-3$=9!tHrQ_5xFJJtsGnl6DgpG)!n?IANna5y$_$bGSlCKiPmc^>J>_d~2wB$MKcgzFpKPPZUt+8v+L;7O$H(6ut z4}Z{gk}z#8t1n(X?^J4PYEoL7mXp(W$_P3<;64z@ z0{3R3zzB6*&&ejHV z`BvtvK8cHtwtvB7aWr2-G)JU&Ly!@~T=Q~9(1$b%5{D@eDJdxs@y{K5&o-*~7JSdTE@9O@v0Op_>zb>xjhwG`qox7wyV3lzpFN3ijJrN0E( ztmn?nbt@f-0V?G^*j;x9SsEbSo9=Evdiem@LE?c)K)c)C-39mqHzkA11popsfV`L@ z@r0AwvS8@R@X~uX|IY4i2T|rXNHl+Dbgz0&4H7Mt&npdBYCr*`RaCYf2^tP^=+DdB z2MxPlLmJm#9t5t{j=l^SeFIW8`>l-=q|_H2A?65a1`>SZDUswSGOTfcPK`l3;vn-F zdx0^37@|zm07FGt<5tJ(^^YE5u~(@Tav|Bv$*~yHXGXM7tB-#xLVX}jMk0|kbaWBc zl|btYhL?oxhn9v*`1tr{?vh^MxOj2ay_y%PSCRyzB;dzH?^v}nK|Wa6n!z@L>IL`@ zDiI*t3EZ$Q_Vhw9_(c0jYWXXW3QP2JACF12pDRDS1q1`8K_u(g`&_$&MB}M|S%jFI zvuYI3LLrJMG}5JcH@mq31s76AAk?+u*69^A=&h}-t#kA9iMhG@AiaZix#?9LP7-bf zuy;?+pIWt&;mywu@q|$;<@IxcMny(>BYJn>gkk4}MMZYv>8nX8BQYP9NnE1O|7FUb z!UO4R-V?Gh)T1F6N%0s^1p*J&>M_?2q&wGl9U!MZe8{P&m;>$$IJQFha_fc)3^4*?WVR;w!fe=e#r8H1 zLc}rQ3`y&18F7U2*W0^R1n=A#bMEc$KQO&Q&Oi(j2N^ZBX4%NuKCFhidSY5y;G{cj zdvmpV(8$oRy?Onmz~!2JUTb1KGc#tGhn9|Q7LRo0NupCVp69w#{CrU)pZBreJ4IXZ zOi&-0Dd}{`OEV_D7DleyU~stPflQgOi&HNAS3sB>Qj0~BK|DPHm2tG->C?rGslm5z z9k;#@0Au{QTvpllC{MdInes)i<7*FTIwq#>tW~)O`DQ3Ngx`(SF$|?i()kO*wiC9Z zg1f=38PJxHtAcjVd@6{!9@0?o%m5TY6n^~lN$+xcsFbU_dqH(|5{L(&NSQVGaB?T{ zZO>NST(`Cq9>q-czkNFgidMUQ)do}~Ysa)&RJQz0Miv${94WwXz&?-2!Z(O~SR0<* zT^0vMp5H+pX|E5>gb8jYuPPnUUKh23p`LfM1gR7BD@a)$lT9gyhliCZCKL|`7iNKY z+=An#r>F06HA-`tqM)E?Ufc@jNXX3{1P$OJq#xLQmVA)WQLcHx8<#U3j^euVnt`&w z=pY4)%CX?~v{xIsKuhT%t#PmYV&7`bJ~BLfk%?BdvQ(-Xcq)+d8#OMpyOTHBAyn$> z>dNlZ3@1X4067vQR~!!K1C)%QUl8QwvE2_VzX)X8<7*2G;4OkUx894U830>bA5Br6iOPcdHa-R4!YJffCo&_hWB%goE;3?en= zr3V1Fu{RrE?J*_}3Gy?@?{RT);^a57jlQ0biHQM!Wi#ea8H~x_Bdr__ z8F_TT=7p?$_N>#bR$Nq+V=(*CBkMCpfq}9hV-OSw@ODU39gxUe+}$$+R{BN=Fg+uq z52$w|uq#7e`j%gxELtGTVe3RYvl2)z(9$ZywF5Sv2t8N>89VSx+}v>XNE#=!O{k(A zMiMV-%7*L+o;-OHyPglw11bP?6^u%u&|2oOjf0RzkOhTPWAv5&Bwy5gWME@6I6XaG z(@w5S3VLG|)DT7?^Lu(Fvx`Foged+vI!edF!bknwMT+%I(ljWO`T6;vJa7ZO2I1IV zI+OaI25p5**=Fti8;bjLbjvF%gkz?n>a%(duxfv6VGE>L0&Ndi`w}_0a1jO)Ix4_` z?W@cd*VYKl2WSnUP$*_*W?1lQz8z!1kQQtc7(b!0l#-$jT2VlA_H1{2HHb-&kGK&- zZu?96VcI}eL4<7g5VsT0#Ebwx`TeCsaQKUxFiX^LE0=SB)zt-HJ448tZBm(W$e11tPsq;R?laF))TPnQ7b4EPLi zCAchP;*Q0+Le49pp^7V`l{_?L(5~wFIp05zzS9v!?f0$oG)vaFS92T)m7!~Qo7k|X z!iM!i!l~|EP@)(B7r;x-vat!I2G*Jj#moOB196%My0y0tc7SI*0Ok&43GRw3nhRv@ zgn}IdFLONdqg!p(qcjkFq45e;>HX+vw`cvN21s5Yq8=XJ0`3H*TwK(vJ`;Exv?9RP z%b;ZVHWK|IzPQZPc>ezVVAXy1>8ogb&c`L3(!2it5J_(CH*nq>?(PB|9UY(7R3U#u zHPzDBcLu6Y0He@0Nqg{sOwJIHfg13QD5~?{py18xhyA9bmft{JyEXzPJ!5Xp@%O<& zIs`B9NN@>1@T9(=d;?jKvQ@Cyv)Yk(P^X=oxCyPb!opaAls=hD=-=15={99hA458f z2lLn<-)w6^-=xSWNLol}O%v48B!?M7;qGv&{rRJLolvD4{T6x#2U7)D6B853!e6m@ zx3t62-+(R+bjAuax>(Xac-&8eoMaLCE8vaX&MwA_B0oIol2W z`I`Eh2`ImOF$EqT((17ZVh?B~DO6Oagq0zzUUNH(GT$<$x#w0rcK8QE>;N}lD~S9kB8fG!u5 zR!M0o?8_B-1_lOzsKm+%F^RyErhc~*9hYkwOG-;axd|UZz1rJj=1+;<-1G&_Zsf0P zX*zbW&<)V5eojYF0~}QaF3ujh$4TIsX<`l}wY9Z`4#4WF2N1RRsdde=p(i6ta|L`( z0~x=L7l!DsBTiTNG@v0|va_>sH*W%B0IBoEAT;{tt%StI&z6n!EiUqco&$fNFuwLU zX%%owOxNpJ76~mqy`vSmi8=l&Rsr(xmj?|)UiJM{-#^a!s@&bU&Y;f#0SKIG%;WL- zmu+8WeJf5pKKr2Y!-=bkxr5VN`yZjjpZ1{zSziFs;=}w!2KCJkCm;7+LZc|m?!K}a zIdOHAXr*%VK}B2d)Ldro@yXBg*;FXX^Skh;Czo*QW;jPX90uip#lQzbTvS|4NK{Tp zT*5?D4ka#u5|+E`59oa z#&(`Q9vFnIAP3?9*)>HTu%i8!m8!RgH`dt4&H;lEqs}Bk!$Z!0Jye4wnz(xYW0@#e zpr|Z|m>5b_3MDGzsKF!*#&rKOR)+tUY&@$+-__CiSSV|=cI-G%>P_wU;f zmy$N{5j_c(=l?Iue{2X0ACUZ}2SeWfV5n`Nu8H=-VXzJ^c3#dH4R5Tc9S$KOCT(Gq zdkV&g{{N2ouhWH?6cyj8477u>{QqIBfr~fJ+Y^Jsx;p$lE$ka-hx>cuXBnbdVHC%I z81)Z7B6yU6Yaqr0Au%&LU=Fry1Y7tkIh2F9PY~AC*#(C%@VEDHb>L9*_Ox^Ls!J5J z05h(CnmJ#UE2G*df4KE`a&`P$D9(1n+|{R|j`tZ>)36;Q4H@ zWhT7Egy1tMl$y7LzbD2Ehe8>EsUJeDQ4GfpxvVfi-`T?i>$kPim&_o_sEyquL@nCktn_vro|cw*8L;u5lQqN37r z2~9y@Lj7;=F?J2cAVgJElJgZ;;gRXTJ-TLuMmV{8U|{Pao?bW)Z)XuFy8u@QZ!bTQ z|IRrgQgX8PlJ*i(qOuq}ag3ylthk&U2IC+LNC)F6>0mDmBZOgn(;+w?m;r%S*Hf!d Hu?_!!s+N~p literal 0 HcmV?d00001 diff --git a/static/img/favicon/android-icon-96x96.png b/static/img/favicon/android-icon-96x96.png new file mode 100755 index 0000000000000000000000000000000000000000..4b8a3530a4c95b3404ee6bf965e5bf6cc73a6a14 GIT binary patch literal 15584 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-114x114.png b/static/img/favicon/apple-icon-114x114.png new file mode 100755 index 0000000000000000000000000000000000000000..d1a119460982409ebfacf7e16a92dbbc8816cbd8 GIT binary patch literal 19589 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 OG}LsCK36pl{r>=N8csa` literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-120x120.png b/static/img/favicon/apple-icon-120x120.png new file mode 100755 index 0000000000000000000000000000000000000000..ad5eba2e9bb1b2d5c95c8886087d39e57510675d GIT binary patch literal 20817 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 Yg$S;1Fv!;vpFq;lFi?M_W)u1U0r|A0NB{r; literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-144x144.png b/static/img/favicon/apple-icon-144x144.png new file mode 100755 index 0000000000000000000000000000000000000000..b4d43bb36e435bf61fd0caf942e6329e24293e51 GIT binary patch literal 26520 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-152x152.png b/static/img/favicon/apple-icon-152x152.png new file mode 100755 index 0000000000000000000000000000000000000000..b61a66348b89f8352bd5e6e0ee866f5af335f775 GIT binary patch literal 28529 zcmXVY2RxT;`~DXhStT=sM^=%LD3wu}p`?VYtRx{MNr)B_QAUz%l1)hV-pWd{SCLIo z#{anA-~W9-Jw1=g_r9;|I?wZ1SAOTTRT*eGX-Om!gSy)3^Y}S}_(4O3e{xjv{YN5^ z-MMz^)VXUG79^6}x0mfFY;?(3Y8D3X>To6|`tCk0_vt@5gPjLzbmBO+(Fq0ypQa8C zPhuEL{ExTLg~f=D(Nj!skJ0N}w;WlwRqWU)D=VzbzVD_QpVE_|XvWC_=b}Gn3kUr} z2VxHi%y{8Oy_}HDcTje( z7x|fPhR!_c8vgKKY8MXY?|UiwdC=}|pz~GLs0nB8O)2ipBMsk;8Gk>j8Vq_|ZLG`{`5F!r5rs0^0L5TnwcO7O~CQ1>7a_BQmph z|K1-Fzce^M^k4D^{ZEpkbIZ~NUae2pHpn_MoLcpwC0DT*d=_fwwMZm)Ari^^0g3b% zU-JGzBHfZ8k*3T@BsuIFyW{JRI>+$~ROV+?Pvd9&Z|zjE7k=9AsAk|yBGK(4evp0X z_gu#psa@2yl&QzJvu|gYUA2>KCy{KPsh?K5;P!21<93A6_{+H%+jD5xx=DlANc7M|k&Zmp4ylLL1rUJpjDwJh9>IOe;XJ0g2Km6+IlCM7jB+nTVC zmk;E37F~|M9DVB6c$SyfuWy;}m}!DZ|J+WrdA<{PX*>6A?sjJW0Bb4TCZAWZLOt); zjz#J<-*u%;KHdVgm}N>2!-RqY_80$Rsp$hu^1X#TNDnGicg|CkDrY)rYqtt-gvzrn zdU2QYds|YOdvD{D98n{g-xn$8*?di#r{uWpqDwWd}o>P=%cuIaxk-eSKg`%q5V|8g= z-gov7qgjCT1%BFyZt^ZgreGg(nNR`sSM^(>O*uzS#q45m@6OU5xODg3u;)P%TWqSBBGtL=c2wQ*-utQA)%|JOS2sL8 zwW<;}fvry>b zfMunb#M_=}N>bI^m-k8jKYx*0$&XP^xvx-omc^{C-4PNN-p$K<)z;R( zx7UCyMQtX5C!i(XUF_~s<%AA5Cj)1fk!{Acqa`K>N$jkw${rra{rvo@>*_3Wd)ud1 zo|{gqO2%uI_m%%QMBDgii*o>ZGQ-e&}L+YUcCD?}p>z;?y)W z_zxcl97_=R<$BD$#N=?Ilz&?{6*tL~%X99pF?nw?j~NqZ)6sN9HA;qMwxX)@f zhrbC9efjA!axu9lw&$m0R7-Vrb#Pdiio3fUUi<5et2Aezy9uv<=5NE*!Y4WVRy(if zojqJ$IrJrd^}>!gQW|~xnUDvAb64HnUsY5nQBhHGU~xS?O;*qEFT7BuLD{=vlQpiH z@b@EkA-~cG{eT1166tyY18-F`JK}q$KmUBu;?rWici%q0=4MSPDXAxcfy$XZX_LR> zSFdG~-Mz0@zIBbNH+h#CQ|u#`A+n(}BHx&9eMbGC@|-KQD=Qn#33_R-&QR*(6eT1GjK3<8mo^Oi z%Kc-7c1Vnk?&i&#mR45J!^2fio;)eg{$0fI7v+#_`OcUxJL{4e&8|51-rrMhG2D}) zW_IiLZRhbu)}-X*s$vBN&$1mcJpl?k6_Y!d*x6O>?ZpiY47g9YzgU`VJ4ovKw`Tg_ zUS=@2kHm)uRJs+EYMgSfC zb0fcg)pv4o5)l#6r_Vb#T_pElY-CDku{kL=xp`-#fipUV5k51*xWWsWjwx$ew!`*Yaj&X66R9PYm1Jdn2R($B}fA;YSLm{I2dM z<923r&sc8%{JHhV4-xV3%cL`uk$)$#R!9oaWDGcaHx?6DZ-eU`;6z#~1A z%#e%cjia?dB1?D6IhV+SzyT#+usNlE1PpEiA6xxG}D(@RzB-zu)MS+w<42xn=CWmVdl8O+3NqLVI`jqd8;cz5|o> zWtks7Y8$k!UD^@VqGDww`1$kaLL>1H4uctDKH92h&+fpdG#`uR*ziOnM+M!Q?tYFw zapOjM`&X6t=ZbvZeKY2E9Q_BXc8xF>j)z@d{dIM2d~uv@!g`XX zAy#mh{qSW;d3kLtz|WsQf4In{i8aMgNa-m4c6V^dq?Y##T~oi7#WB=WZc17U5g2wV z`tjq(&|>15r-4BM3C@;_z0)h^(wzIm#H!6C+IxG|ot+OkJ3GHmO^q!oilk!~#}l8z zHxCy#j!R1m@bMvco&D~omo}alZo-?L}d_OtZP&yJGF@0a^HKIQD2{`Je!)irE!(aGQ6 zKTBWC&>&2fY)e)n^2~-$bkcie4n^FY@{*9wci|X2=ZLsi^iag7m1Q}u%7Nt z=Ll3mH&os~F-jG&-@?M;^^u!Ccmf%Rf#xKwsCFA^48YGF9lm|zai2cDt}ETV<@)Qp z-)9>E4ti9UZ`H73{O6rC+p^B=V#|Gqv*he)vMq?>K1n+{G%|AcyLa!N`1z3~ZqCfz z7Z_?77#Lt$U6t;wBhR9794Bp23esN*w~BoJoT)WNq3xyUr3dOR#V@1Hb#$1Hx&Go4 z7JmHZ4NvLT#@r!H#(;yR^+bz2h1u4fVcZmU;PTf32VUW`Z^lah%~sjTboBN%^yXfD zxo3R534`QM**>{w8aI`&KATF(gSRZ+Qn~ESZ_wC9`|!xUztZ6cO_Nemo&<8qp1*kU zVU784wIB0q`FpSMg~b*J`PPrOu17{hln*-wM@M6{Zd+ocHjI9T&i?yX@2NX?j^^eb zl9rbK(%-*_$#eVX?;cE#t14a{zOJUFr5uuQn&mnZoyS>&kbxjdOWtHZv2B}-ZfYR{ z*ZFq7MGvm6ReAL25n6g-zx{W6S@G}yqM?@lvqyXSIX5>sQWKzg_Ux!@agp0XoPJ8@ ziwlc%i>WCod>r&6OKUdh45nKvrjb!mqxhXhCGNLsYGgSBiTNKKta$$XF3f)cK|v-i zE>Vpen2+uyJQ&?9iXH!yAvI3omT#?#W3FiQfF}}3)&5s{8 zvBm)b0c%ZV>u2;bO&GjQGV82!nP|2}ym?dm)9H!?M@mMldVNca#bD_@ zqmM58_)FOn($eS(`n0sP7FH0XRThDoNHI-j|mtlHXL<9#heE08)3`SXA#HNc$G zoa`*yRUYl-7j%-H`txtWy`;IVjaUsdB6P9%l9FgNdGx!;$jJXV=xKwswY2=^UPVL< z;p6dc+d~_wCt9M=#Mnu$MMfy8ScBr?;@#ZbmMA2mb$55`O-xR*SFim2_iy3Oz12_h zw6t`W%|LHTr>;uga8R6Vkq(y?WZzAe@m->@lute6^YqFW?CILlWF)2x3D0!l z;>DXoz-Tryh7@ym6dhQohz>mq$_Mu(-H(gkHYWVHVo$&OP1TwW+$v zN1P|Kqs`CHUmp`z zxZ>){R$_7%^@@Q-!cnx4;6T^c7h@Y49W}_cX24sbJ6jt3CO=5N<$b>0O;^$Nke22C z`AZ_Nntq@WT)P&Vo&CI_K^;v5Ck3S@WB5!sh6&YK% zNw!Gr6IDU=oWC2Mz#R`KoQhdntfV5pez?JP`GZ}>u;ctlrb$9sSxnoB)uYco-F@(= zmI{p|==dTH&KTYwe`>WW)AM1~uzpT^c6PSiw>-ZScYmML)jj3pBqbO9?3~Dhwn+;Q zkJnA%2c2iX9~C$LnDFASrWVRm-lhFwm=*bb($bRuwKDgW{psoHY9V=V$C5BK^RM@u zH!;!1vZ%!Cj4?YDjk94zjyMjHlF!CiySsB5ghj^0Baycyj5U9h}kd8vMH z&^bN5+F!rKwAf#@|8zk!*>^MN8KcSFnZv*tS)`rVbiB!8QQN&|Em5+e!NJ~oX{^N` ze*bnQkVQkN@Xy&&?2YRo>&PL%tXE^!x*x>+5L@)7irNv_x3qii@Mr zUuVm(G`#$?0|S#ays2h={kV2AGw7S0o!E{O%R6xhKq8=+;7pI9hDKHw3~|Db zdaiHV*x0biH`F_WgKKo9Khby)gufH4BYY_`meXFeW%>P zghN9@DzS}UfnV{h1%!nBy%+F04xbjN{{5c8urW3&5Kxb3u^t&20rSPbZ2kz^q%jCf zO-~;$9^4Q|-(Fu%R!B@qp(z_|18Z4uJFcHD^Ine*>z>vHtWFCICnPI-sbBCmg%`uG zNvg1a9$y(JD0dBaW~$!g6eX(n$lc#!RaI5|EU~o?Xy+Vz_9OyqkOgU>Pur4jec@3=bSPO9LT!d7glplNT2Iz6s~Y+}vD5RFrki2!c}E zB=e4(>g;6UlC`&Nd3E@;+%138t-n3=J9Y#( zUz6s<(z>lL)U7RsmuV^~-8bhq5}%rya+^v`cKh9X^_s1%p_#dS`iP6%&tJdBz85(g z6**CYd!fKV{`2yr-=(FgtE*oD(@9NDrOdeBGc9=HMD)sZPiSihR&Q(bAxfBvAUR^f4fi&Y!RBDgAx;!;QX2HRk^v zIKTi@JT%0YBNorLn*>Y>;3zE;D=2$z3tP6Tu)kh@S2@32+8o)YVMs!?BA?>*>!R!j zO)Ty0wW~jVXW|nT7ssJ}1R=yooITn&I`6{=sbjKdR8*+uJ}ohB{mtBJ1Z$`+LJh4} zvX_>}Y^}xU8XEd*CtKLtKRfl9aiNNLGnj&!QS45oSI_A%tLFo@H*VBmB))pJ-z4qb zyI`wG$O>1au3o)b^Zrqhr1|MV_pPAt^%Uafk>u>AY?`OBBj04c4l zt!Zj%O32CWZ=H53l89=VnotWO&*6Ey;V1kiSb?@)Ub>urJ>&e)7R7rq4sPy**isX} zFKPSu!s!Z{9`=o1X&vShJp6F+;<$i-z&SjtlEd5dlE4q$GHA2qv8NuN?q^d(j|@8T zo5OUi@e+_9X=xc88L4h) z$O%wi`TaZ1b}C%@L8^Zj zlxZ0l>;}C4{8{JsOkW*JI_**>oAN91@H2M)-^FFKZ)W2g`I-xjo~t*gRq$8%9b3u5 zG?WwjK;VN$NHtWAmX;QfYP!c#J8498ewhU;N<3+sPRxzhO|gz@sl8OX$O>GwI=sWH zkk6hXI6S;=G)SQpQw`t;m|EQAQ+?UizcOcNSPLg)Pj-4=Lz@Cb8XFr6j*1d3x6C(; z1SD~BVZq!(&BdNm6Zkmjv7|LMJ?&6$k2wrrcxNK=>W|skiL+bFXHg&mK*S1v;}!U2 zWWsRLLqIDR*32Z-uogiIn@1i#d}vNxbnl-l$X!)hW+{L!xR#WpFFQwYehzIqejIOYBOYV&NOK*85~v#wB})qwhC*>>$WasMfZk`LsXphlZu z~cri5ypMW<#re1qWOxi%Je@sn{ zK-M@J|Je+X)G(dSaO&^hziOJA2}wy*(b`vOGiUY<-8#KAKpncnihr+b;FhV`9zF(o z`gZWR<>fq)5*^ON9xqoCw3mM%rl zW!?Q_PftYwB7Dj8-b>z%AF7bW?u}*nYA5d%6nvPIBZZDqi^0?KcV#-;FkMqi>*mVT z#n;-&KQdoqB-KCPi?R)cs^#JFX|)6;%75b)bVduQ$U={`MIX!Gs!Rr9yZ7uNCX0T$ z-s0k-M5Jb%K|*eBDB!bVgVOKi<=~euYcR0U5qzn4NS!#Lb?OuaF+@(~e5>1iQ!V5{ z-ROVv@+J)bQpAGl)`E*0chF}&aotqCzZEW^F7&uc3BTXh*SB)=d=RuRann*w5tdy? zmGBGq?wtVkh)quq1jeLH6uooj&N}uWk<Lxz7GT$PfN3~vwI3OO&}Jq5j1vC zEyK%~L8!jp>M_P->*(%wJteybGlGCQQjsE1y6j|#iG&&gT!rEg(8j>Xc;3*k@mv1& zqZpyYgx|QgQU2xk$NEzTR&dZNETz;%j*c@8tuvoJ&h+;!-#3n%Ok*BU=)S_W{ZpPqoJ*>&P-y+wfLdwE$q9cfigRwvpTQePF<829s32(F;Kt1Q!M6I8wbm*1-P75pG6s4m59Q z(pO}nYEG26{0wniS5;Nr&BbK_Mp*TD2lSn7S^PChmd;t3wpgNwrPapHR(||uWjqiFT`o+WZ9I%!JHv7BR)&_KMvL_$+W%dMA4HIfnSQs1B zA{r`R=%TuyvWaKHPuJW)kGOd8BD%Lf?V~=2vON&~fJU$PWC+U2hC{yr?7^}mXJpJi zy2{jP9N%S|SXjuB+pCFUM|UU0`t5%L-yMatuOm21Ij7zoN3L0-(9qEE)lSCS?ZpGP zJv$5cL2xuVEMj$JHy8w-14_MP(d$B^*@r`hr&WJC71=mABm{FT zTFl#B0#!~yd)3v|g=&$F27)6EcdIf+?7#uRy?ZH2OoF;>S?!Jrh5BK>OCCDpe2Of| z=RGR9u&?U1UgyChr2;EgDJJ{cb41&Un{3|G0{-r*Ao&FfU}lGVgsB# z%B8>Dn&D@^`F4Qr1q{F^YDVI+CYd|V9$`!1vAtaOjU~48DfN+?BM(wsNj1U*n>5{A z499lu<)8;5XzDntaNxo}YF79N5a(CX%P)Vh@82I%Oqh#{q`_GTmW$tJ!I(o5GM5_ASg$vad zK_^tSwHZORzkhEIJu9z%`}Uv59~VLdvaMS^}b>D#lSKR3}@HzSU@=V@Zp1C%q1nZ`F{&P^L#FK!_-;&x!_*Kx3n7+1Oj6K z6bu)+XdXd}Ty~pJ1JlLg%)5V=(2J}y{ZS7|*u%vY4`l?HN3isgWm;L!G%M+HE4yD{ z;CS2SuQtM=z*vWW;kjDH>oijBwTJ^sH!0v^_X?*Cyj-d19AsFCP8&_nXvIzGQ&bXAYKBKi{h=pJ(wpGP1#I zBXjHJOkY8Khw)aMu9hu8BpyB?G4XkDFyChXup?n%SXk^03=E9BdFn=HQ)8n!)Cctt z!nNMJ_msfxfREjfDQ|l}SOT4Y*DGrK*ar6JmGC$4Ho|YK;MXn*Bjt_aYxw%QnxNdF+ ztVF(9?!y>fa~`LyYKMX*^e;@S(Yl}|NC6%{mVoo;{Ha} zlcw>JmzPXp-@ku~PDwb(Jf5ppU|qpuGoCj{be`f&Olh0kaog@;#rV>dCvWSg=H`;K zvV!qDEe*uCTf~mKN8HW$b19j0oAetr7mP+%H+0ow^ZF2N)Jay$#u}s`!l=W$Y{%h5 z#J_t-d(M0PS8kiskt3_I4vVk_R!7*&p7h&ab#hufbzKRf1EzPfc68i_4`G0!WbQas z(3p1b-hJW1g)CGW7-&|nozMO3)Kot}zm9={Rx}TyqYW=)jaxc8249W27X~;9FE{nw zyAk4J%gRipy;6438eivQ+_t{DA?G2lK;>(?kXZHFQa&aKIERXwT1`z&F+|`l2i?EI zXDZMCY}2ovy~&Ve7$N}8mV<+X<`9*5r_mWr3kfxeyyNA-vdR)&<4)NQgYrPv3d=3| z`eNVj&XusRvH5Gq?4Zp;VL!ip9EbxRETRl3Nj2~A@bCadI~SL{At7B|OSq4pz;8hv zpX{zkC* zQ?Tmhc=;5{yfM}+4NUgbR^R{Ar)3gEmHT!+Aqh?@>JVOhnDV#{ zk$vgtcy1M$lq3WZE1z}Gm+9wlzhT?$bG>65I;&BvN+1cT?=&};f9ODwdl2s+!2z#; zbzk_qcl+UPL2$_{DCp?ytcKbInV+SF8$4_3gGrWhazX+qq{fXK2ilG=HEZoVaK2`A zVgB3o%P?Kq2EPrMkq8ZMX6>ab* zM(pl#6~)Ov|8{e8Rx)J-na1U>->2leyxk18f<@nl8vsKPHQdHuUivXNx1}cgAui6R zva<5Jf@U&vbZgU^LhQLG*j{K9N8IN5(30SE$9=W|pMvak-q^SW=vidnz6zM(@X-cJ z?kexu08hhs0fR#Q!39QoK>klrTWrrXuol1+Bd`+$61Ze4XEP1I=qoFG$MjV(b#woNC9u^a;=>V&(;0;|6x&)K}LTiQ&MGXBFcfvLY8|dumfj6Qe!EriX zC#7z5WJK-E8H<^3`R{2v4D_HZQr?+PFR-z--BlO3U&G^|4n^0kTerS@{+q#q5fBB3 zUHPODNzA8NaA(q)LRT@P$>HHEs1d>ecQuW_KG( zMB6p#(A0b3T z)@TaZ_UpH~xy(Uzx!#$j2??iNY_3{b(!5$G03#YA-n4p7w=G_%EH@_yOFkK1wl0Vr zf_IoB<_x)l_~;u2{VIUGn9GC)cjn_rm+ex=056VsWh|km^E5E`GfI+oiBqbr&rEH zn7-^#@=!au%Dx~J^pHq5;PoM2LqvXQx<0~=KlcE@XWg@mbOnMelwP}mPm$njnnKLj zmrsAE(%>o^{^Dn#qQKmKZ1(iGdkK^p8X4Z)UNO!?@{DNu!#J@7%|m}f$U_kb9U7R? ze36<;Y|Sf8n{0_6oi|Sa`_<o{$(r zL-!hfKl|qRohsTzwisQjDxD@z&v? z)lPkA$=Xk>$w&MO4k!p;7D@mdE6h%spX|e~cJlk)Y7=!eHB7a&hC_}H4s$vELvx80 zb|Mx}ZejlWNl0c6mhH+4TeMNufFciN8#x;o&hYA&RcYU;XjppeW1&S7p~{b07^d8C z*k${Qxj(w-ZiAaMgCTIfVE{ns{xn}n$1UfgmRI+4#hs9lQ8FD#TJKHE-T-D|1m0Qc zx^(o`6bqDU&_JDIiLQHC+1Yd5S8Rbn(I=QK*5K?^|0&zLSD~09a~ZQqr{LBhD-7L^ zy)}2y65!}6)E{#fUv6S4%|+3^Y}RM5eZml7Ji9(enI+A#By#6C zk5JY6<%*%hUZT4!1B9)`!f-O7i%^!M#iA4nuWUEV?BROWvUUW|MF;|bXwX`q?w!P; zdMmvSCwd`jaQzXiy#V;KCu4V_XG7rKFDlv#Z3j#cw&TZ-AHSA)DWFcER{DQogY*uu z8QNB7XXiN`9VHc&M=9HiTz>AlTwu?7_zEj4D>7@NE^^>}v6v`GSbF~Lh!J0SY@fI4 zA+P=VNX4Z5pQ9lmA^Q2Ytdx|LqU3f4y1PG3kf-+2B6iwh9a?EEHB&`;Pg2v_$V4WS z$w&W}gECLk{WEZhfnsj`QM!J8+DAJgXg?$@WN6HCd%qUn&U`YQD%4~rgPsFjf3&A; z^DsefV$XpQYa+GT)z#(W)r1tzw{MLAY%R!ifR&#Lv&!y+@RRuQ<14KwneAS7P&{M@ z+yF z5@rh+^h9O>;waiI(T&@@HkZtQyikd+7Y+8kFhRa{#E>mhDS_=Wo6T_5PZud!*KGWPi?9%(KiFLnXb%`V53U6S1tsGQAwA=teHeZjfZf?;=9J9{ z+7ZxlnH%38v{+lXxLi10(e>=@+`YNG%PT90Yn8s;+_3gX00J2+1eypryQyg}IDPNq z^^NjGw)5|vDu)O}R_bSGX&$!|^sXTpz~SkXGV>}g=a@;?1U}hKBp=#}TH3&d&dGY{mVk>n{%Y zNkd-xp-V>P?+QOl`0(ME;HtEAbl2?dO`LYHU(X&dPdcv#BJ@-xUL|b& zy@YiJm)Uj^K{*s1vehD-^pAY#wEub%>0WGrdA^~t+lX}}70MaVtL$%A<`Iw8tRaV6 zMMiP1U;25!J@Ii2Try9jb@+A;L4hJ58etU=XdwdBYgY^B156S6 z9-$m#^x!i=%ug30$Abhe!hdX9^#%Q|Tv&rD>)Zuj-gR$_x@Y~%>*(kL$RfVKT)+tL z@yeC|vv1W_k<+?m-{(N6uv z#5T_;vuAX{jV;*qyA7gMLw5)Ny-BHUZfc6h!6E7=u1{5~->B3h5?B^nQQz8XLVAx= zfvH=5Ei!=?}iUs3iUxX!L%&TCyg$UpqodJR0THxLKuYL`MCxJ-v#%5GwB?s+87>K~$ zX8DHdT3Ukg@}36XC4+{KPyTm5AnR*YgaLmOndZrcg9ercY(nEz-gGal{T(~Q0bGM# ze=X%9@+MvzJzjxGG}f@2j$x>~m6#AVt9{7|5o#)$&M1cZ6=l}kTYUTATo)D8^G7+dZF2Dvh-sz=_?-oI)D(Y~1;Ebv&HStFu@8Gp|a@qx@ z5A1_5v4M91NPZ`+COvmT55$|PsjL47O&6t8VV+L4o}qj7-5phnNfc zh-rjMW|N-0uc+waGlvk%vAIv782lz)8!J(aSwxmdSQxw$_Z@Vk^7X?m_nZ?st+r=` zGo*$k)KMu}^6BmqS$xN{xXbB9j{h;d=&PLMU44D*U;E-vh=3npz0&%z6DRIMB4(2rKhK#9}7MENVxw)fL%q4%PJ7P4Xq3ZJ?z#edilyUm&xCcdw&oK=VYyI zB{xv_?Hx8e=3%p2fP&-cBMF)lqK`!EWTHfv_0lBe8MAxs)=_MdP&0>#iHG%r<$!qZ z>SM1}YGf;6!3e)`^Fhagrv$kvx^E~e|hDN?PPA3 zEgH(394V{)>K8Av0(ye-n0PEGLyA*}l4X*4sruUml}SLa9GIwJZxJx%etgCh&1;8x zQeXeXtmc0W1mubE{~Su!CbTFbK2lBTE56(&asEO<5=da7tgY9idGG<-6dC7ePR%nM zezvC+6MpCP+5roPguH58{mKC!1*wuZAUe)~a+H)0_V+y%P={@d7NsD=W|P^|bf1D6 z9v)&CNVpNm6{8G+va`(*;DWD@-G1h^UguSfMhS(trLD0s4tNq16B)UKg`&tt*T6Eu zH6wP#3&M^mdnvBl+CmZNFf>4~ zGs*i<_c*@{$3EP40HIToP9;KaV`G-s(}(0bL1xw4K1x`JozoGcmSDIdK>LqtlN$1? zwzjpsJtG_h81AsP*-FFU3n{xf240ZeWyYJF^4_1InrJ*b;G(8TPw!84u-s!{nLPvu z33Hoe#jFh03QWNGw6rste!8-RT~4SFm@EDP0q_8csmgBRcHeojb-Qi~c`-5-#Kgr= zZ-=yqe|5IKejU|zGP7r}GvX`KSRx_Pk(xexXkN7bzL=&*MA&iJ2VN|U3a7;}b->1L zw;%fl4pk0)lz$rihce>y82#SeSNOZ42<_- z#-eWzT(PsGR}axggyEoEF#dTkO8 z=;PvFBry+Yd$IgC`)(BI7#j!HjWS&cLKDF&!^?mh=8J$L;rvUIjaxTpT#xfNTGh~oa!e-UWAIC-Yt)*rkr1yVO;#g-=AMtSorw6 zIYW+nNnx{Zjq_{8r%hfBpT9`>eSR1lOKS|mF|F`5Ae z9hx73oFT;ti;B|0@&-x)Y6kLz56PeMs&iEz82~6-$sa#*Viks~9xL;n1kcA-VD1vS zO6k307zQvrfP{`BHLCS__4$44n6`o;k0uX^ZL7nak6*l7yC8Q1>I7UDWOCI)P9qS5v4G08t)NWfPVr7L-4ehZ4KP5bi2r^dX(PA0%+6Ce{2w7m!b;~WzmuQmFZ@UB0$SK{>2 z1poW*J^|ifQG!yyjUc82B$b=!@RG;)0K~t1InP9+*XxFf2xE5qA-jpb>#I3c*5ZEg zsrFAMb3R!*$TcDs06zO1aY1DKj(Tk#$J4HE$UmRZ-FGDaiqvq{YSmW*z9up;wIiHq z5mf!;U-WO;=-S!6=kUnLYRD67IP|Wnu}iqmI`;tA(bC>HZJVaHw&cXbhlA@AvY=VR zOKU`$jgS^$#S?7-Pz@JIxn%6jMr#A%58-wgLT#|YnEAUCll)K%RK7~|Ed4M$u|G)S z4cwXB!?;Hdxu3^Bo@=V9@nK@YBqQQDl}Di7fCWO41%|@-?sxQtk2(@ERo+>{P!22z zrZw#J@ku}ca6UQG>sPM|=e)mAM}upgRcMAO-^WQ4s*xX9fA4h}8R;bCV>vlaZMTo` z&}+t>4w5~Sb2MJ*5@QQ6d%bp~W_o4uyK@^+B8m+`@6O)DcSD0e6(WGRz-r9ak{4}h zAU4r)en^Qx(cIiHk?3e00k<&{F$TOPfhv*D@Z6X-)kUHUmxG>6BtvV_(Wy94@Vycy zE^(7FL;x#<6e-MbcXxN<$_3&WtQ2ha38ypei!~J*Wmq-*tgWj%dT&A+^a9bA=hsW9 zG9=t8vum;n|8K*ZsgGPZw|klDiqPI(zxxu*Zyc0`O%AZ@rOCy|$D=9p9xJyrm;h_Q zp9Z8LOs)e50%7Vvt`~BBgwqHg1C5~7x$OjTj|-~Aku`|w34V=DO#r3QKVBfrMjWfR z+1WbP0eOb$BE{Gj_sn?vyPtI=^(wkYCU>ah|7#Xh>D?OzDL1z8+8O_A9%Nczj7oCY)`<0qBi2c1<5Y$`JqoMvz&^Ge5sr1jS#y;>5En zYpUJYh3q8Duj97fMX=?FD5Bel{czAvjF{!8)p;ZO@Jki*U`zrBF z8-b!$3~cj1RlP++`Ys0Ed}Q@($J>ge`)>u*4G(i9KW7Q{+s70_73gxqyjtV(Ao@AZ zrE9VA)47epkJs1&>PD54J8;cb6J7%%Iai?RJ$*`Fx{~gI8+Jq*hB+XBTD%ZqC%yb3%>e+qv`C5uBgn z{bj2)2VodhV%@`J^2gtU*&}X+)yMXj220OQPmf}zW0nEK!Q*5y9)MZ`evD-5Hsiux zJ3`EZ!usa!>{0C)`FmBeC!yEldJ^Ob$Wp_@!>nWmv)+~rTty%31d zY3bP}LGffgPUd)>O1!a44o&-kmGPFs63ix~QX9(=-OHbV2 zGex@U2@NsBu+eA;Z}4%kKe5#~s)iCFDlf6|o@-5}i_pgOj&$0ZWM*VM0|&r&gCsoS z*=r|*;Yf&RZYTnWA1tO9JB{GRSL2dSM@O#R?Ql7X>jsY3G7Thdy?^#Mw<@A&wsm&< z(0;x*w&~hjlG{%P=%u~W3MBPAk#y@ejz()YTQB*{tP1~!cu9A+%I(_)U$x#j??S;7 z2`M6~`PD2I%U-iy^w;m~|PfBUxI+#6H{v*=~tg>5n|)`t+90q}s$g3R6V zKi{2Y1>JY}Zza0+q*W}A@0Ss1(dbafNH1#4W?S$!7NpOr$=OwI?d@q0b_y*N_Yefn z|2NY9gMVF8@IkDPU3TOz+`dH3fhS{yph6-%a3b}D!$({o%Dz%XrNkDF6h(PvNC-z@ zEoF6OkErd-lOinUxETW`i&i00q&MB(X}Pw!@$U|@Z1(;ZnHnZ0JkZ!+mDSePhB1s} zNROON`z%h1)M!rbnTG7VZJGIl+nL!K+MZEzIkF&?cp_RG@GW+n(Te_iqvuzEMdW3O zd(&tq7cai#(BD+|8=NDQR#l!mr^k4@L}dBMapipNUcO#J3g7uTB}>*U47x*ybXi0u z#>VD5Vm4n85L-6Cy&aV0;zeb&<17*QBu$<&Ut&!^cFQq6Ll$4}5IGOad$H?1;opmB zxW17!p9wjA;X-E!*~q&S&jdElNq_wkip7UZ4ziDnMueT1@>+f$2&%>ZT|Ik_gj|dD zWs(4NN(qkY8CS2ja~J(|J14raq_~-mgb?ybxOK2shN%n}q#z^BX;HF^TzqHSk=-+$ z7#n+~cOr_CQ_TDxdq#dvuTF}%y;4&%rdbWb8d_Vefpl<>EY-q~ zAXpUIroeJ<+^6;d)wpzAYY|kBd;eaudIkG*#A|asXS3&|*Yvm8_XT?I??9!HiPGx& za!DsE=lv)4@<;a>4Z^HmHrDU_UA3*ga=&hYh|C9WMzW*CIXC)bl)n5^SC`-z zTj?>KjM@Ad^JB`;JqQqnPptG!USQu$Qf{tp^C1jfs}UfYv~PW*)=#tDUzjfr(3vfj-{E`P zWecOP+EOZj8Q0fb-1~hL(vqBxdLt8X6RhpEwy<2ZwgivYmyrcGx6QT5H6pLp`ub=t zpRBO@E&v&R$xplLJ5&E7!YR;2_PN}C4Tv>@!&NS>uI9PD_&XNfBB+Bw2{8!yUO^7}km%?GtL6%fpKbFAI|w}wN-P3n zNHAL+o-|)7bi3DeI0#GsI{v7y&+{RTcuPH_{`nVuq%7uoNbZ`N+7d7(q|R>gw`SGg zk_Te9go%T+re0dfu*)l6J=kwRaIcTw2?3ubg2*~sR{4e)g^0CEik?SC7heMrL;$^Z za>?&oDw-;ylazzXkUND!)mhTR33&w(eRyMYG8VTE1w@Va%S?>EI8p2E6N*=Z1Uh*RB)rYroy1ah# zG+If2%>!aspi?3^P&oSR*tY3qOfzMM^<*Vnp}=M71l;fK?7RS$MFjr!i(L;`=Nho= zopO-_>Eqz!-1V(>?oWV})+uA5|sNd=T@-&iPwJeA*;BLc* z53aq&*@$?>fB1UxXP3g`(7yf3$20~O>^S!RFCanrnw*DnS4c=GEZZxPgI`}bP}!ku z^nx~LTt)W$ChCWVP*4yKd;<&le}8j;x;oQ%%hcTY z!L)Dta`-yTBz7`0`9-|wh;tj`}>{AXmjnvDPD2barax5 zlOL^j?d{Qzj*NUEU{fxnleO^XPWrSTpNW8`PCDa#DOhRb%S`N9UxhF4lf8orr=K6j zpMT=DYmaJ=D6D*+lN~dz0ZM;tec#Jb++C<*`QOFaB$`W4pFJB{aff6FToUy=>Xsa# z=|NS(wLZezFTYRG^vWtw#ecrIl2bF;G^dox_kL%m^k+ZHyjZi*6IROJ%13Vamha}n z-^~MngnQP0p&8rquD5QU4@RDVxF&=+2jctx=E`Dlb0W$q*Wp3R_Z+a>xEYgl5d_6x zbw~=Hx?!7dn2wm?tHwqR%ta)g@pYKO7_O!_54r43zX*J`SV{w==676o*|P_ zP-w%TgUrNqc8PF_bv77F;xsD=po8)b{j+fFF@rK@bRB z7(5Ie3A*jLl>+bfjE58F%FK)}%FI0ZagUi+Xh8RF#mY5_b6?0D$ROdJg2^tm|7+Gx zv!?rYf~L)&tAD36buV3dEY<`SbMZ%fkpGL?WE}+0a6Jrw5Ph^pY!(vX|4&6dj>iL?3o;qX4sF9*rsA2y( zeOaz?p`<*Y!%`?W5)m@CWFL?Ah*~M%o8;*E91B*_5T{X5@;&7zJJVJq(YR6l!Oe& zSdPq7rW~_WGMy7LPf;>OQ6j0NNrQ|FqV z)@`}1vmfU?&w2LV|Nn1#5O6Xue@px_Ie-(`fvl4)!f59(vD%UgtPQZuC%N(!AaaXP zaUmh2^Y5I*Vjvnl6$pgxIEVMH{nnH6^vH_Yd8o zkqU~C>#prJg*t}|>Yyzxag;TqFp(l=khk^R=4!W3#wQtoRVKSyqw4YHK+TMfp0v+a z+qOmO3%xM{m){SoDC(PZ+|!@JDy1~7S5HG=g_sw*v$H&>RbHugN5Qi8dk*l?-o7^` z2bBJ)cNx0XFVGkyqX1)A^dEZd#2f~@0?~3#ism(<}sO&7z8=wpTD4=xUN3at_D7mY|MWxY7g17+N zB`qTZI2us|C>elSC7=-s`}FI5AQ>k^#J0!^De`@OXo|JMa^n|vl&SSDRB|^G(rsPw z-BKUvicOwF^Oq!ZrZubOCw&TNEVtJ36JM>bIMCNnwJe-7oMYZLh4R;I6kZ`)M{|~; zSU}e1uuS^+m|y2Jjx)1QWlX#fK8!-XvT_+@1~6~CxTavygtgCxs}y7sF~Na9!u5r0 z#p*{WoH!s@-!Tr$95GsrNxWP;YD$0XV8QDO(6S(bQJSBRo{5P1a(Ks8$Ea&UJR-@R z1#6m{Vw&7a7OoJm7#s8kK4#lnvS?yQ%|fZi@AeF^vG}A3DYI@xOjsL8bVR$s`+eUf zkuK#X@*8)JlNap_>eS1Z*(!TBgM0=Qj7eM)o+VgZXNsx_LQ8Vxh@cvpvXa1lBUEq> zqw03uIS}Ravn8y1e)ZAq>S(j%|ix%^!=uuk7a0T3MqLBO7lmxs^|F=@Fwwd@;kdl_SU+>OVGs~e;!=-$rAW|?U_EMc& zED8bpoj1Awp)S5s*W`6|sKf0-j5)M`x;gf>1?dd!##fK)-h@>G6z)ItQ9g9#5HWdw zts2?q-{qH6#}9in+k%ZXyYGEl0q_WPjw^yO-k;x_lA9H^$MDJGEmyo%;`^P91eiCx zl3K6C$!cq7VI_cTE{pD+TCnEEJ?;jZ-ICBHx;_6*PbcB%!~G{$ zUTr+yXtpk{`C~{B&~iv=uqvYUCAMtfp~Ree2U{ubk z2Or4T5tT_43nYNaY0;7bPZbfM6_ejPt6PZ0lrS8OLBed!O^Oex1@~OgAwu9t-doPRwFGG((DoIuIGL3x zqMF}J!iKI&fSJN3c_mdP@`!gt3siZb!y?0B8braGW-NLU=1MFE)FnXV6SAg1?IdE7 zb^O_~EDp6PitQ2wgn@&E6J#aO$&1GZ##nke{`exk{KuxrO>&y97Lu0(1RUo*sz;58 zCcQa+ZK|B=!8DN}kqfVywiSpcBbfzyNTP6LNT9Gp6?9nFAuHQIr~LpQA749~yPuJV zovQPiU8n>JgfuUd?1fgaDI)=BASe)N9>h>i-@3KZ?M4x|{E2%ynzboyrO#Emhr>XF z)E+ISc6O%6Tl5>V2uB*k#8NWFK5z!b@orBub z&$I`K9uCSqz`vNUC_Oe#zD)<+QXOGg|8StY<)reFw0CW8R!T(IkhuKXHm<4l4>XsE z)#vXB@?Ag3Oqf=b3lKXLeCp3w3dn7sD7Kq$k(Ar_^l3$ z5t#;wzCb~3=u{6Y544da$PRWgBvAz=POgf8lTO&DZqQQbluO~? zAR=(!ti9u+A8yh{Ij5o3*l?;d=FZMVA~%LOXGDH&-K)|b^}2WOYJcY? z9?aK6HN9*}D2xEq!eW4KqMDPMA&~Ly^uyw?Az7|c7ixS#i!HOi;dA_b7f3teVGzk6 z4maqWVIZa->|Vgf7lgnRB2Iy|&)vO~^?}&IJOSP36;q_nhVc!U8+&U$;#E-az<&Fc z2rOT`xD``hGbc!!qBfUpM>!9%pW>DogBjTakPe`+{H_Cm$HO}&BLjG zcc<|mtE$abeA#AipTpmv9y6D1OCmB*VU>`xA8zZe>O0qp#~ zrK0q@FUuD9jF?P_z3b121rRN|Z`2BUk*-n(Px0Na+}LDpC2}D!qvgD26SSvTkKA!v zK%2gWY6_PtWYfSC7o#9T_FB=lJ9<#Vp`b*OMv_la2q0NDqp8eCH1vyV0S~Gq3p8y+ z{|OI1!h|51!#{Wq&>KseG1%AFmqciEccWQ%vgg$#jm}g31=tEde7y4jJ6>7Mduy!f z^#KX-jmdSTf-cZUVEIez$(L=~{JQJ2Q%^uZk6?^p!@SScEC}w~K>~ijJnQrgSnHOY zx@F~bpiV@P|1OtkcnrEq1g0WT1o$_}SRn>Xsrrtk8==l6i!^bN!$W)nDOIp90lazW zsRFu6A1x?&2sh8pmoLvs9Xy|z=?VoJd>1MO-qv>Mxi2iBtw3a&8Axg9I^(We4v*Rw znt?t7R(e)D`aCiBJ%4^PW{-}nY56jo3sUWNfSfRLIP`+`ioz zkV;G;5XDfjyEU&qi}a}Q?LYHkwU90cJ+V|d;?K}85Wm%SlQ>$p(XZ~~c(`WV z;9h9Ur=Ijq%`cVxM$#*wWV!eCL@`xWwT|q^ZJurI?WOUpW^m`<=rYI%wXis{WGGjN zr=ad=n)I~>clG(V_)k=FOBHvnQ(-{CieMU8Ok(k8ocA*5-{40pcH>(%f^Y|>E%IIM zjvn8Qx%zozc4p*LPo=}nhAQDLN!>>;c^6U3BV7Zg*9(4cTCgHNTKkTdh-@5xmB0iS zWy?u1d`mf4WkP70c#q^1=j|IbC5}C?%GE8j%LziF3>&r>9x^jNTo+&KvEGA6*KQG-*-r!3wXb~hzAdWf%4&pchG3iWLPvyE*^@~-51>>~oI zj@j|C_VcDze1?$f1=31z332A=UF164`kp2rOt-UWdn70oIG7-HW!G@QB*T3P9n@z8 zEF~sM;EK=XJ)p$f*Za=i5kw}Ch8|kWhSKKU)jzi5vT;!D4h+Jhc*g%;V{z2jy14tV z9~_N$y5e1e&l%+b~t}u&6om~-L$R4L_ zdgw3&^<)vjdXHif7$Q;q!EQ|iIE#>71wTbsSJ%eTr}`w!ikFix!(_dM%+4*og!|+s zD~sNP_eyBze%%6Em|Ss4wn@4a#IljIKYEEnHK(-nnDWk+&yZ~|N9jSbq)4s3Q|sGO z65t^tv#z1J8BsMPc}r1nm7*evXzlTf*WIaavi3br)h>e#Ca?XQ6yNhS+jHZl@1X}F+OLxd!jJK{9C znOsnIlFcO>G6q1PBs(lM6)`5Qpvmi&ya&IIwg4p(CNMuXl86X(Ad}EUVOy*L`pZG> zL{1@-nd4GVk^>%-ln>-JI21c$7Gs?{0M$CPOj_$y7qJTCP+WQU5=UFPo+JG4zpoK1 zl^NU3>T=kFb0A5CbH@7Qz!(IVTamYhg&ed=c5$&~h*;swuWsFW@OM9UxW=Cx2Rs`e z0F(hyK#~M1oGYN`8z_@TX_^b7`&>yn-uSD%5z}Lxb9n|#rX*GyFf}+R0>sH3V2$KJ z2>#I(ps-14^L(qEHOUKQ65LS9$iE`2`@ZoWV=Mt+93`?xDuy;=I@HY@go(N3oaSLz zOJGa_E0yF@=-vI=sn)sYGcrZ5=P>7oo#B5JOgpEyb*Y6>vr(M{^Sy`7PY2JSKZn(l zdC`=+Db_j@B~6d`uFtc0r`x!9e!T82poIaTj=d;S?f*bl}QR%VB*abPz$Tf;LG?aczNa674;rIWHdH^8}!HTB&kENk^#+`>gkS;OJx%0Ri z7uj3s3JD8adgUu+uXE$QA#kN`mP=}&MJ%u5({2%$G@YU0;rSOfGI}|j7+YrCS88C> zD9Fzjhj5YDsOJ)*b%gKlg)#!-^!kAyLTRDZM2;lxwt3fKSBzt+`^DkC&i8$X^o!tz zZEOUs-i|N??b&bI>9EG_nC{p?;0{RkR)zT%sI?6qSCoOEzp$eoRX{D+_76w}gN7a& zQ`lwezx0_(Gk36k~>*Cf$iV4}k&14)Lv zaVpHLNJqvpm2{!Vw9O^8H2p-T2__FPckg+6e8N04tP@L3RR=@Uj!(T}k!AHz;?xPt{xu5-U#jt+J`rgKmk=%Xir`A3!`JL*`{Qo<^yLBCSY=`IQoce z6YP)%&wbRFlN8m2`m2S70`Fl_d&n&N`tnArq8iOeH@5v!Z(AG5%8|P!2PIKkeepdf zEF9_S((>{`5f(Z}n#H)zv%cayJE%D$F(8n8J&BsR`MBF{HNo~i1(r;-iPn%3qW41L z&$GGIbP1vl)UwU>Bn{XiY5w9)eaL&TPQMI%v;qYWl$wy(3Mp51R6}aO&(?j-zA&-7 zkbO-W+lG$G-()78!B_WxNj!Q$ueIpm(Ab4E33y_#ZK1m$tTte<+}wjG?{O+{V!4dG zs)Ei99D|`od#^hh(i~cY? z?5q0=`+0WJbVda1S4j|ClRzra;$Ue=|A~$ue4{C?al|Gr3;!Rtf42RK8Q69tieN1C zFo}prB%y8<6_q5!0(eqwfPxF$IOykLW&{id?TPL&3H12}o;n<_QJkYfIDX;;nNwDW zZU(>K3}&dfdWHsEU2mvh-?`Ne#w6|u?}HF?@G_)`3G=g$dEs~aa_2JYl2JT8;*Fa- zCWu}6Dt><3;6&M`U@6;^+P_rOwB%~62W;4=b`O}(V&7z|u`HnMIL5eRo%<{k@hu!H z!Xa9N7tB;Ry(yv1Lr{MelqEYk9;BfI z{j|op&A1X|nZ|P)T%%hm;%{1Bivp1XrMRlZ3#tI5dD^B! zxLnE0I|>7PEwV(3eDHanC1x$5eS$$E;tYt3A9Z0|Rw%MVvGWJO;RDn_=x_qiAaKc$ zmNk^#J(^{fE1=AYnhru_puT{qks}7ru04e(K`);peEym(J=_!8N60mwPj#f9aOIS- z(g{ri#53k6fkE3V7rc7nT*ny`^Bz-I;ZYK7=H#Ra_ZL(0YZ++=1kNdJu5;rp6ZrT{?yc^p+ zra7isl44!o$Z@N@rQP(G94DrpjCpa{WlwEp;T7^!VKY7R(zj-~#(O14T{f#}$3s|` zaY5gppMV|mkm>xgJb&qo`m&iPbJv6@@97B`5SWkAi$D)DLZsbAmiE z>sU6FwRwE0EgukxTO1&LJ0N!H^N-Z{)x#tnwMU+RWH8%N_2tE=^$Yc+DV~Ozv%$;P zuxdXx{&aOFdjOkOfq|zg&(YX7g}z4Ojq6z5DCe>hpV|*@ws{h26t+G;hKHRMwW;1= z5$DCj*?_cp(uKPWuhlh$JU zQrx?Z*K%L4pcia<_b_X=>Z$Fz#u3$;lj(*c@|>G=+Cm1?Vpz+i1fOPFsR`~WDhWDB zKN~1^=w09i`dV`~0Vxp^O-Z_W-^i5%d$cFD`CQhSuzw!i#&-OBfgy{7M2()5$R-Y_ zw?ngmI^XA>`SZ6&07dS3JIk{4yEK>Ju@_Z%SkamgL&p#g*ANEHJ&1uH6eX&Xq8wFS zPD$C8s!mfE7svMb4d{KHynF>29YqxAiK{DW))T-_NI#RX?rP4J@lUoRTqBiefT{`{CU zd_d|3h-hh4RT_1@hmo*61`GT(*br}O$z%pILMV#rRP&T?5Ad?!UoV^Zy6$9{GyHaj zcv4gqm5wB|-TaTk=U#X4^7#3(^W=SXy!`L8vGHey>~;-eP>fA1=qr`v6{+${DlGf- ze#0n#}lhWh_K=Fh9EsG>$y`lC49701f_!?AQv{}6v)Mo5sC``p{&yhB_==1!b{@gWf$ zwela1`gtFbJBscV&hViq_jNvT!q{bGES{@IbN3I32=dzL8A73ly7_pyuQc%Yb@lSQ zm8Q5A!&d!kmt(#(L&Ebp&=9{4ci(5)^e`gmpTvj_j{Zt+A|Y%onh!He8|`0M4qOWr?d z=iSy7=P-5&`7O5Oo}tkU{M|!+8Ga!&8XZG}DT=wXl?wkgX70Qo!X`LoB!+gSjq3e(Gnfm2uT^$YRw->JZK z4fAsM_X}3|_nM=is=mQZ#Z6h2x`E-U#86qkK}lVm!EoQ8gnxOcxVy>Y2zh+I*Ly<( Q@D3Cc!_5XodM#jMEpxlh5yR6 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

h?%5c3Fd(A;5743`y(&bhkk99%^F1{w@* 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 wDJ80-3{_51Nk&2TpGZoB#j- literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-57x57.png b/static/img/favicon/apple-icon-57x57.png new file mode 100755 index 0000000000000000000000000000000000000000..a64c1823abd71744a6096466986f1833f36ef8cf GIT binary patch literal 7985 zcma)h2{_d4*Z)+KEeSNJL@ctVAQPx5K5Pi$)*d1M_oSX+|6s77eNEy@cw&-Rt zl2EcoL@OSPP0T(1E$0GDl{>u|CAB|~!8x;34-dCfBuyu1#Kk$47`Sh%vdTXiPoth0 z#Z_-9agme(_5IhtJ8Bf?)WP`V@`J>aP}%G-*L?QLd^RTZNui&n<33( zQ4gCRa6Y@bMv!e={(;-)%&!kk^m{w$Y*Cl)U2&(bu6b2E&9Ra~kL>L6205F|j*?2| z`m2*-OLunePx2X#t&CsDdu3E7IJLYkQW?L=f2P64NqVh<)Yz4AMYH#+XoW9zJ-R=~%k(igleXirH*@IR$<#1P zGrLHxa{b)6-ndU^(Ay4!89yQIOqmS|lOr&=AS);kQxPEmXpYyCe z#3oPkBa6#`GEgUvOD&kEJttK0qMbswQ?weK)|yhub@zVLi7|P z%h>8qU8$1I0|SgwX^}}uXF@_ko@8X$`}?PR%V=GUVa;T_R=>`S#7DD{7aD|XR25MZVaj>_{L%cpV`>-vOxa+m3QbTyUFchKd76ebp#}_bDONIsfjrGC#q1u= zhan*pQqt0A&Yfdtq$;&;p}2hIisap20=1rt7n!N)qFQ6nNs1Tm69`CcioknpNCy!n zHl+33ryQq|ns_6gcdaY|9l?|g?>~IVs;Uaw*@=&fi+jvO71EDF?b)+FC0rJ#ET}fV z7NLCoVhq=@^sVi?Cp?*@bEUWY3`riyC#R$&J$W*|`%9w0pzxxc9E+0fif=tq0EKGY z3t_lTfDmK%OM+`2XOHk6L!@S&xeg`z%q z9sJnv4fwvcy}zh@{#4O1uCR;OY2j4ox$1HRzENiztUq8=ad89URd)w#y-4*#d3w~#3XNZmOGcy=x=bTrs z5+KG>+0_$1_VhG0`2B{SbSy4Cc>{7gIGFMn!LP9B~ zm*Y#JY3u&p@9k!m{cAGkXOisGGt0~4yvFepkm1M(giXE`83|e_z^>z-u~C>&1UHBWiTif?jE2&_07*RyM8Q zG9V2i>10%Ev6N42o1(9;lxOWZ6bjI>YQ!b0XSQ;`(V!qFKR*;g6Q7^YZQ(n|4p*3O ztb4tAo^*a;0q&-}veKqdxkmO8`RFZf?vnZ6jLO}#594=+Pb@mzG|{AxmjT{H$VTzrBdI>=uz+7x29t(&q_;w9w4F$ z2uuykH>#N3tT2B3j8qK=tF0`iQ7m#@Kx6>=KprD5+P+!|=vOWyJG`$UEzi>$gU;tEY?j!?X$l7OpZ9huD!`QLi@8V9Qbv~;*NM$*b!i3tT8p^2F z>)P5UWMySjrM)8O<}hJlVMUa4Yuf`2e$tJ5i>^NFJt{ua@rHm1)jE%^vEFO3ZkonU z04X`%x)s1f_J)B#P{!N85wA01pa@=?pPRG7V)55*hKxH!Z_mmgA|fK3243D5AG=GJ z*zVDysHpo5Zf@rOvGYcC{)mqY8zP_^PvnV@dOwJaq}J2d$2dBgbV$H}SvT;hYr{6j zSuv-lB_${CZ5utlDexY^2vT@`eVqoDqg5(dq9|&g$tTPonVOn9)7;$L(a|9wE!}M9 zO)Yr=?&w9<%_rpQ<}bv=#K=Qz zGDU<`S4)oGS(f$RD6s4SK%4I?$bbHP{KsG!v#c+DL7$qlGp|YE=?LZK!7}@{_wQfd z6fk4ZOF&=UUAbObR%Tpgr}-%bunGV&H#gUYCPiN<74o6>~+`8t*zd{L8Q7mB?yur9=Zr+@`ueGot=VW z-!ITp#FGW;q}iI9RR*$t*3{M>x_gx$6qYI*e%)GL9;gg;cXQCb|FJD7ujRTm>f-uM zCT?!-VO+N?vz&iwX66ORnd<2TQwfiGdVqfkX6mKtnRMH$7!jtnwzka7%!!cbu&fmT zLn1Y0t(*#P!Q(c4>os645_#1n^^?~?J?X~%gkV<4RG%1vRKyyeK6UCOMX-d|(y-_; z7A7X^gZ;g4)6+d;V^N)UHpIil#eMwpMcKO~J;f&!t?P&i-IdaCR z)>w-xSFU6?HXbC$v`wD98n7?3xVQ-U9vvSa+&u#W8SmaH8@w=*H#B7Uy|v8A%Nz0i zyPc4*@Z8c82M}yv;9-C$6<^<-;}`b)<&GRV^1`fIND^RA`vb3kBa3lD`wdiuSp%m& zU8tf9D-G-EaG-|R56Q~enRRu{QLVTUC+pjo*$rRt@9o-=^78VRPJ=>`=Vd>vPPGCP zO+ylJFjMz_{TkLfC7;*Z)8F43O2-MfX|?#Z!lB~pLS(Ee8zaazjs zMvo!K6)(nIAyaUq)uSQF&f-c?WeenKPmB{OBt@Zm=G?(`d=_=y&Em|ViV`3ssUIEz z#mR=$(9+T~G*p4`=1UC!^2K1?R~BHOQ%)|!rZuwX>sK|9Kc`Nef`}T46X)dMP(>nP zTc98CY!|{Vmh#Yr2IF+P)1edctAVl$A+={()yfSwlJ#lVEjqbwT->+uTz+ zCBdYqFP}eyK5GB*<42a%^J%K_vOcE&#sQ@aNXl>H&s3|E{&0 zj*LWrDWaph+or&R4dt-Ccy2Oa=Ve<>i#&nROU%!6+=pZ7IrbQqS7+F|mRwkMu zu~r6bqI8XnR9#*9^RzSGIf+?%Q9+HB#r3{aLxTBxJAWe^C+EYuI+=14UOZdN{ekId zD_!~rfC__&wr|w);#tXHO;FN+{dJi4Mmz}}Hyd_;suQKNnwlDHiBh+X5fX#Pye2MV z?}t6GrGTht3n;OqSByVLYV zJ|h(=Gxag12)k=EK{r3ef>_M#aoAyqcYe@x&!Sk{w`iP|?YK%s)0ZjN^(2_w7t2%C0gXKF_x zxx)5Jc{mYol|rwf`eMaWoPFEy?2Hl0RFvnBu6WC&UiC{(NH~4^O;buKk%U2?tmet> zg+lntaNR()ENlQnX+zY8Wx1`4%Z~;e?43QVhF1i_A;!q+N#06rNF4m!|(a608|WWzK>W{R2%eDXai&hWShlBum`s^8-akOBP2GaFaMTMZ0)Q9h#DX|$NFFL!rN&^o3(|x|5@!zT) zTb;|x5R#C1G`8I8Afjh%9NIfqXGO^Aog1k05zfxeF0ZIymlIBU+!l!Mor98`S%)6| z(=^(Qg3NQ~`}ZBd93b6GqN1m=dmgbNgA^`!{um(228@f#zE*VjX^P<4`FS;t?&|7l zqe26y311rVtZ!~wZ2g8(?1e>r@;PZwP)*P%fU?2S@iGR330HfnO%pW2Lvk4TzQr$} z>jScEaM;A$Tod@_@N;%U*(ilZyYP7Y8K}Xb zgyik?RpPx3<)ydG`EKZq5)#aEweoPJ13uNvK1aWy^L|_iZz;`dXh?tYg6D^)v_S#!#<;>jB9uYF zKt+0F=#}#&Y3bk6@&v*MC?tU=jsbd$h>7Xx=-eB0(o%~^H1+fp1GDCv0xw}sZeHF= zrIYZKK1X5=2G5;0?6WB`+I&v%oyDfR`jkF@PKH7?2eQ`b>gfqVLS6@c0XYSZ(9;8c zybrCY^gBzE0Pp;byF%)Te0y3?K^TqHdg1nWeG>RB(}&k$RKHPldO}O3Zue(9n{N{*9It zqz@94&weAhEt&p!S6W&cl~Dq9b|5XI0Dd2fW5hdXIc;I-M?*(d=Wu~^D;P{2wyzZ`Jz z`^vi-D?hB8+sXu-s23yzw1S|41FZ;fAAw+9VY1y5<^T3w#M!yo+3^P_u0E}-+{(2c zb|s=Cfe_Z2B92=qto#YZ0a2CHl93dVbi8K;V)*n)&wu3s%iXP=Z|LZkI+&%UC5t^` zCJ70>ftnu5V+cu*?--X@A6@lMZEBKNR#B<;UbX(Y^U<;5Sx!z&QW6rhZca`P=z*Hr+QC{c*PmfV z)mZjh{YB{3$a5gZ0E|H*KqIisWu&ID(0&}N^PuS(&uLRRIk^KnXlrdJTKb0$ExudW zfcSYstQ~ZiDToai6&Am@@86R_lHV{eAPOm1>U20ecMcEX7L)^zA3y#G>fF+jg@NDV z8Qd)73v8I1i%T_u!`IgrNc0)75j0{P9UXTzeE0bGcW305i3d8US&C|xr=+A@^_GbU zRh;YtwcYoS`dn6Hqg+z(l`sWO&Ev}1F~to#VU!GfPx}`@ymSZpdLlPnaRB!b-a`)UFo+kp^VoYJ2teXbta{_snm)u|ffRTo$s8GV&r%)#nX~<;riblb zz+54&cH~juqaIsDUHSyx0uFi#d`!&!)+wZ8G1SD5BO`x8FDH6`-`{ibs}i(ypirC! zRYNRS9!Er2l?_6uah#6=@%4^?D%j5*t!b=Q7h(jP4w1jz(3G3hSVv#~j=kiU4g(K|z7vE3zxAKDB>j z$DF_NtOuXArY5;XaUukqEv`6=s|{}+)^xAarFFvXX64Yqng?G%Z^M#21GK`-DvtTd z*DxGX!aqA;lAY}@YY)(TsbjwLrI`HQN}$uP<(*rB2d6g=5I@#Avn0e~W8ljMc6TKs zcUvoWw3H1N4Ic<00U<$N0ZCpV;Tr;yQbNK~LSk101f&E6cqQ&v{*MXHuC^FEpZ|M; z8CsGOCNL3KKzn2Cq!cjjI2|-r-^$s|35}58VI}_1E?(sXtCN3QU3YbI#p=6R*`N`E zCsGb0VerD=gNm@l8yM%mwkZW06p&yQ6qFJWl@buQRc7D=W4gbMm0(eAJ3AcO9U&+w zpb@$D28QYX9!5G_*`qbkF81yY2vI?yh~S>`|1tf~xFN>&uVIVrCgL}6|9u*LS37qv zD=ZqJg4EPu72*>V;1d!#?1n|- za2Qt?gxEIP%@FL)|BKx}k0B%~rsF1X1T4?}UzUFz2n-*Q?$CoF*S{F5=_sinUEI-F z8wV>Fd$h7E*4fG(AuK3ns+VyT<_P@%&iSv~6%-K@5ZWyEwt~5r|7EU@gR8r%Guj=C zvH7zsoZH>X{m;Q^PlYkTEY^RS^;aAbBT5J3jdnr^PxN=1fbChLEqpI3W#j7RgT>f8 zxFd8tter46tctGARv4F8F@mOGcJV)EwrHFU7UTA3y+6LR_P{u~^I}|Bae68W8us#Z zV14R8*3MQg9(GnX?jBe)_K)i|(xX3s0rlSouC}ll;#AX{$m=ljXYaWGM2myFyBki5 zpC3bvK6qnnZt=Nd?d!VFrGYIY@hLZmF(W0V=xXEPjCOIClF|WF96~VfpqBrC+5B<7 zl$0v^&oKohg|3<3Mu82(Kc4enHh(!DOnP5jAOn*#|1i;nlydiRLnHp|ir>w}Uar(Y z>wi5*^H1UliU|t|OGpX`h)G7*_<+fYe>_JY#3h6zCDCXb2_g8)R>a1d Z4`%Se{>JaPyTJ+wq>`3mk;2Wu{|EGX&))z5 literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-60x60.png b/static/img/favicon/apple-icon-60x60.png new file mode 100755 index 0000000000000000000000000000000000000000..dacf326f5e0e9642a1c9332116b123b446859b4b GIT binary patch literal 8492 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-72x72.png b/static/img/favicon/apple-icon-72x72.png new file mode 100755 index 0000000000000000000000000000000000000000..b0938fdbae5920f09f164b6a1313a06064800c07 GIT binary patch literal 10559 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 Hu?_!!s+N~p literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-76x76.png b/static/img/favicon/apple-icon-76x76.png new file mode 100755 index 0000000000000000000000000000000000000000..2170c4c16a6851b220a54d8164d7eb05f683ffdb GIT binary patch literal 11490 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 Ln(}3`=Ar)&G~=5T literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon-precomposed.png b/static/img/favicon/apple-icon-precomposed.png new file mode 100755 index 0000000000000000000000000000000000000000..a4809cf296291ad2d9f4db85a3d50a93dc2f7db0 GIT binary patch literal 37850 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/apple-icon.png b/static/img/favicon/apple-icon.png new file mode 100755 index 0000000000000000000000000000000000000000..a4809cf296291ad2d9f4db85a3d50a93dc2f7db0 GIT binary patch literal 37850 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/browserconfig.xml b/static/img/favicon/browserconfig.xml new file mode 100755 index 0000000..c554148 --- /dev/null +++ b/static/img/favicon/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/static/img/favicon/favicon-16x16.png b/static/img/favicon/favicon-16x16.png new file mode 100755 index 0000000000000000000000000000000000000000..1a58469c3ac4cb7fc7535b2299bb93f3ca2d4700 GIT binary patch literal 2524 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 sL^N67&mkpKVy literal 0 HcmV?d00001 diff --git a/static/img/favicon/favicon-96x96.png b/static/img/favicon/favicon-96x96.png new file mode 100755 index 0000000000000000000000000000000000000000..fc2267ca8867ce65bfef4913d9800e17feeb7e74 GIT binary patch literal 15584 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/favicon.ico b/static/img/favicon/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..c4b19d556c8a916b5504e1cbf736106ac37de4ed GIT binary patch literal 1150 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/ms-icon-150x150.png b/static/img/favicon/ms-icon-150x150.png new file mode 100755 index 0000000000000000000000000000000000000000..5a8d48712ab7e8bb7cfa20ee1f1cd1aad03241a7 GIT binary patch literal 27906 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%0A>lyMoX62mh@K;T_?PDl@=xa=j<%=<-GO3zX=Th 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 literal 0 HcmV?d00001 diff --git a/static/img/favicon/ms-icon-310x310.png b/static/img/favicon/ms-icon-310x310.png new file mode 100755 index 0000000000000000000000000000000000000000..f7a262acff43be3bbaee39ad010bd5c13c714da7 GIT binary patch literal 72237 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%0ASifMUR@nARpq<{z2gr6 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 Y*kc{eZ#XU@6h|PL8Cw}$H1OE-UmLQs#{d8T literal 0 HcmV?d00001 diff --git a/static/img/favicon/ms-icon-70x70.png b/static/img/favicon/ms-icon-70x70.png new file mode 100755 index 0000000000000000000000000000000000000000..887191943926181fe7c8084da468b3b42de6f0e9 GIT binary patch literal 10329 zcma)i2{@E*+y10N6ha7LYV2X`yUISYh3q?H-}hZYvSkn167rKI`%bc#B_v76o^08& z^S|cze((Fe-*>#jpiB3j*Th*d$a`wp;u+a8j)gpWLzEhUeKH) zW{!=QB}htrd1Stj#YDhNbzlWRjK}_FKj4q3;%J0uPWi>QLlE9Au>$4Mz>Zm?M|g& zfxV{KX4gH=Zwm%jPk9X7Zo_`X&U4g zGVuuC2*$hn<j@NZ^4{kt3MDKz)H)#AcY|4g!Jn!pPpy^7*!!>Fbe3l zZ#>oK284s`VLuTE5ANMQvPK-{g`|h&A`(%U52>i4b8L@guk*{~#!J#%{Dl|tz%C#l z(-f_UB0qCGSN*wmab#rVoxH)Y&vrX$N(F8llu=aAFfg$5(E^a%gLxz5OXH8#rY^du%{MCg=gGg3-7a)*iF#hm6oXy!|+t`=HMS^F;9kE`Ap;MxVTbg2Lw^r~PcZs%P)tOB-@i`!!|rTlasOni?p_eoPZ`q;0tMJ+^DMb;)CB za4=W5(P!hu(s1EvgLLj50kVDI+qZA>&eTt4IB%C>61O$jDE;QY*SSYB25w(o{PoK+ zXMJ^beslig&mF&$m4TBOck6-6BoX(DM{KI}5m%$6b8i=qn3w6k9dr2VAas+8SigiS zd`4+RHA_rRO^sBwFzM-2?UQY_)8tq>VLk@JPvfJ}6Hcr`LQm`K#iR~?-ssPk%%C9( zH%>q;F~1YSb{!quwEDmpn~JhEU?TJRHP@5$>(wic`i2IKqN3@@tNWSa-cKN7W$ufr z*#VoFZ9mBfl4~}di_bRU%!6o z);L}BYhuXg>wI!e{Bdk-L3Q=h&Q5u9a&k6y_UUZ@HM9Oq(KKZiNZ-=>dSOdTPDsd^ zqo7*|SU*Urv^3s@3m0fE;>*j+i+Hcm6Oc0GmzR^*jK^vhV~1a={H4VaMn-w%%CuJl zI}cBndD(LS2pa+Tq|9ey=B;Ysp*NHeUZ@Fi8ivgelW0tG4sS}*YbCAz)hi;{evnXG z8=L3lFA|@Ap~?>Yqu1Hh<-0$h>RM-rVr8vxnh^W)T2IE@{5o#6Uc7kt>=~`Tfx%T8 z8dC=c<;iq}ufouh2PB-2kB^Ow?RkEF*!H%EpTGZDg*9n|_xj74n$*2LpXSr!^`xAf zfiA{iWlv8*p60#lZEbAH(~j zL`@n-MkTkrR%n`SX`?oMp)?p8q6{8^ib)-Gn|m4{eGLr_pC2IvA_047 z1gG|ECLW$r>aTdotvjO`_7BtXm;t9uyuG}rR*!9XRQgmryuG)6gpz9L>UOsrl?EgG zsUpT#7e3|6Bqt}U>+44i+RPQ+I%fC(v(mb}Gx__@6{7Rh4g@zLNS6u}TUuIj`$`rmE8_A40sZZ@Ud1E$ayw*u z-tF<7AKwXM^b_+>mv;Pe4)>Dc3hLcG)B30o8X7Mv%sYslFi3ug3qG>QRAnvJDScU4 zncUy6TJ1RA35fb;nU5&^VQsBQc|}FtR=;>pcX#}m*e6c_RsMSY+H&-b(Zx%bjHsWW zFufVVaYI9}G8$j29qC{$$Qw68uZer1(dc(SelS&4RY8s^=;%H+`flmgxfP&kV@rvU zL5Opu=jDAR?GsS8dMI+={q3dUN1BDIgQKGnD2&ARCz+duwee9=L|!Xj?|6F)bLzaA z>!3E7TN$g6I6c}D5D+ljx>KpofaAAH<#6eHXDgj1>Qh$7Yo=&=zmyo9QHEB)3LW-*1S#VJY}r~vZf?Wc+xPEZ zVM&UNyLFN_+Z9(~*+U+5G|TAzXGPE0XZk$1NpnD-nh+~%gi3}`nct3`hNh;ivvb#~ zSA}US9;6e8Ei6eFl6qvVtXS&m>Y&zLp`8NG)g|~yFsNor^uWx0=Mofb03jM1Gl{9W zU8dike?R>;KwqawD<&>3DKXI;ozZ87Y-fG9cd1pm>}g7_`cMCnkrCd-ft;>+w`sRJ z8d};HO-)%AT~Am^Qz(L=$;tl7CjT=1 zlJCK%$G{?loW6HMiFJ2(o7&hszMIND`1x}?wMjs0U;FZo+d}WvsOV_DYKN;SDJhke zmEF0wx4#zvHZEuJT6B68XzZU?53U+9JYzMa9|Nmcke!{~n5PgoG(H~vao*g;C4PF^ z3@-!`avKpV-?lYyOARttP*CuBbksz1+JCJsLdPU9rOtiPoG*RuoR*UlH?-IMeAHUQ zx)flZje~>b>B+Hxu(11&cV|c#Box^w&3$~*rl+Sf-bX$nA(h-FV`pcl7j={ECs9Ht zbf)!^$X~x~)th$NqD)sn`f*%o^)sFjC`eZk`V&S$!9tJ40h4#Ia9*Uq(b|9hWSe%O zc@V+i_ZSB)P~yLr3UiD#2a}U2jr~^ztp>7Vl|1K{Wby{%Q&S^aO`pGh9g}lL&E3Jei|Nb+uIX?!Vzg|YRbG7%;}uGOp6o&;1s31JY`~HqUN0S?%G7aEZvmp);Jy7ixGhcCIhzZhGnQ;d z(ZC=hQ>OWVEFBf5J2^In32sS(FleEyLkY99n|~VYMmXq62!c;{g9o5+1XG6Xs&1Mz zXQrjmK&}%M!(2p^jf}2AgIWMy@paWpyF?$y3juu_cPIU8C!B_chjIH=O=9Dmk&)5o zk&y}QN(nx`_Xf^Q9rmS7ov-c}@6`k!3Wt%wHsBW$V!5RQg8(c8UjFnf=0T(4tCzaO ziKuyk(AHikS{41MxUw={PzWp1zz3`BM>X!z4T623JV2}OCG(L z$K$yp&4&T$&RfGzJMS-md;$o~N_!d=kcnYV^=J?dfpL)jj z5w~BT**Q2kbQ`?58oX9t0G$A=nOe7YaJZN=5HY$uuVFw3ytzLnGO~wS+R(|~{stG< z>W6?B6owgE@Y&gLuKP#l_Ac~B2&ycYP&UrG)&@RsG> z4z_LK`vFkW8}}llk&v*X02vt>K->opG59Us1sGS^>j~+{s)dH@R~Z>w-s_W7P^61{ zbLRvdu%A79R#@x9^3LYwN1h6oX=#R_Ju~0IvtP@xPztVd-Ir-;X%$seux*bnLD4;X z_G}M2>|LP8biz(3dXkEOeK&67#_q+O;3pbI$vbuFu+r-H?{`F9;hdxQK#?aSjPvT-z)vsw>ifddKMx=s*qL zJfWeX4&N#xca}%DDsqlvo<6053%&Y_U;^b|Dc`AEBj5HJNOR z{%gxe;#^m#&gZ}vrdEB=I=+6Tfh|^({~4Ne%U%bM&q`U>5BviXGE8JY zDh8zTnwuFKCi-F4ifU?wrKNG3n{I#;8A6WcuoMAX8B=pG4Ct&c25p>bn^jU47ObFZ z(}0KN1fPgX69RIynyQ~{!qY?V7%3|&N0B|OuCC@ZWEUkP{3}3;F<0GYlk;Xq2?~>6 zSUBre=k!bd-i2^!0KkL8L*K??u&Jq0pY zG)-dOsLFYZxM$iT^eprj^3;!-dvmpmp#g}njy^X?IXLhGb>K4-$?77O1$qMn9FM`{ zsrAM7NDAN}ATmKYAjQQqfM|aB_|ewhKCiYm4H63T_*&zf^I8o})3|gTD8;B+NDR^Bo();&UJUq6PKmY!U;59LmBtcB3S6U| zI$raJz5$Ta4Ln!@MLr!$D)nyFi{E`gS;+BQSciFTZf=Ol$!03_XlO%ynrf2aC=AT{ zo~EWuP>|Ht;=p2xj&U6`I#-=Au1iKqDe5A>pdd790dorrVC?00VNjWtmm?o0JV>+g zuoIw#C7`6fqN%AF`f>g`dF1mEyQ|l(HO(6#IWAqg^jf#<;r`a5rh&mnBkzgu@l_U1 z&S>1MxAvjTbIZyuLk-PzMECUfzXaHWlEJ0&cPoJ}tRyZ17|h<@o&nJxDCxYsJdmwg z99OI=(&dP$`C6Vo_?XHwJU%X7RmNnM*ip3%hLRGu-=&Ke1B$}@8bA z?0|r5nTl&Q1yAYw(~+g8(#$n==<+UqHw&>)(2DTtn?(Xh(CY*G6yPCei>jC z29St~RV$Bgl|_{5m&liBQ;FY2>JAn$ zXt!aCS4aq)u~tjI360GUrs(+i_;f7vGNpLm&HrHm>)R7e}|TLUfDQl z6=)c{3fVe3V)r-aL67o^i1-+oB0zLL9CLV?pMS1OKX%N)YUkGoPVfEtWrrv)FW>vv za&(u7n0S7fgkI#fzrT1Q3TV+={SpuWlb`hwz#1OM#T8an-9H%{X%dEf!}IXw!s0l< zCen9Z(JCIXpo;DQckW&hD|ghNLP8{v^4q}rQc^rW4z6oO%3k;I@)`na98OIAI5HB+ z&HY5L!m1293gA0NRaHK3@W<|S>BTgnn>Zq z*RO91(8e0p#iK4@D`Qmzr=_W)&sXV7vV{E%ixf+8;FW$%lA<&p6CKTOD?lq?cge1b zHbsd!)YjJ4%+&P3d19)!&Qs0f+*L%#ze-E3=Rc(2HcM}>GI%Qn)eid_zxXMMdcDIzw*2jHoF?gKnEJeakSb*BuC*rW4tY9&=Or0`!OA`WD z@9yi9D;zfCOZNeM_c>gxac!8W@hAm*A}T6s?jfDw2zPPpozl@Hr~%7{*O|K6M4iN+ zaSm&hK6s*l7v|>Xb87tbByAz!NH^gldL+)PgMfb`Z;{CdEmIB=1kW~m)@5h!Cv zN3Ncp9!o2$8Miv0)8pO!-)*G8nj7X1aq=E)H{5rOt!gFpJprR9Rz7;fE;guJFzF&o z(E2O2qW2C$hfuuRj*gD-+^ebrJnl2?7jVP`>?9C@&0KPM;BD>$^&wTwk?O1WT&@M; znl9?j0=9xrlX3Ij3^6_d0h9$W7uXd55(ya$&T^0jpgMUV$S7D<5fo08t1ClxRp9r+ z)6nV4Qb^g3&&w%@@fzp2FUj(d>9avCQ-fc=JQ`SRxSm8Esa#oLSEc`@)MNm#xNd^# zO%Wd&eH)8q2Cl!ovokm}^d2U+w6c;+VF2DhTAvm4eL3(HY!}cRIEQ8G;7g6qa!Cy+ z`pilyL9j!MN22G^?n?$xh!VOHCJVg-Ir&QVL(b{4k*mn;}b8L0LJ5UO#xV zhZTI*x1c&+YcK2IQ(UPT?>jj@T>ACvy(zkTIknZ)6mSkqzaLxsZ|Is$xU`E?z+f33 z9Bc*sblo6Yo+8w^R1Q3i4HYFNB6tS>;6tA1i&lwRvV>(|pIwBMfz$)T06aHXETwtb zz&F4^gr@?Me76=hx^Kh<6l@KT3{6a^0B>VvW`^2JNKcRKFvrzDC_`ZE;PnU}!xqOy zqe0_L25hN}?Z8fhR5wjN7_>>YpVKb(yiHgZQM^FjoUBJBovBfzr2rN&U?m@YlW`o3 z8@V#ok`s9NXJdOGhlaeB5Ys(J$ zvGL?!d9xGb$l&r05b9nQeyV6Wrz$us=u4jX`ONgiOH`Q1U)sf_{XHLVu(L1iy0CDu z{?b@oU3D0*z64D>E@=A(w2BP^gWl4h9ZsOdzxM-xxDgQ%%{?iWi>5N#{dSe#>USRF zF(HJ5TV&(xOb}0ZO@)O5&?&k@T0?^zj9cY?M*7Ty72$H42bYoU%OnwP={Y%ZP+N9Y z=GD4T-B9MDKgENNM0lFE$w6em^H)i$alXdyHpY{9uw`*(13)4BsR@V@FeINnEq5Hp znVUXK1*sx%Cn8Z=8pfdhqTwEJ9C!qr6kMyds$RZp`ck)V5p;8^`$F$!Am{C!o#b?M z(H-WkmIA<2=XPEK0iibb3BgHs@b$p<3@`{UD+Z6!W$(AyJ_FEfP%b2lQUM+Nin;1< zeKySNE^mZW8-w=}fER_z9WlJnVON!ym8D{AoSjDBxp$=h1y6YGA}JBln4dN_8gSfj z&a0u6zA&9Wp70zVAyUNWHxsn#-U))m=q z|IRb1v*vrh-=CGScAM9OKvab(Vq;>uT@YY4?fv_tGu^2(2r+c*`z~>Os5BoUDd3U&VA=pQ{l0s0S3Eh zwZqtZFj7uI8}{~RiObLM45q5BoNS_IYV} zCQnuG?#@n6M-8Yau-^&sLyvlLjxOA|absn?hBT?C9T;&pD05|bd3>C)2kI$_RSkM@ z*s$neD20ls{4G}?1FfbomL%9NW@bnzH5AyykY`|Ka(a4K;amh-u9A|H&wA4?0=%?M z0XP;(ExvYl?SR%`q4ePmQavqgZH_p`TdHto;Z&2+8gd68pP;+H-wJ>n9F-3rKI{QP zxQb=LE(VH$^TL38vr0*210;gbQZ3Y6TMdn*5`ZP1aO$$E0OsLRXP7A!_)I2(#1;C= zqeqY6$(C3w9Ci4v)h*(hBkp)fC?gg+G;k9a5&D}P953eLcrAI)Uo^D1Sy)p;4PG(G zHJ+0h9z{jP=Y@p?1saiK4hulRSH6~o0{N`l5CybYS#f~%m@>Sp?V_?=k! zt*2x!DEIuj+}_|>CZUQ1D2XK9PmX*8;Y{t?wQB%~un4dk&^Mu!;5Z6){bb;-5j1c3 zAz*t@p|YkXPo3@e;jzy4l>BJ%U-ohhV%EKBceJ&sQh7`kfGp?L)ujV_;uR2(h1`Oe zlPSg_ejk`-;EvtYD-Q$d*H)-eG)X4ya2DUm`on6qTJYfDElgrIl#rv2j*dC>#Msza zHwv62EImCag-V-?=4l3PMVO@;F}#F=qc7NY0CFO(Gv^L>*IBu^Vu3Eg2ROR|3Kt0< z0AYr+5liprg?q-n^H&&xk6cANq20Zxs7QjN4sgn$vzvi^)Rc%i4keqhe&-l>5?Em2 z>S3smn16`E`00+%&Dy z-!BY4U_Dt|KY0T3BQYtd=*^p#VB)~3BDmi`wcQEXVWUq1P{EuloZ6p0f0hL!7V=r%P^85%GdnwISCyZi|7mhk6pk`(!#Q$%hso|7nNXSrSRTT~$)rRFi zveK$t6w6{L9#I0r5i}Ld3YPqIx%vGMT9+Spd75Yj=ouIW8w|PkMJ@*}$yJW>h#|>K z$WR)J>+yfEX_QyVis;#cth}^`FOd|qFj9ZT4+%*K7KJiAx<<} z42|Xz390!XH#j<5+FJSk-!~XyMTy}CTHF(`KDJh3(zYJ%>R2~TGe;K(EJEZa6Yekh zsuU|kUH(^;jI)EYo2HAI1s1_ent_Lbi^zXnl!YN`**gAXm|`$MvpHfU|F~?t-zo~1|9du?&Q>1YW^P!70!BrhiI1BX&CMrpCQy1DqEP>Oh=+}*qq&or zt;2twJrmuwCdAYKhj!Jg34F4hS->1PRD5UO!J`0i8{;$Y? zOb7xW;~!8$AlrWkR8p5yz&Lqe-7IX(oUF0(&Tfuo9teJ3Ap?z^^KcLP|M#B%T3ucN zAvE8gQXez8m*YR&t8U}$;p~X@aI>}e`>`-@4>OOyCr*APiWcr-`VV*gqmFPDrEcqk zbwKb>kM`+9EFCTuet%5N!r8^w&DPq+1EKC|?qF-dB!@XSAc4lc$xLg@>mb*6r`qD`&@lfB=$z z1vp#6U~sn@m||q$%HLym|7W$>czC$Di}CQ-;;Ii`wifo>&TiI?1J|-3mIn7NTDY1K z6O(ne@N~pFd5DRrL#R7~7k({+=YPfgoqRDdMeN_x`+80%1r?i7SIZVBl9U2n7lFxNx7j13q5aOKCZQK*az3 zzy;ca$$&o+J4wpEPk@Ur~iy)aQsuY2wwhP&LiAA2rOCt1YcHHq_r66P7oqEtk|s z%{BzKsv#_ZQI4pjP-MZT24558zP9dO4`Sq@5cSB7XQob^pF-mahW?OJH)net?Rv*d zYrhG$uW-So^W^_%byUdJ*sWO~8kM`#`)0R>+B zmB%nySL?(?NWh$rZw0Xgo;;dN*kp-3<7`EpEo8C`Zwz&|jC0J8vzcSeNTPf?zNN~| z^zeIs)EkHUSejrS8yQp(^&c&+Z_a+P#^I5l!>ovkl1PjhLg~wqgGfLZ#}D!0`~KRK zE;6O>@%ZcK)MTnxYMjkHwY6u1`_uR3!|-U-q~WN<$poDO9I+~ih2$jl@;R(%Wum9| z;=AY#Y2z$;@+{$U$o>W@Z)+wo7B)hwN9b4=8sN*BA#fp5>dGJ#oHvXzp%{*g$2=I4 zK@`aQ7Em6lCFceNeDH{9`TQORYWwQ+5k@Q04?BTpOL9(fg>Z2?M1SnCA>Vgvjs>!? zSE$y3pXEU@$Tf22vN%SD?7v)c=9>*O=_XIFg6sL0E&=Qe2l+ zP@jgLfkKApjxLFtjSt6VQ9egsrl#GhPFT5IBT7My;$R4ECsoa%D5L z9y7MydtjrSyh!ZTlu7{zTiVXUaw z5&SD0MP*QUL9OXd`1kMOr3e=`(P?Pt?3vQE1&28XYA2tu&Ch*)REy3nrBE`)tRdpRAq933iGo=ga=+p4&ADzXU zvsv_7n#Y}~s9OMsTX%msy@S^T*oD`zm^Gu+$xP&Nb~?*%XT zj5#duf~340lC;ULh!a|oorg?i?h@lH*b20W{`N`uZzW8UlnEJ{Uc*)ihm9IP3FqU* zDrjq;cEH#^9Z)0sv)M`v|JB__)%yjNsY^5Fi^X=R1D8L)zWDlRJ+OhLBOiwITOJi; zB&T&6UOjTy@~PKF#17&SyeH~A`TV^nTQ*s(&7AMMlssTqih84mo4VxHL-U{(%%5g} zEX*p*88Pu7MFlM_Vm9*61us^J)l~Xu6Q^v+O@HAc;s=Pb&(RL?r7tTJ9<_m+!UgWq zq26k7kJXyIy~7DD`wx_GBPv9Mc_z7~*u8(}Bg9DjECDRim!(|sqwvkRlC}?;mu4(> z9w`Tto8?hzTb?nTwocJ`_!bSKe>m~|t?yt+&NCK~HK5I~n1+7~>t6NFXs$SoI`E>f zZ!d>WK{Y^JhC}Ddlnkd;&tLD38*Fg{Tx+bTH@pw<#Jz@^ja;9krF-V+mREZ(r(!4| z9`jMcZ*DYQxOxZZV+`m+R>PSXvrj6Gwo(8kpjvaLpjOr_4HSl1?Ah|>X_CDM4xUn; z&Rb-__PSZAyL^be6I)@rWHR<_g{mY0Xa zqoW2~LLu6`Iy&}YZIDn zJjQ(A!&wC^0;NDqtBfw z-j|FAk~SUwgL4bRxwQT=4<30j|3{^XCb3n!jHbJMB#5-QjTBrQt@;mwvAJK!{@q2j zDAWn+7{89?wA7z8AfkQiiD0VkANaAv-}%p|?2}@t(zqJB(S)oG| z0W&g^b7GkZepmOA2X3e!<7@d0cVtSkuo++Y9t8vFb==DO@#BxrD>i&l*fg`h>4LJp zlYV7-s+x6v?O*{MgN;$)hr*I!}jtB4EuE^|>^-mF^sQw65dCpsGg!`2_#p&ZT!Pv-!&Z#*>e1=~&m!+<-F&NW($D zykJRf+g)r9D|@EIPb14;`zW=A%;FMW;d+x%x}VjXAbd^~TShKzI_O6_B0VK6l8U*;@zE#k{Xk4R2!aR@R1X)hke z>XaDikOvE0s&cKA^Sr0aWZgEim$OA0+%k(}EJdQhEQ!dhDJ@UF*=U5zOE+u0pP_x;0}JJs(>HVW~dfp9%|i|8-* zA8@beT{vN^iSFFcaT@e(T(+p||2{v@WknHLBjb5==eg9RCr6XKI8J3!i*}_x>AYS~ z{b+&lsneO;{9?k))rcjCy-g5TyZ~H2dF|#Ny2fR4x)BcG1S&{U^9A7yY0t0_i+_&O zZ0w5pAuAqVRM%BU#}zUR1)&x9wBhEMGBsgTcHP6D%*eQJVQAL&SA3$|GIvxLWnsVj znz)nDqS_be3BhmZ;ImYdh=$SrRzL;ys>_o;ntjuH7Ig@QG0|KxVc5+yp3PJcaNPvC zudp49H+hp}xH7pf7vUbQ-SZ!Og4)UE{w6}y`}ylA5vs%A61+K&#FTG( z-}t27CxW|jYNnM^f_$-uI5H*rk`bAH+ik9sN88w8C1#r$T-arQ<34#CX-Jf%gN(%- zC_x!G$HqmMS&QbxTj+5uq0NZ$Gz>DU6P(*buWRrWn2QgaxQY(A5w6WLFx+R zochfdQC)0+(;Wmej~TpAzgZe5NSa=DCs}r(xET4E$@El0vR>VP6?=FYx1%igFMSL! z<-0BO5my2SdRMDazEb!8IX8J^X?#G!v|V+q@Z2nGd+kle$zeI6p7G>Ur3mS3;bZGvl0)0A+=9$0MHsf}%!cG(*6OY|wov-RkuTY0R_cUunj`>?u9sOcD1{8 z7>ssU3e}&7o{?e^+3n6xR1wGoed8+pIyajQNJy8V#daYKl4%M_?scKu!Zo|72U_?< zZN(afA}l@-Q#BFq@ez*L-Gf(A+_UMJ2{wRE)!T(8k;~%x2m@*3G{$f8INeg_&p$f=B8CQG^w0tLpC)ZnT$qS0J-3e2|u$stP<0LC3E znVw?jnEOOE;Y@%-T8LVIvgbg&Vmk{B|xoEqLy>tlB)MbSVwsO80C?%lTP@WKI)nf#5r#! zkCW+87yl-<3^jbhYCbtjqb+a4uPBI?j{$@U8L^Z|d0+knb_X(e^%O~Uli8y!S3Q!) z9$%AZ5lsAddG{Kxh9Qp4a($x)6gZE<9&I z>HQjjAw8S%N#!MgbJ79Y(gI(8%#|tDryy=^yY^))4e%EOu-hN5OewOVj&?8$B5r{O z6~4sO-5tXyBL$!Xjx^jP2BWN`uSR#J+%9(Y<>;7;fWhW&*lthk1b60V=hx-4`L|a|+d4JvbgWBf&vLs`c*-E>sgVRFVGS9-31>_k zo!M>_jSd|N{fhpj&QRaxBHRc~E6XsyAKlsdA=hq0x&cW!7mCG9wSa;PKb7Qf@j~USRES-K z^yyq@VHR7>%CB3B^8(CW>rbGZ_K!>uOL0X@n~+YHdM`wwMMR2}yaG1@C*%=ggkkaS zZvYD1w!_F2-XV60mN7B6$mjZ6^M!@CH>SZa->uv3WEoN(y-|kLM6*3#wzq@56y6Ec z{x4NY*=sZU_?%8hhRGv40E`_or_6M#oc`zoaKrl6eH&+PrQx1$yiauKfifVT?c0QI zz`a2zR_TF$z;JtQli?TEcRS`I1(kjHYT9}a<`ZZg5DGH1NKWB}cjN_h@z%nZ5;qDFayzSu+yzu2VE|oK zJ1*|k{%ClL{&S@$GfJ{}b0o>B%L`9&-vZ<48Q%9kxk-1e6!E|)XvTxwePwTCOWE`q zE)fZQ#ZbPZps)W_1EW%)LF_6n%MjY9HG>hxt2`zsQ-77yfHo9})cp|0JDwMtH5=>^I`mxXt2fdE}Bq=T{rO5VH)BanL@SdhxbW#X^v` z68^=H1uGQh>PyTfF))sf%A0>+-bV9(snYC=%Mk`%2#Wc{%JT+g&vyqv6I10CbVa6+ z+sf`aKESfrr1|2JvdQ1wS1r5MS|cjeNR(!x8K;Ww+mmNnIdvZa43A>DLi_g)`)HU%Y1n=^nMObHN%QFBNR}x(%RZK zjFm4w{j5RsCp$_c$IGBPHh>o>{P_B+^B@Dk7R9l`|=d>Gu z#1@h1dlKqD4m%+(4%9fxNGCm`#}gGjjALklZzUVS%}+t4-v#5Q2KmW302>%HF5Hivhwm@#`VY zbY0sJ=!}V|t)npG>yX{GhQ`-V$3FMRjyAS@PH1O5g??PAXOw?}s{+~I0hzM}MkUBl zi27e4U0YWV9(v&dYsn4RDeWr#%*DO!2JD&dxEf~u-cM$0f`3EASL}S6W6wtUY*GG2a1uQz`43rqJcSFh zgi|1lDbM`o4T00z;`nzH4%SCuh-J&*^vSW>NomN*IM;pZDGb2dQmT{>uP*+$TYH74 zSnGJyk1Oi2$rKTeXM^Xn5Z;=|7dvI0S$U~JPv3s|7ep2t1-aX0vooZS(5iWlZHHQ4 z!k{rG6>=EBpae?#5#x=}wCIdE<@D5C8*<;sb+X~M{(V!vn3qGlw{rwqQM|rswU@cG z^AO;X!C$5EN%3bbN12tCxlw&AzWkvk$pA*^zpve9g;z)5Y7KhuM2A@=DiciimbXF! z=^XX^=M*cc-Fq9$59UuvW;zK^O;rV~pb;5KJ!H=g7+Kz~1vIab@pLPA;Q?8yU>4$n zZ$G+OwP8XOx4x4gdi#gvk8I0ZXv>#iLaT?iFPr9WlELV#8QjDb{KPV5YEUPx!$4$% zMla#C#azX-^jf4XM}P&xvu{DCnZ2+Bl$U_yLt-mXg4P(KD|`()4E z*+SI8Kj@rR@!K-sSkR31zNi^51$}%sf%;b3ZG9~TvCQ`6klFar-^4k|I8iDx5mQnY z#lrja1F!|^UsJeatS%Z8HYR$RI{-fQ?s7bGDJB+g*2q$(m}RYI&N;JIC#2Doc6Z;#Z?h3c`^u*{#M(ceE z=5GEHhsPZS@ZtjKpEy`NfL$zBUC~3q|8Tv1g*W&Fv)#elav1Lt@bt=@CrZn4E$|S) zeaE!w?60I9!OVc>Z_e`Nh6QGt7GMij0;}gJ)FW|F5e~JC{%c0w~Eow}nsZ%k>KCFZ>Z(BGoz*`*{Ra zc_#2dNqK(d%GsUKqiah%rGeCSASp&~b&Wc6q=(OAp3oj-IKZQYf5TCJ__Z5ZKM2uo zK?hCpYw?Flw%AJaA!^wtAD8sGeZv0H(PNIxH**OUFK@GA(S9b}!W&mLvE=bv!8{`u zx_-_|fyQ)-cFd1GM;|CUWHUkH$tHS^4mC9oO|-?ZzCn??BrV!tfo6HqfVy;Xy&`d^QP)8Ct4N|cdwso6)2 z)2|6^`xFV|$Rf& zK2p+UF3#+JO70Hz^BTmYOi$@<1LA9$l{EHYkPpu{#Zf-1&iNb(B5M5B5=f7UlDk^^ z));I9&ICpS77?amlZm{R|MjtvBSH!oUV`%x z|H7=u35C5R2xnZUH3&$jgJfJC`89A~A7`>Q{Wilpyj{MqLgEt?AX#bw+QL5$*A>+f zE3)6VgYQv8*Q?*21o5&!=(2I_wq~!G{ek5z)h&Sapadq+!ne|<@v3aw+ zz-Yh1)MVW92mhvSK>em0a#i9l$xuN$7gmXR^tKkEMa0r&eQSIB`D5m${abIiD$kug zYV|%(tUVLHC^n!z+$~$_t_o0^dmM32YZqF4RqKm{A=E!Hh$mHRfVEWn{zTWjQY4gc zJkzuib*QepeRT^9z*|_VE&Hfa<8JYme(-X|X8L=0Z(7mS)NTLB za8)N-d>Qo05&iyP*^?truc&3RIz|Z(L;Nm0tutIzN!^}8G(ft@ zddkv;m&XRl;ar7Kcrkx^O+&+e3kR2TMta3i44t-}hkVK0JJG5;o zQROJU@nw3Hj;_}T_v~0T+1s<)3gp>+$}F6MBq^_Dw$(k@LU>ykjnMpO3-jM;?)~t$ zv643eCq%>Mnl*HAfqdrsKg2DoaCdac-x|GJEsv%oNUwp@tuy31!({!-5*q~ zv|0dMr`|BBKlC}1-1LK+&KYj@bM%*$XXc&B9Kx9}7)h2izZ{yo)Br>3=n2#jZMmQ4#_)7K^npCLMVZ=9(E7JtdDRZ6?n0yAv-p^~t^6YG1 z-9dxSS1CWz#?E$-S~s76E~6ij3S&3g2q;>(rnYol5>x zn6FL#7R>I4s6RT^E{T<-)PtP!!`k+AdJIi|mj~~a8Yth4RHsV?H`Eap=iPAR?DW{nwnb`xzFE~V;yiMb&WEJm zio2{IwIsYKZ$@Rqm#|5{w>xzd_TOo0!BvinztDcnJ#%D=@$}j?&YauS$3}OCy+KYJ z{qXE^@1M;WcD1v(-adwiBlxb2(~b+E-NzirlU;TB(4xw&{74T zAm+QZ^gh48N3EtKHO$X!lz3neL?&n1m5lggE(OnK(^1`#n&7 zH2u_YsBt=U2Oc0q)zT$wBlzD^8sB#2lxcBVnX7JMz*J&k#LsEt z)ES!#R+KD=^BJZry@{haZAcYFi|ICv`JKVRqLRBsPHQ&-%YqegBBkjIZoLPsxi#I+ zHGiefyC999Y>Rg8)2&V<09el`>M9rLWFy}&B)ea+-kyo4qi^bW##|=@I&l)0K_g9^S7o9yrR|Q&2|Ip^7h(}>&?#C^2I=!sxBUYB@I5u z&>BGS_r0s*oS9Pqa?Q2AY?`#{!Ve&`r+0kg>wDs<0BQ2NTu7DAVgcYfer79+3^by3onHU+ zJb23Hbi8K8G)P|Rj~zgVj!!-Q{-rM0g8Njv=v>kZp+kPMM^tqacQ>?tedHq`hw9tp zXf9L}uAk_URKvdvw-U|_MK;& zu089+lLRCJb0VbQe!$^mEscQdE&;mm*~W|^<*poteeb9WPynl`-(5Bk-r(9g@jNC= z3zKniqMvr}dij?O`v=*IsTAL3NBkttf^DyxAUoOUBQ*+IUL%U<6{)zaJ!%9DBKnnC z&}MY`#qjV}+AM}cZgjW1+mZt&c;$us z*y}{ih>=xdT~zZSa{I)xR#27_f83^J*f~;=3@E-{Qu&4#aP7Mu#c#W=Tw8A^W=8IN zqjKJ$?_wpj`r!zpHaUnJuuv>Vg;=j|+`m3|5HS++zGu4O!QLuQ2C2y_6(IeU?bR!# zBjnw%A(g}fx%UVoJIW1WkJsib#?E7CjB%VlDWOr^P<|h}`baGdkwb}Bwk4ZNIY++S z0IH8O;iYFJ+_7)wi>06_?T0#K&Q|R_M~g{)kK~l>pO|o%Ky{iz;Pa}Sg&oMyia_^i zI+SZC3xpUtPI9|;|78K?9Mx+$055NFS$ihM32Ena0^fcqu?Rxe@?g_chbM&M{Dm|I zilsSIM+sd=JDIApC$bg|2!4rAD0O{% zbN?aVfXmOF80haf=ZU%X{?6fKI;{s!F56B`rumN&pRT_fX)h8ZYClQ-5hH-c#`9N= z=f}#!uK5;-$FeOIJ-Ym4S)2YaQ6fvyN_DCh&wf50p65MxCMiY8TT(eXJ`MvC%(o_n zsh!bZ%yC6Bg=J)0@!&x83Lo2q_?fRawVzbApF2&CouyZ=fD{Szh(1tikyd;bS<1XT*+*ZMeUqE9X}0kTyl(pcg434pQdYAy zcL~4y-?^D5UV@by{AGgct`l zk&`&dG$PiI`7iSw+l}^UJP^#tB|k9t-Kq}H8c@K{gr+}dX<7*f{n++f$4kK+-<56u zcyr2rWw9^*;TR#@%Ds~LBsIH{LzV0ED+%Qe6r$D9%1Z9j0YQCG89i}&l(O5!#eHO- zp^@Sfe+~B6@9Zfi-6TYri33$~gK~#>4C94Ru7U!KhE-=pkM~|#19?%3#j7X&tgZ`wEfO> zq7xMkdX^#RK!j%(_&)w&I^|8DC<9bS!Uu-Z>-KB}2=(6P@shApp>pq9gHTK#SViWj zxLMeZv-o*)380`xntrR4v4iblmHBtk317d;#Z7)fT z!0GB8$E0r!gDJkv8llbDpPakrWB0@WHJvr9slUl-jBt@zI*5DmV3AfxXY}%8R1m<)=^$t?bh^3$ zd{@{COZjTUSB$Oa`jjI8RP6>VY?)h8@)X~Ik#h(blru+I_%<#yT6`Q6}w26H+%fpH|q85dF97Z9!+7k3uvKf(D0lB_9?akiQ&< zg{l)}{rJiijvWT=>28;D;`PJt`WLDcQpLY~2^N8GP0K_0#L&o|n= zR+OpwO*8iAln3ozBtI$U^K`<0^7CWykPX;u_A<1qI-rj zVIJSz=_>~j=?WTCu<-$MUK@O4`vj~67%(?XpmUcO^=H-0>9~Tz5u6A7bsJ{8r(@;l zc&mEGZL5-Pvz~CjTa=LGYyMV7uu#y{e^W=j6DtHwxT~>hG-iN2^1+{Ll@YuR~DRa zDJq#0#8j=bDlZ)ls@m^^?#2_>zm;o8+&!DC2&m;BdG7D2nYQ)@Wx-!8qLa; zyI2m#{;C8fNroRw7$Xa3n7e&sKsGZn;A+L67t?%?j1o*GfAk~)W;{xiP-zvMUW~XB z*td@DUg+%bm-rSX#+dn6S-W+!CY@ymu`4pcD9HcZ__2kind#S6;twQ3MNXjMAc8%u zC+I0sg#AHnc}b|}Zrcq5nb*H={Ap2>^Nh1zhoi2jD~D?kWIbwb0BzZ#Ryeoj5e6%e znemO8o4HdzAWHr~U3bRyG|S^m@&RN&c`R3ZA)LIz09Z#I-SrR@?$-BThGvJM955-G z9_B>AL zFGSdTp|OVK(2)U@TuosUd({5AA1ad3v9qK72X@_`j-L9v5BI~X8hE?<-^Qg_@{R3Y zj)0$y(CKk{7zVx;pSy;f4}cqy4`WZ4ZAt5MYCi1$)j|my-L5g7Gbc=Zf$39T3znFE z>xivO-TH}mKo#^qVMSj!>c2)u6>z+x%N*ePt8NY$yWWKW1anyZh8tt`KAon|aM^#; zVrKrOQ}XV<*cjL;lvrW~pBbNO)9^~v?euF4<3<^NiidIBb5}LC2mi%W=s6~#DI|+G zJMLR`>M2y2xjl&GJ-V4#LJ8#r=;B~`V4q0kmB{#QwR`T*2j-@_eGj) zytTJ>u>qMTGXKOFTu+*$_z*McwAHzYFl%B3b#T2}y}oX_dJP$yJ0+Pet&}qRm@(<^ zR-yU7Y|wIeDl_$jZ`D^VO6nu&?m@Yx1SNkQ9mN6n)c^;(LTnf@LhPy-2eK2y$=tTi zRa5mop^REYNn2fDzlvL#(iILGSX!;9gm2vG>JqFq{~DU0JT%Ofxzja(Q7vry4J#Fc zrq5{q-zC(6VXy*p0qX{GeDg}4Q1fRb#>1V+UZ42h_rN42119=g7K=Mr$`*}`@7B(s z_g++iPZd~Jew`sJ+R4$liRw>&d4=x3OyP-eVtM&QAN_4u1%dtoe?m70^PljR5k81G z{;(Jx9&49V+!4)sOt#+lU3B0k(7)e-Ce>)bH6Q^ys1d9an?=nl&XE(^28bd0vDI%k z`3&$3B&YGDB|5Oc!VQ0?H6JI% zt8YeWzm2Da#--YASUInWgmGXSIZYrJQ+eFmj^x$~0@i@J2rsn4&Ua{TnSWhD7;!uH zp*x+5j6$#TNapVO0| z(Jmm&9+wx{9xA}Sjt6u&RxL5@7dVDuV8rUD>^>Qfr+V1{JX9Apz!IVTh!)NL1b^LP)BkR7*X8<#peyK=Bqu*fKJ5(-m4OyJ>{rLiZQs%3 zxxE856gIaTnN-!38@&^^y*KQK>^PS~ZDFa-Uml_zE;dP0y@#I|aT>--6w0Y%sM>O# zg&0bcRx*I{%KLTG{8?xVCrOhIqW>p@$;=7d-zGqwcwpjTg)~2$+C3p$3gZwk?drqO6VLnJ<~3|>eva8Ob>n1EB#f~*hQ$6? zw(Ah02+syzF@H9l@?h3Zr?~FZn#pPe6iuhh67^>cjd)|-=L{8)fF9B#WEtI|3)4Ty z@|EUH1MOBboNdZdn$xdr=OIGJLf-2y!jc6sU(C-9V1L_dFL9?3Rj43n6SFtKTI@z# z{bweylDr=>*>r~`VOt~lyRT+%`*J_X9}-}cM`$4I+3Kca{RU~iSem|wd_O&W=Jc}< zX@|Wr*RzlIu?>&g$1)3>eCj0kHFR;S(tR=zTg#+9HZ+^@FgDSVY&!lgqKj`-@|E}! zNe-}9!Pj=3>pegX08!l}S;4&lSziwcrH>PI8NudhX`Yk)@V7tf?8tk6DJHdmad6j( zG_!WEaI%oip-qrxm&p4A5>as3W0BZ}oLJ|4h9CmRpA+xYZaaVB5`lh;L z?%H}$iR~+ufX-p!SCRNH@5yVxRo=KZ6`>mlE%(pCp?YIV;M~63MU7u#`|x{?a3^QP z`H&xTA0H&iCIhYR6>igLZ#DApmR$*e{>P1hUMY;{le3l?m0SyQsH?Sr+=0LuQWJjC z);mKu|MozoSv+bY>7O)EM%L^PEu%WjExMqs+p@#}TS`8v1f9w0Htk*WJEe$~hsMg$ z;)VQxXZ2aRPs~V>NezX9eLqE^Tulb0h2&XUh=ZnP3CB4wzp(dKqGn>jRY3#qDa94+ zI@K0u*Os^aC}gPVo+IEr^E>bj{%*7&*gY+2v=DZ<6bUXF{zgZ7{VGS$s=AQ5FX_$L z&dneyO0c1J;Oe8Fc3+PWHx=9wxNhT5#nWm9A;|vo^+vdARn?+mCmGMRI7Hg`_)cq5 z7;DGQj`n>!sAqldK1h?K=sQ>XX1v7Y(!ZU*Wm`NPTzD(&AOEhe!Pgx*Qi`O!jOim| z5JTPgu!-Qc@*gd~jj|E0N_lbgtUAvZ+46PKn zD#ZUjtVxg?$*bju)LMhoRMiEHZ8Ut%Q&2(C{}{svrD$u-OMO7Pf)M*So|Yq19#0ej z?FA`onlkvvq|1QHpeGNu5h$krZDkORL;5pjk)UaHEpKGLIZ|tj>)4StT+Ss!SjuPG zQcT%%naphBP3W)gB1m8C5@KfuLYf#s?2*Msa>?+={VER18-Du3=|=-^gij~ez%m1S zCfw>487XAZNNLmQ$e(RHPj>!*mFd5kJe-{1fjA9AyV6>uu#LmYa8Y94TIyi$0c&rk zTVvHKB?lmLLTll#0#ym`pdsscr-qm;Naj4j3!#n#&R9Hn^p*aP(9^lBbhudH7>^FE>#8Sxooe)sHbYrc3@<$`}Ue~cAv zqMSyE%owYw@SBs_5&nMX-9`$G6&QFI3Vze>Kk{8X!2cx+fvmKBwn<#$KNKmilL$&*b4q zuG|t9PJf3CxB343ukynf>|;rgA|OxRnY~m0`aS3k1|`olBq@-t^VOr{dPS_YB|85( zZ;li*>&(sYL?CZy^0OF@yZ0+Rvw{yC%o526{Fa91CP^_>L6M-b;J56OTa*WlWZsBf zi9&~Hez8*0QTxipw|0K0=j+GZVn9PGmTQ*g5Y$tkM{cxgi)lZlIwZ%QXtb{V>$3Y| zdCT^RA6wQMC?$e3oNWCWnfLiD;Ger$kCL+pAUrgdOl7B2!h}1ShI|pcbg^NS8SvKW z@XL+$-Ogn3J^H^aB}`li2F0SNAmuzC=tgx>dTCyI5i&gcaWo=Mlh!xgXrTU!pP@L? zxox$#$C1RpArEd;!aVb z^<3UBaxLMf`JC>s+liU15EJBQOieU(VDX)2eF_?k|JK9_>mmx72}DCtiXgSjP9~v? zkeBv6TmO+A5r`dHb_{}LxZeBjSfPp^nQ(cMf*OZ(EAWJ*B=ZE3T?PaI?eCq&;H2XD zBKaTAaq+YN-K6HY73p;E0(Wia(F%Ep)99$K$yn3g#ykq@!k6^X3DukQBG2R7!6XSa;`Aww2(7glVpwEVa8E<`$AyTBrrn3|m7GcT0! zxorlxsJN++s++J$ehsI=P^;B%Fg9{&+Gc=gh`dqakt zFpH?P0b7$j?pG99@qPJ3OBbn_qkKCR^*EJEC3f; z&hbn>6A!;WM%f+bn@0JqWL>z`r|3-tZCz7G^uU)SQjE1n9g-rt+iv0NFaM&Zr)>*R z_Uc=lXM88ZmhIrML*QA6!)Nfqt@O*Sw+r&eve>ieKNI$hWOw()pR_VxJ~&th;qnDa zyuLlQrSz#;r|BK@d!u51X5gmQC~k>%<&9%#Y26unajgTQ_ko%t(QvlwugU1py3jql z4EhVWZz5k=%=sPItj}Gxn%Pu^M_fKp9pCdcSrs)8`+2237Y(oYrC8>aFvxhtW|QVz zd&vub!8ME|J9^(@1&|(JUi&Km5?;%y^D#A%`?`E++eEX!zGVr4R%ib%>#UJp_;=_%ndjP=sFA z-h;DR;qR`a&(hC4S^OFkxc8UBrTqN=4%UQn&2b<$ZKK!j+6&N*`F)tDm^rYD7`UJD z4&fKRXIHn2 zFDY^Mbs{qxtK}GYSAoabCM<(rEuW%D{krms-c~FH$F8{1K+T^fPF5t|1pIM-haCZM zWy(V6eri!7tuWvlPpGPbAjLIQli2VxcQf|g%B5~*%A=j=JFdK%_i;5(bz>|@$E~l= z(0#*v-Q!mtxaBdQBBFL&qeADJ@Zor^i!dmkVA(f+eDv^KIKIZR;9=r~YqzPdjW7%j zZFOcPt%sb`EeX%5{moZ@t`_LhA%zF3cPH&<-Es1tlAvKjztzPp_+vH8@on&MlP@MexCWzmd@1rJp4ydXXez5N(Q#|kv$UVR? zcBr~D=0`Thd?xzw^8f`C$F=xaO%a#vtvz>2o8B;_Rr}<6GW-LM7XXt2RqgS^`3Fw4 za_P^W=I7Z=&)4*_OK*b2;)(F#((=D}G4d4h^GD6g2^)*gIBN9m=!xf9#cKcYu;zce z$x-P$;Y{K{Uy}Z^E_Cv*s+?kaB~t6r@u$xJ@9?rLQlL0J-t!NSH@N>Jyt>p3bN|FZo3>?sU)wU)BK0A~ zAK(gJPDZ1TFT0I(z^i9&o3Gk4bx&>a(Mo*kMu&_ftuZB=O?qwfMmBDbe|FvktvqP3 zj`@8K$xj<8LQzKt_ML(iD=xjzKq){6s;X*WqRac|n=!vvqlM7#n?~#8RhPau-Mo|g zuN>Sw1OeX}w;TDluuSlgT;(92)7atP-O9m!_{o<16$>^S`bV+<-vyv^-*W+oUcv1| zm7%7}EFSMeeE0jiTQI2nGsVtmBtl~~=g`3Tu;27U3R&n?NVYEM2UeH0TTd!3=fv#Y z%_6^=?&XmJu&#h2UifXYPDJ%QGqwbH@5Y2iZyT;0UCp88Q+h_?+c7`PNnna#6PbgR zKda%luifc}D56sXj@tm(=$Idn9d4WO{_qWCeQbhJ+>Dc1d=d54)1PRoUutg53joSm z$Ojc=otcdWj8>1v!l3(#Dy&GyNMwV=9pPe246BlKtbbZvzUrVP0kD+Wp;FX5KizXQ zks)7ncyT=9$-k)Fvx$?~bm)x|f#R{%`bHz;?GAFQdwIo=Dl*x>Z_;{|Y#$5>k8k;I zR?O@-EsJmu@zHxX?Rw~WujU=J!2~W(wz23>TiSM5U}YI4WeysoX24|? zx$corIi#dKtZVdqyd1+kTAUF*<{&i395QhgWf5cFPWKZ~MSk-_1WNdN{&XS@%C9T~ zxPAp{zIV$DRYz--oua!x54-aXP^5sPFXtRBiat7?QvYVN86obt-KusYK<)Yv@zaJA zCxQVx5cm$q!@QvyFFo|;L2id&>tnkemp(5X%e&Qc7kgmqOFLib$u)6-_!-%8TG43i zGhrvGkW|()zoro@_pMf#I)Zq_1%p;Y`!GB-B)0~d(jsJq@v>xbJrN(}S28LW#8|W> z46LOow!MmN!-0mSgSR~OGG@5L&XIOLeB>WkaA&Fr*Jm}E zM6(7?Vf^JvN-ZNc9K;kn=c7QCj#!9kx*!7dXbqlqZ?wW&#e+emphE^{uNe9)j)9G4 z63P@GD`e5I3sh&V$?0X4|D)-v!s=+6ZZ{Cz9fCUv?(QBuxN8V5!3nT&cM{y)-QDuy zF2OapyR-k{d(OGxiap&^waQjiPfz#6^31ba)L5*sWO`nPc8-H-ewQ(NaLp|-ToofH3wRnVzdyNjIhE|+bGtKYNC6wk8ZzjOQAtGNx6gWsAtBz3ZkdY-#^|6!Rz|YCGg?!)cMM=N4gc zql|O!KX?8$F#egnbhz6A&M=U&(zCcz@D%?0C%9)~OqtOA>^kGQm5erGPb8P*$vp($ z-hbcTkI=?=WECOX&W*itOb*;0&VWR$A7?X|XLIXT7^F^uaJ}%x-&N*l%F#R8+$(`! z+Mlw$Ho-pql6(M75gh1h(q?fO7klMiBI^=Bh6LgxbBgd7dCYxOCVpm+^jC$LRrgG= zdpMJJw5y!rdNh_KAv>Q&jk-@wk`5kkoNl7YJd_mpqst#%%HY@&SE1=ggu?jfT94?n zJ+csbz#!283z#3pF03b`D>{RcVowZUsHaxcEm@R#`*6!6358Tl_RbrXsHn?DWesp2 zCMh4hgo3E1HcYl7yy5rvmuqQz%S0vU#~QxUsf~VggrmxsmodO3^bJ@T)-8Tq+=$8v zA4K}YJ7pec5r6nAS77GJcem!x&#OYNKzJhPBz}=?QqeDu9b?1SKg&|zL>z;8AC(V4 zKR?fD_`BnYdcrK;V3|3eM6t-`gQ2UCa6ALN4HtSUzTjuo^i2t0JZOZkC|^&1ZMnp4 z;b4i}LQ7w83Zfsb8Nn$abBpEK{_D;mHyU!wAc@akBE>2u&|E1Jwt|uKpy32DI?(QA z^=^e*Pl2!JDbq`NT8h?B+usZj6gYHx3AvHNNt$a(HQX{a=)|Wc5Ww&S2R}Je3haN< z?vzk?lb3F_;;#d9vumS$hV?>;7hHC&iHoyr3fmJAlYk@9_epxnFDdiXAn%d?Y4fg> zEgenfac5S}*#KrV;V^H^;Q3p_Jx#8i7UNvZvBJiwYq zN1BAH-WFxD?#Gw3R8F748)QkG#bd;pw)N2wesrP?;TKHUL{etr4}Y^!cR~j44c`{L z%(9kW=2iE$801GL6VxYapBZ-jHpK<4AGF%G;NJ$Fr#H zOVUD*(n5eBQbV%W|JEH)QzG$7U>*gU90iyFe?N+wl)Z?Mq%Y7QGZUgnJokmYu@)rj zW>D8pYKbXQMNP{09Z5eRO8EyiQnYA$_ z<*&c+i$)~Iid=)l!PY!t_8w51st^(> zV^B9omYn7Gko^g14&veuiZvo}PTEnCAwU+v8V8qtBKG%kFi#;3N129>`&h)o1qn9; z>-~2ad{{nDcHR8)(3@a0GyT`X)Hc`O9uH=XQMxXQ9|bGLoG_np3sD9*_*8-#REiR` zbdFdvN%XI~+($vLbczc8>?5*!22AGHi!u&P>cflYn_-U)Vcj%YVo~pI;8s?xW0y8A27jCg!Z~wL7am|Q5je2vq!@)pNDoD2m`2*bzv$A1 zD{momG!tY&s=f9)#gYiJtabtO{{CHeW!}oSgtK$ZHFLJL%9;O|$a{?5o&EYJPj>ZJ zKz;79!A4PX<3Fdx2cIfRAJ4x4&(FiDZ?KiD=JR{dmi^IOArQ8KlXEct@7&rxIt*G( zt0z%y-ptNfk-v&j)=XdQqfSVS)h|ng;8cz2p=4a82q7^Pe%I{B&i&Ha-GMSc3}iFf z-n2~9E2FYHf`6Zd$h{I1S80o5h0Z|A`i#Oa=v?2iU(R5(^**FZlc3+o?k`Uqs@xgSV3Vu^qs_wIl93|(ls;H$#l$vE(fgs8 zUaBt#eqcS8`u+oMR)H+E5GmS;lu_XB(CJy`&P>J z93J8+DL22Uj43iXU$vvdD7;8kAR$!VFMTPo3o4hqHnLX3(P8n|IVKiA@z&YOvq|C~ z6~qmux|sWZae{9gM@@S8`wv&DCbYraPuNA05I{UXo{Uq!Mm=w$gtG7XawJH;>?k%(ra*r?uH0%}U+hNA~n@W;o-) z!5xtx!^FffB)H8uB^8&stHSZ}0AB3vflc2vsqHhXg&zQ0U+Z?uH|#We`aF=V#q8+( zUbj)yG{4-Sp4JDg?wl+huyZoX*>TqIUn_^~sQmV43BBV6?7oX)7k|Fsld-62!JY}? zpAk@L!hV?l#h3S}tRfddEjKEC^MlF_nwmt5zOQBek3O%g$$t>*%p$W+E;8Ro2Uhay z;x12=$uE`7?slwW6-f9-n!J1ms3tSz<!D$dmB*7Q7jwhy@Mk3E9uyF7vk0*J}*|MH!19ok-cOfR0 zjtY4{mopY#ryagN|E)TE)*y_hAS(qw&w>O z1vuG0iUB4+>KzoR7E@O?{LCWOS8#(8w%+co<9fD<-Y3CTj&#J#Kf?=lm{6Jvo+*ZB zraG1BHPCdfst)L@>{#pr-=)Q|fyczlmf(LdsSHGzzLvN)O2|IfJ`X|8)=1{2yBozO zdpjkE>1VHe*&Xl}7Re`acO5M#(w(ec_n)}$J+1D&%G52!SuSgRbZC%J|ItT5?FuVu z3!^~EQz;-ifMq@@l5qdlJ&2Akh&<}nW9H-B%4xLP64Mk0&2S_L*lbx*L!G|Eih!TPkSB;X070UVOoPizZ=6N zdt;-NcXUho-Hk?X{6x6snInTYui*tClD-As{*|tRWrn}dQE(ifx@`d{Kk&f{Va)J{ zV35qFr$G{2uZ$#Bo1eyY(VJbzH~$l_J=wtg5vAx1i^QR=d%So3gN}^x@@n0bzzJH= z(Z8*5ik?4wTgmx48$bqeI6WvKhy%w&tTBBQPQoOCyAN_F^kDf(UnlOr&b7oFBlehK ztf;XjHujbOpd8{3ca<#8T%C3pFt0X(+y5(z4lMOOap|~#-C8R$0}Dg~bEeseD(0}> zy89T*=RibylfB}GbT$(hX2Isy+r2a?$1FH~HPnjq5B0L(*oit5T;NGo_%py^Bsv+o zIkInZW>JZaG^+`uh+7Bd;bEi~)+Caa-2lqk_IrYhtuv{g7VvvJ)pCl*dj@=4O^1|; z*@m%_cLiD)H+nUbvnNM0ygQrX4{dPZ?t^3od$}a!MgoCS;aBSs=FIk@(Uz=vK@Fq7 z%rUw6v#rY${Z+|0c=#^5sR^^n8_Ha2uk{U9JF&5y4H3mL<-x35zl#?Di`%HVa`>1l zIFthHC$-X`l&stIyJ!0p&;&2Plx810;GsN>G)e~F)`g{ysi$#OH~#~RI^imuq|5U} zw#23)u%qywog@wKOSD}Z$1=Jl4`p2A2;QbXxqlv52X;33{-lqDpQxz-*Uss{+t+a< zJt0EaMy+GCny9w55^X&QDY3nbW}Hs>7M|W_eldM$z{j-Khpo1iu%9EQ|6@Si`PxVX z@EgQ|AH-^*<2Ls++Ao8C7py!rTk{C=7-Z^!lMf!0Ep^~Xz#^sC&2Gc*4%q_h*St;U zXHP}F+^l%EWs|@B5g3!y(Ckwsu4uWZK(Q5X7s?P~nMv*SBKGjd#yII4=`lmvTY^7h zua8jOgU^OO_i5-Bc5aLAvHI}g;GRh2f@%;itz3eUCP2<2T6gmdNf*baOZ$Ba*L=!K zLDG}oOctse<_SM!AO3gc4L_NsEh-m10IMwVTkTkK_}g(WSvmyeT^4Y1d16V_svznz zAUfbA*j#OttzEomIcgRKk0KAGY?yPhkB(r!UM;FY;fugWn_|h$b+9SFdPV^eBSs>0 z`xnjok8{GHH`H5sJK<4|a$VC7E=cNbAkV_BVaLh;T$N&?H*O}jo_!qunpe(Jhf1VF z_`?Crc~BpHlfq;GgBF8a=-Uj_B2JMc5txCpb*&}l`Z+CRNY2RGQZ}!V&u94I-h1Dnh?+d zP<%NU+iMcn+Wxa>LG?ql{$IXKY!X^p#o!-KYIPbNP!E%NMSCKF?{EK~v5MP}iNWM& zQN|9MFd*Z)Yk^ti=I29ud$fS5SVaBn_Jz)%dX_&X2UF+kGt|dd) z70?X7ic;KBUpz$K51H*vqJL5;cO}jJwx?biNaR3L=oCkv%Bhj5>t?X;QkjqNQGjNA z?7)`DVIny5n{KfjG2j#f?EuhN5@t%8_gT=8!^o&j~E=l-K^JXULX_jM*Qnmf2HZgc}mR3(noWsq;d}LCNvcc9aKQ zm#=~JIn;N^Rcnf&Eh+;6s$qM*`vSY!Wtbd86IpWWK+x9%%$8xvmgs;HSRa&RBMhD6 z3A^dn8bc`o}}G|6El{V$jh@b zkuh${Iu);wik$Evf8eTn3J&W^+VV5VMYxkUgerzBgwodG#`*1&E}d03&5Fsj7(w#6 zY=oG!_({}wEp|*#@`g<&br=IuHlgnWOLmb zQhxan^_D4!?}DYD#-j9s9b@MhLKrG$@t<{N;y^Nba=<8E(;K24l{~#x#j+154atx8 zC)WrS@!*jcOWlY4tOD1ByHcmp?@6&kb@4VhTFia5hcw~2gqnNyn$=#gKo%KiGQ~Dz zy}%z4=ZC^B^0MJ#300#P$S96nVSn+%YjQy3=^l_?Q`IHxJ04T(IVv9{YCPH({6qH2x ztIBYfd9}hy0Y& z6OF)JjuV1d$xT1rcmF(~-gBQ^(un~C%v>RAIm3O$1Bmj8?I%mS^~^bsOOj~2iG;yy%MCxPz6I(Xv)m+r5QhLM2XBOAf zcEQRVhim$6nJGzhYv1^IZeAYD=;YEgh31u7Cjn-H+~7yhgSLn4o5|z?X1xI4a#}Q| zkq%+T1oSF^lXiRZS>Ww2P5ynd9}mcE05H%@bDibOL?f~%WLO=*TFkR~WSbdl=ni_S zt&^8uc-Vu}ApsHM2CNFDEV7E^3aojSB%dg7(@=lSmy-pR?%giM*-bgsy=z}CsW6+k z<~4D=fM06qZ;Xw7W21GLBB=`HN;S-U`qApe#GZ-CDqO7)}w#j6mqLCS|kV@?Pc)} z<@zVK>MY8)bx#yrT@2<+d}?4MVp zEh4H?h!v~kUe8rEvvpy6{_!1c=}?iFJ{nn)Wm12#I=*8OxViWJ3Q~AbM`R&e`ibqR z8A^+druI)&L_vvhj#rk5X|+h{t-V_2htgX)Vvy&)D2b6~3xYHbkTRO>_ZAlS=bRaH zkwEzRFc)=->>Zxn0{g(-_cf-?q1~sY79K^viQ3H_t$|TANO;|zo-8ivNBBe0#^{T~ zAH098DS$6fAf6Wd-T9bLpPT)%Zem1JizbBw(p}kC9n7M!hPqhro*KnU-lNgFHd0ab z_z5N4(KTcn(vfh>?OZ^M#xM9=s?X@w@;GUMKKfW+ zZ%m;eFa7tg^~cgV>eWCDk{c%+?>@E1omU=z!Ei|^va$wP&>aRSK|Ag;vj>|rSb6*V z9K62G&RR#UBh$w1LFbH=I>n*gJlPI$9TCvSyyE8dkk{Vrce^hh*-EOSJyYiHXgo<2 zq+(wqY))$Vub|`8OwU8yHKJckU&Zd8VP1}vQh3ntfOymMZVXtgP3{p6@Y{1JE(m{ec^AIPRg!+| zpbVO#&DVn`BLd!`5ZXBl5U52G)V(o6|VrvsGtH9?0P9nK^4 zYV8*J=&|5((6rwNf^VN__CRwj#>-!L=dCFWk_DTmKAaM`B-|I_wxhNCyA8nEAzFPq zp+c0w7Bhg79e_4ILb}Dsk4!Xv1Zx&XYTeJX)`^Vy60`4Ynx1rBn`|Yy4&r z9M1564P_g_>cXK1t?MAX%dqVi_GW}1F@=A3(_k!<0Z^4GhHbm(= z%St`2Y%WRjWg%NZ)W;8eo7$ePr9Op*hO_3sy1AgHX}_?v_Q1R!4x!^(_Gs6E^?5ddw{!-~#&_S(ced>0>U?YD-C zvn)UOGk-L>#sp^<*Z`aY;sG+TRj{!Bk2K)XEIg>f5GH~fBy4x}O;ni}NX`dbP4ZOu zZ4JKpN5bMI#sVP!r}%=xU%I!C4N4~wMkomnXb=}CBx=|0oAyXUi<67Yf1Y5P7A$1q z5DSHTphBv~nV;f9e*0nOk~Mo8>iTSKfaw9fc_V7be=`y|>m{B{f8&`kMQGSfWbey0 z^xosBaIk;Q=A8IIiPRgG;3(x})6ofnHgP(s#xU^eY}hRUyETZ!;U<0Fru{`LI1ZE{ znjlU)cDcEHun3F$*FEIRJCUpPIv9?*|~C2KYd!6uY@T3Q5Lwej5SM#6wb%+!{`)z&j4oum) zo_yR&^378l_I*W(HAm*wfhJ!%#1;g67^@tw9|kG1-cWp<2?e>kzQH4s40HVLZ@|6q zaw1{L!WkS#wwqeTPmCw7FGS;T=Qt_#v#I~{PlUpYy2tju<7b12$WiF?1()WqWL)gv*|nJ!sY-g7UL#QFmR^N=p4BzErZFHXyx?SIqH$-AReM>mSM^-> zBdkb#BXGH?`$(8-x09Q-K)9v z`S25lB(S`djayC&L_4WkOak;NDbk|gmRx&hu14}-AKAL+Kh@Ab#Ru)ErU`$+wqr0T zuqqYkHHEpbvVv(vbN$rW7+{iefhBkii!xqwb-7ukZ$ z6Co}Ji6%%vkvF82mOgG|8;8yVB*x<2mGk+dv3);W2>g1$q-Jl>#Nmsbs95?>a^`XO ziz~TI%NyCK*ZQa4DP2!1$KFphB@3C3VD!PSyIRP8mYjw=-|Ma5xQ#CPS%57#3wvoW5Bi^_+8L?b5W5~Q1jNSUs9=~xv z9===|%fZgLI?a^Wn!Z(S)bw_#g#wkBRqz?~`Gvx^=-)9^N+)JSnQ?;z5V@znEyzV< zFPtoaE2{azLXZ)To$e8!!S zL4=Y}Q@sU6HvW?B!7D;Coe_rTw!3sm(j8j}kV+S}?GFSq<*u=)L7SPdjtTt(rECN~ zj4%Kple2*8FlO_*1Apsh>JVp~*BKr|UOyw%q8 zhy`OaPdW_VWbF{d+vP|8>G^4A`A4WxAczv_Suh+d+yfANqLOlL(3>0A^AxJ@j+`6u zLObf5`209V4-}Q!Jz3n7U>Ss^Tjcqi!T>c|#Rk(urm6iGV`DxNT7khPM~^$op}!!q z`fuq9r;Np*J$p0?id=Jz6Zm)oc`Yq%*E(RUWdF!=Jd`+dRRbuHabkLioO7qlbEtbT%O8B*VWD*CSCUgNixyUFaMx7kLu^(8X!r7_rf>7T}gp15ot$_9sC&MDw2<# zG`pGL-NP?VjxB_W)wQ-kE@kYS&>b+%p2r<`r786+QV$Q2F&H%pFAy9=z&bQDljLm> zi3Fk<`+FKm)gXP%1k&<0k|a}&fvFP2#+&yliQOrmEG<;3kZw6%T@c~U>p4R@FyWFG zS)6pKE$Qc%Ki0kHl~-#pPl2sjAt7Hu%S^OHnEJ(M{EH?e99lFCDv_DJmB#3A9`xo( zVLK1Z^YU+5%UVf8C{WA2;H`Nly8Oq6m>-hQono4Eo-N;S%p14v%0&>m$P3(imKw(Q zKR@WU*7nVD{u77;brKBbfzpY5GL~cj2sqc^SyTmb*lGf$yJV&q3oMIXH>5qu+irBj zC&6V7J2>dz$H9DeQkpbS4o;^)9dWiP%M;Px{@GCQvnoU-2c{+(PcQNE`PphNwFh6M z&b(eAie88?Wdluv41;bxKoIDU$F2V!5m{%rhid%x4wpiV#MkZ#^5y^~q&wP=jc)9sU*Mo1L za*_QK+k2^!dlGcf$%t+HRh|hR%ld-p3NFgI4PSW#@_B5nZvJ>{N?dbybyX4vs4d)N zceJJ`s2>w`Xh&CO&tg;q!b;$Gy~-w+OlQnB52|2lgP>Q^gP5}#N72Wu)IR5Gn3J!R z>eF^_*ohCbx+sZ7OW%AeEWyf}Alk zg7&Zt+#F!)7UlkFVA-oU*5sAE_c(=2Ar*#J$25h?ZAB({?%Rw!jTyIt{pI+M<{J4g z>QdCi;oznrwgY;_3*cksfy$(+?akos%79=ld&O&S?XSweMaB}bm%(#ae*#4lHjhUZ zxvb~l`zu_%S|1t~z@VyC*v<-RlyJAA8;XcdF>C0p0-ZOOD$Qm{rd6})d;N(*a61Fm zyS}aT!hdqvIuzZG#ghlMO8fLxgZ%hEdR(eaQ7La-p5l6|&*ThWCIE8|>wGGcC2x+W zHFqLLkO@{d^05k+|0)PCX1~(C)$|FO>D{;R^VkaKOkl{GUzg2qA8m_$gbz>P0r)Zu ziG&XX|GFFY*eXAR{u|rSs_yC2EW}zaNYqiTB(lbKq3g+Q+b@yoA?)1x?ZYKlQ~PTh zO_0?RV1>_{e6pFf)R4{N6mtor113_+Rejzwc!pF>rid%992wmdJp$FzQ7*vHK^JbUg$^u{c3U+ z+zwnnT_LI}i4SoU{fnm-4V2WDk$dCYCB&dSi`Cu2VjB;nXW)DHGhmfd{GB1)XtXxl zvvj&;83+?&@tI#9Y-j_;NyHzDzQlOQW35%fftu*#pg>1MYa2#T#}Fi**q}mJ`?DpL z5g{V^6ur}!r(stcqK?)2+Mp-LFl8`FI>Yd%d(kG6x0=ojyXaE~1e8xm$|n`(K7p~t z)j&qsaCK>Nn-L&pWntSk&^h^Hr$Lno9J%cgGX_cu#V6}k{bd^d_ z^4-G4#U8uu0s?ZDO7(&ng$N1I6TK-yKzCp^)9_gtxeDObl$frGna{=@71A$)j?Jao3AvO7WPh;-&!M~>$9Be z>@u?Kx8^uG?(h^E81CR6i)Q{rA<^CXBLJ!sIS*piseQfY?WALTz}A0I2r_bD-iZj{ z1R9d_d1E;-?FK5RdxbvpK)Y1XS?FaeqUqbC<);H`ULHCpWIqj8L!hp*CoKi|eh*;S zCy|Yo$qAwq^kBh0RB8AIANPxU49Q5a%%RFK{MXDLw76yXGf&cX)5GGedu5_a#ti?1 z2VqAy!2)h+H=X>{igiKxA5pq`fA2)nzyhV)YpzVs?m_IF#e8l&v@^s>eRTY+<=Ulk zgA3qaeaj8E^Yr19_XG~UbL1tWbzj+_NNH>DSm^4&2z-Qb8P#<7)WFrug7E0x4~qPa zul(6^zdPEEbj7eY0*bo8f9itd8wEs>o-1MT$hh0?(@=2f_IxBhh`OWr=DpJ{|}E*gV> z*4eS(tiA1Dnu#_GQ!mzNRd8Jg=1f}u=22Nur~Ix?r5FwFPk8d2^P4f-K95S(RO@j-nU@;QUO9>GiLkp z?XLsV*=o{Y(<73hKROKttSAbqV~WZbliRGA?zCw5OpdLPt)o~AS9@NS{I~kG3bdi{ zTP(1Rfk)YsnHJxeF8rwb=ZfW1vt;a5sG$b&SizR|=C;AtJhfhPOUQATFwqPu`#$x> zD?|sESsb%aagcK`f7p2r`hu|?NO}iC~^81zkUO+_SpMyyb7R- zFVoPQvg~%@^^B{{qMc>nhwa7gg*})W7rIrIgPxR}XbYqZjlxLb$D{CsaC>*Yu{9Jk zVr~V*CwIyL9>khL&uqKnos|ydgI^A#YY_zvrI(_Xsp9qioPlFynj1@)U&n3g=N;g* za0;wQ3da|C9v06LfBao6Dz!j7i}pNX%3(VU_Y{y01LGxj+y@ly{ggUu%DMI#&ppc#T5#LY_qW`q`jOth;G)Y0cGK|KdG4U@0o?LPeUcP5Hu$-UfY`&WTXbnfF zk1B-*pj6H_Y~YvYj?e&ZrZztr@tI1BrFoxkS>u1yocx8@&nyYvCJy#Fr>c4$YhuYT zJz(s}HZcZMCw#^7PO%UfoWKQHa$*1eUQtO`&{`b^jeluJ+qb!|P$7JaUhbwE=mCWy zwi{YZ&{ifQTv{r_R;^*$ zGw~@iXhOf^J6%mj=Oh(zs!{?k)A-m6(~%0M81LM3Qx0O z?#ldzC1AvjpYV(TXbs+7!_Mom`!LZWy@y09TCXD-db zUyQ>=2O>CqbLX?=L&&egGH30>Y!S!YQ|I|{Nq&%&517TXZJ`&ztfkEVRHR6kPw?tL zn189S`sqEmuG05DPkS(L0pCP~^U_9Dz~#{ml29998HFIR zcCO0B61P~!Em$o(=piz$qkUg_@2Z6nW-=;AEI3P5f_QDFt16KgqZh6bMYxI%KRYac zd4DG{RpVWIS0%~3yKx_*^TI{!f9u!t*kssi0FgVnJw-;Lso+)mHWK}8A$k0m_tYt& z=^>OhN%vBcy(WntnKda1MV@01vAKww8VApgW)iqM4)OuLAQ1=9TRno(J4uDIgmMMW zd-PUi0v*l#vl7+d%vO7tPO%jrx-Wl@3ZB!{Eq>ECw!Zc>Oe;eS(osL&I?9bpZh=7o zv$_U*eJuod)PV>kT1r?&aMYf&bR($6V}V&Dfl?F7w7|3aUhj1M^%HelS&34|?8+!A~R3rd@IBLY3 zy0a}y5r;Wszxc?A5$fO)lusCF?iynJT+v4f`EhMyip{A$TLUW|^#u!xsVoC9__Twy z-H<0Gp;qT#+Hd%#0~WvB3~HT}=ivJWi~O~dj3S1wkuuWFsQT%zpKJjO(mh(|fF zWA7-c9HO%||2H0FBC_5mYtG=_f7Ho3V)8zoq>$p0AmXexoo#meQcFZx1ayve|D*_k zBihT<_?fe{VP(JlMTIHH6lS)Y;{OtDaH+_GJrS|!OEmg7%nFLtV>~UVfS#=#96w^dnbfB+ za9z$`-wJ3h1t0YlYWFhOm~ zKbAq;^;H7kiI04gm{E!TZQ9*RpZP`pN`H^c>VCx+H>sRO&>eE?0Wu_*EOO=ZGD=c; zzx{jl`oAQb=gkt`O1i~X-NxE>Z^zc`QK`UVN!A zqQgC;4o^qoSkyx#W0~cT&iQ>D0@Rhg0N2WLRvJ^z(YnE>GB}2W-yE$JBLM~p8^M0N zW#t~v{h#%WU#&VZ+-VLxx$^&`R?QE__kW7+d;b>8sraYzjZ-GdlU~qcr{Mx#4=3C#C#FuY}`1--Y5gDt9|ZlWduGDn1L1HV-!~ zT$uL0@7+*l2`IzBY@xhc4?;U?{=3ico2Q@bwmx0o1~v)YatQMF+JznXEUKWdvq?T% zvQry7_nathJu`f<*Lm?|pn`?qI2eK@%;4VaG=|w+P54}Z~r~& z!MR{X*#0^{DEWI_18qF^;&U58`C6WD$nsm;h5g=T)cj{@8;_2x-F+6kO;#Y30j}Yq z+BnlO8f)`1$+b9n1${?dbx8MF)!t1O>$!4VGTsjUsVEoogCk;wX=5DK-WxKTG1n-v zz|j#Ie+>vU1&_)CJrUzQuI}XN`|%go<4};3 z_xK1h?fU7PPs|jdxcPm&HMX`_KHmmHj_Nm+wfcLiYG2)_Mvm*Z-kLXKIvAySZGlJb(I+>tciAWumAkg(?nA$naR@iefR!ye%(f;kawI2$T}5XB=4bqbZM*R{P3WV)+>n{F2TVWLq}*H1+!(ZH8D7kB>r z>-1GSBIteZZk%d>BbH29uaLW$Y4K^N6|3%j1iCjYKmdord#E`aD%f$9zQvQ;Wq5|x zUFPYp`^9GW){AYxF&^N?cUzzJy~i9f)7hcKG?FD05}Z#gDVAXe|;v&SA6CJyTQpY7kLS1kVh zJr{RsT(J5;QLFHTQfA<2;8xVMK_6UT&N2Kv=)gGRBH6Wfe$4u`0qtAqOidNY$X4sX zoaHw_QXSqO@FBO*ExEtDD_E_9{>61LUWQBLH)sf7c2KYRmrV_9N|jrSlc0Mc|Ugo3P}Vm&n>s} zKp=u9myH$KiUod|x+4oVR^Tn4%eO+nC8Oy9st|6VhN;TBwWk`?^94buEWN6v>toN@7nbKR31uKERLV(KaJ+JosHq+ zmiTh;K?>0(GhgQg2h>v&+@9>usc}p^e9}d#laXp=GQ*kDsC3L3fFVNajr_60(OIb| zRP66*87l`bgntnGNyZY$ zqS?R53I94q`(E}+C#f*=&GOjyULZA0&!{lYJZ3OR43mxCOfhn8bqFReg}Qg3Fv1@4h=i@ZrJ1+ ziU9HwTik;vUiLUIa5Ry!@}rJ5yb&-d1+QTe)d()KCueFW9e^np5y6pe#l|3$XLFIu z3Vi-)Uh7Dte_yvqNM4Xtz0fBkZ=#+S4TZ;csT{_PC|iGIpIxJaXqmYyyIlupsMg~g z4%To6&`^7;JltRWqU+uJqtyL?xX&L29XE)8IV7iOKvDyK{ftaqwx{b>y8FCoEleO# zf#aqewHtuLrPsRe-21!BseTM8X_H_T=7;q z6U*y&ABQptZ2rc1v>&kbOG)q#fBiw2V6qin3Jli(K0w@7F}0leHCCyfZOCGpKPE2d z#A3~C=kICxU;e>b*)Pz=B z-17b#fg@!Z8>A2aPlTfFgx2afi0KcVRpySzwij$p>hzd{9~NMI0_943e-inp|JZKs zX_-i`+Ua5j-C5oA1||E24ZJ?`ZTB06@nU<8L~()B>VdM(O-w>(<8{<*QQZ` z0%0Wdq0_7UZ*7~YYsq`>8FL{mA@uC(8UA?khP5Y3S0Lad`V;+NfA<>{oeBf?@e_af zWo)R`p;&*YsuCu6Cok}Q^;Zg6x03e#`zcl-Gt0&(IO9CXXK&nu5Jto zxB9a~`EHiwBG;G&*)Ri;2q5(8Ve&NqvFe-1pMe__u1s}k+B>0qT`@bniNelv#VIe~ zjK`?8>+wlH4{fQJFJ1whX+NVwhlTTWsqVgIWsokErNzw?7}XZo(Pvg7YNaubD@zk$ zI=%6i9io;USA_q@!xw<#WSFq_5AYSs`J|T&!Y{$vtOwL!3tpG11-@lU;KG7ln=gV1 z)EgfLcD;Aa&1NJZf-tdeqh<vNCyG%0&8l9?A5=a<#x+CkBi)g~X-Tt5B(v%d*Mp&wn{t0cYkv3}` zIvRn!ITx4xj>A^Ebl4x}wQROV_H!du?M!iHUXW^yxxX}KHl0qA<l0SCRVLNEdMo9L4FYRxUXq<589sWzJ!z0_=)!Q2 zI_Gz6{WqyyyYByn9becK{pZ^-6&L`x`~6 zvOJ#9Lg*`Jw%W*{u2hTiV{O-k2`)s{* zdhNU}>Txf2z(`w-#8zi6pnpS5K*=8KHi8fTg1|;KN}sCfdD3z#b=^3D#U!TzJeOeF zCWBIL7Hax+wzoqpIFQRE05h1-6?Lq_J;5rF=Pa0Ea*97Q&K79y*ce&AT}wXU}Dqwie+m2otk-$>`tgk|G&=x`vLvY=mUOIGiBwSg?Q2V!j zuSf;vV2~v4_pm@vQ@u!H|LsShgDHxLEj+il(j)(~%%oZdt_ONY6P4G*heJvL1$o8< zz=1=AAe@ePgzN>*nxQ4x7#PELKpg$(+DW4@rob2#&5*4EdCjw>Qr9GH*<~PsTe`>!q}DNn z3sV#2oD$@kI@O8P^jH)E68# z>($eJ7L@D56-htPiu#9ji)PUPZKr+)$T}2{WyO(Xn}-~X8cPq*DxC+u&ftSUzz~No zNsHDoacRX2VbQ{?8779Ru~J|p;Vmj~lI<^gD5M>#ZP$|EYnXt;L}2JT+$TyWJte&F z%ayt^SYQ3dsqMPlk~#XvFw_KUSSTH3lzvR-0)-j9XH5f;{&h4}^Qz*D`|C#UJJn*FrR7vku0RKDU<67#)GQuh2vPG>nL0?wWu z>VdGULx@5nNnnPpwfI(r2=VL#nQ39}_rFDM35$nXrQO_%?EJ;=%yCVM`Sk-9fMtBA z14vjj3VGp|NP%Mxt-=9)F`%a^J7)wN+L8I5ivc7^ptNb?|PM&mpO z0-N>tyvl*cj9m`xM3L76%ttK_))b4|U8TqU?j6>wUziTU`8KoVp0bP0vZ2zTe9Wl( z<^MXm@^~n}@BhqTtR)lrX3}{mWGLb`|f{QaM@RGYg)(& z;UGc7Q-G=Po?ZJ4NUN8sd5TGCZZSu^fsoqTP-s8jl^pF_v*Trz3^7r zUAuclK~v~3Ikyb)e3OLNOo{)J-M{hHm2wU3EAf_9T#*{MWcia*xhz*g@{_DZYqUPu z8{C}fN&xllhWSTHCLv3jgxWBk;s{?<-a&_cf2^Keo0k0j_f?GX zygS2XZBHQ=p&kCr$31ZO%jm2`xv^ z{#rSCaJbRtfZgCrtFI3eMcpt?Ht|pMET!?k)ETGUriV5imQXIX7|s&qk_vS+)~~Qw zO?XyZoXbutbx%`9Ig7-ni1n|_j!xi{7cy(OJ2`d-xzh07^-SGeM3m0~yI0u1TR?tw z-sx)ODXHSogTtxt=Q0~6<#kUa66VRx!Isy4rF?gmLAR=hH{onM$Z)M0X8&1M|3}*4 zq)Z3KTqE(y0-jI5IdWmq(t$a>ORnQB68EkYio4bW9hp7HZ>E6XQN!1ydv{|FgxRPz zX{<%`F|@Ph74=Uf(#MUg)n5=rG$YyEx0rET*C~rCgx>1=R(xFj3UNiEl(PfK#|aj# z_X23mqCba9n&G4~wEWWqj@)<0GCwU+D+koJeBO73W<>Wu6=~DMMxQWu&E*sIuIT}x zdy&Q&!M+rOFX(hN8=nrJA&kHjNvWBX2}2Iw@?^{A*$%+cp4Elwxr2#OKglM&RS+#h!#5?k7i5xasOE&W_ zd2SBQwN`AJ4qs!0FcEwv>|7ru0fz-dy;5b83Z*nq&<1u<-_B34&y)PJuf$_-7pGm~+4ug-s_PVHu(2C^6hQMa(@ z_wB4|I<2J&?lp7jLoCzo`%-LwHTEzJBEwZvw`!7v2az9tmWJ=Wn>);YMMzJ-Vpjak zI$4hCY5>z!AAyfu)bZVDKZxan^*=T)vUV5n|?S=de&d!a$JSby!kc%B+MMRyIR zWrI6i5my!Lqt^v*lFvcDx{o~)I1oHdq{=6xwE$9x#fGoTq&06~=WpN7q3mtUCvD*l zlYD+-121~aPGwkc`^?)X0UBn-9*{hdsoKiZJn6rJ1m5J=rjfY2H%y&i*V)^{o z*h`s?t`5V~$5~YQ&lorg8i2<;a3OTzxcKtVD{7oJuoU#dB;)B`>wX*f9?u1}!ZQ0h zz`RbVpV#&{=7bB!n@_xcErvE@FM`i>JG`)xJ;C3^(0R13xU8u!6zl#URFR>1Y!F}P zc4iA>DSt@ul-Js;$)%d`3`}~#+0|`5BibWVA9W8dU$m#StPz%wUIk_NXOXjTnlfR2l9Z8 z=hRNVl`-xKBW^mB=j(Y(ztDqY`c~THo!By5zu4ILcvItPAyvK%gorV~^}(s39=jI2 z3km}2Em2A)uXn9917f9u0xoTG0(MOjkG(X^s!)(T_seRw!~^YhU6s9a|G?jb2x$v9 zyy7?ZG?>7~+)!`aOZ*Y{$J|>+GMbmb^=AU__}==UBNEc-2bw^us^S?;)j8>pa!R@5 zbPnw5%+58fBP(qeh$4Eb;mu$Q_6aS!N?`)4m^^v`r`vZ9p-dLb(9jtmo7K)0s(XU7@_>BdZ7bHB=WAO%TM_6v+U$#IMVB`_goeQNM7aLQa)1SFz3T%Ax4nG0nuiSU7*qTBf}ntL=&`fYQ2mWMx6Q4C3JdSzxo)$82=w-D zps@K=c0c5ADpj851(NHB-2}Uiq;aU@LT!iY#jSzmE?wPiMnsX{o9bCy&SO4DuY98Q znzcjv!E>GH+Vdqg4KG$3DvxK|f7rR~40^}|aLRJx*U6%by3i&5VF%MYJ;Ugq+t*aG zR<#YT4{_#@ZuuPuMURH^XsGaDu8WGLhuw13zZZ-1)3B83k3>Y_lhS&d^!Io`=)q^d zJpvaTw{|WwgJQj=xK)};_B;R`5H^|Ju&oCO+5Ua~rHN-Usc#1HlcUG2RC#64_~4bn z)Q)6(;tBuGttFS&7PK@PhZ^(q%H!-gwUu&7vR{XD@eix2r$807!PYgw4$G$KeQC^O z`MVdgZ(~Xy3Da6TBW)e!6HxipTTUMp#_804o>v}SkBu8$JU|^5M-Z}- zSCAU+Hywgch|MsNjz{$XR|@D^)A@HYq0t1;7)Gyh;i9r^U{wzt81)=RA~BhV+;lt` zv4+j3`R@$oA&9wuRHmSyBbCRIM_pmkgxI z^-mz1WN$$A$?a})yJo39jCbwO{$ zy1c3Oxl!^2eA)*@tg9;K1>PB%xajt`FaI{Du5w{QIS&&e<@*o`^?r7K3W%m7gbqiT z#*7iNb=cxS_D2xxel5DK&yD@``2#}_KzJmR;kfPqSL?6`6p9Pt@r7td)Q%6%kAQT2 zrU~m~<`DT|x|sIR_vB(hhS1f*q;GBz5dg6`^p(lY;Sd^G`fp>hf%U~F%k`Gj&Nh0D z&-0pli|*P3t7^)lw_V{B2n%@1iFF^>+$fC_p?pK+hl(Pf)w6Fok3T!=q{_e01)JU} znwA)ALssA8p$G%J7ArDdaa90PT_sB@#l!4@<3!}c0JHVYjzO!B>2S>K@agyOH=Y=- z@gTtJ{c>79&wSD|T-YGFVixSZu@{(}&V)XF8IW^qPqbJm{@V>j{Pa8gI$2-rxsge8 z#DfVLj(B?0H`G@INjLnmE@!nNIZ{<{SLa=bQ&c8Z>&2Wsfd1z4=6z7U@qwH?^tt%D zpWu%X1V5cwO3{xuys~0PBRQIm|5oEauy%9BrjQ|p72q!4<>DNq`yQqJKajmW1Z&cj z+X3&yC#~=^>2Ij~_8-1la%|2I?uj&g;DQ zOG5e=%Jl^o^u6QZ7^#e8-#67AF8ZBtR25Y{!BW4pS{I>PL5uCkQg~@^U&N=SxnEXL zG++BTpHCi8mT4ZpJq{FS8>W@%O~oW#lbOY5mmKoP_w1O##N`{yXD{j zVmYH|UFxTm?+W%<1oFC(91x4Z(@VmVW30EIoj1tGG>D38h?rPZRP(~2? zG(if~`$Af!@@HH71418Fg;LNp_CO^{5Bu+1A4#gJ!=jb(Kh zIv+A(V>fZ!-=sN9sSdBA)B`uj5h2g*SA^cSJHx7#Jz4&RY09I=&mrx{Ff@@xP^}m1 zKY@i=8b1yh3;y{hx1}XBk7%Hr4eGb5a_MacyXhTq#@l}B%hK5w856Dfk;hsz&I=wT zfKW)#P}68?Z2}!0%y-KHA$SgQ#Pln;8;}r&kyTg}T)CDuNapE7aW|!ZfsrU>mJrSX z)W(VSS`Rd@Ui2T2@*I^bG#PG7E@xx{avBv_nzrlI8YF-@B;# zVnpZNG34;m6sO<3H_^NiW>EBCb0o8NCTy>j>TK{k7LHl9H5fTK&S!cgB+s)d33aH6 zNd?r)OA9aQl0es={gr1f|28z<|9msIV}PVZ^J1XOiEr;X$uT82Xux69%fPf z4HCc&0v+378$K&&_9|65=nC#Kbjcma6&dt8hX#M6;jny z{9;GKN{XwJ#IcQ2jCdI)O`-nC`S!x3gPn6avuD(i-Py0kK^wM2C^>hTJ!5`gc%`b%Q-1ncZdSFFFO)rd?s@ztec)Xl3 zR?BcUZ=ftC4;Vyj^;x(psCS~Uyp<08N=zDg#h4HwoO7xy?`nvGG;g{z#)qGti5XbBEqIr|-K1Lq_mxno*Th8dxdk$c43v%lL@G~*AG^o9fiv2%n@Dp$V literal 0 HcmV?d00001 diff --git a/static/img/logo-social.png b/static/img/logo-social.png new file mode 100755 index 0000000000000000000000000000000000000000..a97caba9bf40771ae4063a60e53c835fa01364cc GIT binary patch literal 1402462 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�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 z

    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

    C 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�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

    |Bx6_Pyg4og&r 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

    ;CqT~Vduc`<8BnW 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

    ;J| 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

    rv_(N%kk=}B+9ji`- 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

    i?>H4*G2`S6>m*IZSYgI*f3?f%RXRYR1CevT>> zZLXJoKzyk{BE^y=%aTuC)(N}=ty^ewKrmVvZD{c*iw?>s6|!lz#1>xm7xU4XkPcra z4SW?Nnh3>kHRXYl{-JC5GjcIKZu~+PgC+sCDm6Urv}Ce%k&oWkdE!n`t1JCl85!Ov zdhmS%qnYYE#2Gv-lJ-jX?nv;s8~8meu`tJWIz zxM7|tO1QMQeS9T#c0*90?r)fMVKUe7Q8l%au^p@ipPMb!l2Tb{3~K1=8V$8zbQ~r0@L8=3tp6E%b$PjEywXju zrk9`-zt8Jt)bppCi>uH3SKM_aj^3 zzCz7$MEny5U;V3W?T6h+!^bcGVE$`m{=paV{$)(!`@k1f=Brulyb8LdwYEMc*?Adw zsDIpk`(!?y$vvdscIx(%K#@GvLBNGq;o19AiX#Zab0)-J^~cwI>UN-R4dxC*#m;)252d~cV{Vll58 zu$n&^IA8H^2U^ceSFY)b^+((u56@3LTbut7AYL3=nNvK@`-o(E z^3p@I$XJ)%BxWD9tQ^9pQl0S}=Jqf1=Q=p@u+E1un_2(X zddQ~Gwt#`Qs$f0St+{JNufl{wtC72mC^HX@%q&49@qS2%SZ7fc9w<7;t%eJ9>&BEL zV&_R8=`~dc&PUJ;&g-MER5Y1idJokNBZ$kk5i@PD7`Bk@NsBsF=oG1{js!Eza?|uD zM*?GtfrcCV#^9-1wFE2F$^t>`F=FVVMTRRgl}W9WKzt@k^`Z(f;x3kMw=6;8XChkY zr7BF6WfP~ZYDnpHcG{@k@DU_PHuI?xN;2(vA+#s*If_`3h$6+#fd}xiKc*tU!S5@z zu|dLGDmhoyP&0vn%x1zt-z{`$D&YBWF(x-9G)&R$rv(+6)7TSm|KO#jS19hAfQ{hu zvWTydsYr>=?*$E?qv1&`A(k-0MPibzU<)ZzB^0*U(~=FhlA8fzIF}|xHENx7XaZJS zz+0__ti6;hy_;d5t)k$`oR%cjRtzJtI5rP@?*Y~QFW`$$b_MK-6aBa<`@`p9BwD(x z2US_vp;r*S=V&y#-x8P({`|0GlCty;)_;O@Lc~v-AaAOwOp9!De!>Rk<^yt1@&t@dD>DshR1f!QsV=ITWzASu!j0US4T<8| zv4u8-LK?CqB&NYDZF}d!(|br-HV>jqg~qtv7oDV;A$T(uqKa9| zA|gyw1>bja;a$V(5ICeBc~xyAW5Z>w94OThgStv&ij$G%WNG;y1TeyC80!)dC1(-I zdgd;(JC9KJrRItdsdbumR#n@*n!~0c**J|u7O%eY>N563{#Y6eS1jDGbji^k&LA3m zod?(b!}nQ&yUXwEPBdH7JGY||mHQbO_I&<<7@W_VIs5}7xjJ+V0O*q~-_{eXcO+hd z1MfKdyVXgo@SD!~2anC6RaH8oKS%XiZE;(p<{mjcHvW^sEVs)7Q-v4`&PPY=m&xIo z1~Ibnnnk}xS~gFP^b+k`XWuQ4C?W8#5p!>t562d`WP76dxgx(Ia$ZTrl~Cwpr|}b7 zxfWqb=<Z&T(MK?)KMEZrd`26ITefVUaK}zv333OXZ$u!gw*XRC9wF+3@vE(W*{~ zE;r#qV6=)35Agk|E%hkijd#XUV_iTABM~>{F)L#CUNQ8I9x{nLH14dDrDgS4~ z9t<-GSxZV3yaGlO8zQ+%RVH45-Hp}Kf;d0-hJ_nV^k1@6WxI-WTcr=0USE>=2MINM zBq3Tbc`z19J3;?sk8y5?MruOyT`Sw&rC^Msq8xz8plKr33-F53 zB&Y(~`JYEZctJI}3sp;(RYI&4vI}H!1DFL7v$zEydvYio5hGl#(Hz_&&Mj$q%$+dd zBfU@hvtk#^dSa*S^Bje9x>}GeQx7A|d8ycJC~*+7nXVa_aarr{&DV%V_7qa$_a!b?;=c&>6;n?fbH$YF8)1#e$ZspNhH zE;gwRQgLI!pL=$Z%M%fWG{)fYzc6c5Y;ZCYY8dJoSA>_1?SUDPUggY{d_$oQl|upZ zlCGsE+UY!ISfy*dNF~Hapzq%kemQeurAXRplx>{f{w(Cni;|T_W%Gij5)$T0iye8m z1S3~TmWqvz7)7_ozVMd#LaCM46)fTe2T-*bN+2UGlkv*b&%1xKJVwO@qGzgsBvFNb z2yE9Kv2NMG3+Y(ELig0@T94KZCB_(vQo*sLCa~6g)g$0uDiET<=BP=uByE^QBgG%I zw~|88Nu(K~>)Cf}Yfc#iH@(>@=$sBazmc zx6S_rkmYlETK($b?KXF;^WJ|hdQhrwgQC#?e-W@5haIg`gwbc*xK{`|N@+bOMSKl*f6j{IlU5H_IdALr zIqrV;%42~|0E3kQW>FE32PZ=J=m)8Oc*tqYVQ)9T^25LRy%;PzzFx`C<_XODzvq6A zrH+2K!O~4IvBMwzXM#n&6oDX1m5C~$?up;bc2+!$g$UUPshTQ;iNgB=XWhE=<1P_z1$$Cgz9piEA5S~L8$V0pMM zi*z^=&>nJ^W<;v`CVYt4yON+&HXcA6!``wx(VNWZrG~}XY!R&() zta?JqrB6PB>^D*i;9-T;tYX@EiDyBG9#m?BJBK=nqmd;YXF*F7E!E!a5 z&Fp8$rKDAyu5~Ri+S?5g?5TkT==0*_qDy=IfNoq>221!9;Ro0W(v$y8%u8Dr$R8$1 zkVjza@U<%PtQ#yr>L>_b#hfs$ITB{dSgg=040Y`UIP21JX+yW*-ntA);)=AgtcEd_ zJJP0cq7Iz}dd%dyVPw{)+C60%*Gw8Q;}Acx0*$Ct=+*~G17=A z(yRn!)1TkgzyE@A6Z3yG$jIL^zb%b9r_XL3Ek*V>k&c1c>h_)(IYctI>9_WbrJ{6^ zp9slT(BB*2&s$|M7`@l2C&_(x$m#OQ;r!;!ZZNIUUe7%+;_nT`IrBYIpldMnlxWY@ zJI2L1_3v|c*zE#ToB=|Px8B~rY+9l&VqLtQf#3Idd3v54$MET|8p-mW`mLXA8f^fE z_^y!VxR2aH0^d6Tr@m8;<0_`FV`%VsPX?H+rBr=QN1IEK<5a>H(aeD9;=<_I%8653 zHvWTC_P+!p0u6%Lz^6Sn{HAao4x`Mc%uytcS5X0*Or0@XC53Ww4dzNL7^7tCUQ%j> zoPZ}CO)Tz9#OQ0v4LEMzHuFHW)QVviEgr=%63U#rhw-`51ysOe5;wbv`*BYl+eBSM zXQ4`_mB4@@b8cZZRB?KQHEghiYy3nUANHzobE@Ie+2>#Xzti#5tj4Z`sED2VNvRUb zlM^duiPI6)bS&0BCYf@qJr{UMhOU9~-ymh0$AHC&K7s~TS-oU84uyK-n?&xJEskc- z{J^wUBWJZk6?0_`#CyTrZzP`KmtJ869hIc}pJq4H#uSqmF0;G-a^5$%GZ`-CNSR{O zQ_%32Wzoh7if&3{9BYOlKP(j((>?}T>o@Hdf24Gp8U1#4cos3xv(*w_Yl3tpo8;5% zt?2Sa;>aij84_bNQx`K8L@%9?J{pS99o4WyZ+*|y!!f0ElhK@v^=&{~@i*V^Ogud^ zm(KA?B2TiWSVC57*x4u(PyE{_@E@f%vNN&mBVez%TLhT2_nYhM+yx!%q_u^*HTzL< zS2cT<8{E1~ zPH#NgUv&3cbxoUTw6;FtK}MFO12vtTT@BYqyByDVt=_+{diJl3n_E3kbf*g2VqCk9 zk6Y~5G@R@0f7$9^%Jc62aMba+2d>{{uh&3pw+eN23?>fR<#|&&dOZf5y6vp8rUdCvE0PkaqcrMubnELt3vJTPW?2X)iuQxDyq!Wu{_*i;9&S5rs~8 zW6u;E1XN+6ll6~mH7=xS-710wk!aI4W1P&QGC6Zu$cx(84 zK5IwO@$CH5@SE{B#63j8vjm<^M~VspkC-&CBrS?G#1|M~OVw>bO)lz`I z<&bc(3tW-VoJ{|c%`Z1mCK_}+XWcdxOBYG&QD8Dk3lC|oE9TCElyG@~N{}hBb{u9#4(FARuocPU zu$vP_Yk@95EVj=7WdX*LSIHv~UOI$uI;1ztw=T&xFuY@1wQ>>~Trrw3ACmOd?;$1e z3>lS@Ro!WX1wG|t6U{BTKi7(7sj6*>*53p7uC;AIL(cHX2&G1y53llzF+&Ybd-1=_ z;HdQfx~gw5OE5X(ko;h#K1Ph!5b8gpf4xM1s)dx?gqZptp!^E};f2XaV@6H>fe^ia zC^E$b&ZKOnzoN&W70tvVNX1MS+{5$mds&n@0?!xB?`uzl z1S0q#G4cXpUp7{IM~0(ult>8#{BltIUj{iL>u#>DZb65zw_Ot1i?2E5Vayo;-L`+p_gxmfA)OGt|TzU+~%Rw$vK6DxhYRc zyZDmMns0a&z81hE5VRbWh&d$gXf``?K|^9Sp;Q337t~N?2tb_PgL4mw4g{A&EuW0KHK`pUX5!bDnJLL`|s&_T_g93BU0IBy(XHxVifho6_GDS&w*x}8d5T(Q5 zgu>>HT8K)5)6Efa0WAX!bM1)()uItWix3L{0Fr$q_Pr(-6XLR1v5(! zT|&4xx4#&c=)?u6M-=5D3K=XJnHE=o{+&j)un)zMU0V!ZB{4~29WaD$5_r{Lk~R}t zF%@J=+O}EDxB`>|?euW_r?_>y0zB=-bs;6t*v8#ooQ%)NCa#!SRg$#(gaSFB3acxV z%Qk-lhglghDnn-+5^0Pgcpp@z6-7Co$WFT;*6KAu)lpHWn(FmM04L%7*oInND?Fzb znY}?lo@}ODr1L9X^f*Z`VIyzn*yVg$kIA#)tbg!{V?OOEX7=0a8XYuO`xNVJZPU8m zi49d=X+D%Y18!Xv)sNwX_7-oPoANEF(>6q2iI_*&L_(Y|S zIG#N2In@eIW>1(u)v3634Nhk|P9`GhIgYvR*JFxB2Ky)Ua(o9C)Oc%9-c&gSM%7qP z&MXHyNF3djl+_b;!l6#1+2!LoG*icF)MUk+l-rn=Gt5g1BEnl=&)KW#zBt-7zSo=cb`o=;wyvY3L(r_M+1gSLnJ$9`~Xo4>8Qa>_sf} zo2;o*DUFgBYK54^R(=we1-5V$a@9?Z_lg)e@kN$B6hqBRid-f!Ad(8(@jZa z&;5GE|8?7liDcRTlUP2YM|cXpRzbB@;yG$&*0F2?Kd6nO0*!$hzO)kOO;#LD?SbGm zNSp1j0vEMp%|c1cxEd}z(s&RgF`HH%(Sb{(p+&5OcFJhYDZ+O~n^fB+PMMrcjyJhT9 z$2{Ix?O@)>K0377&H=ww_>?eO=k!3_=*vl97w5#He{4wW__FfN=xXS5_^+zdZx#0V zEu-_i&frbYu-b9LDRpz*olV1!lj@w_cj>%#Pf_;j#z%(zyPT7>tU-xSeDh_pZqGyX zS^geFf2Y2k@u2dbZR-!Gkr(c91O$8hTyAJCg(vfi4#b&o3U=c5rvxx>@hlZO9j59X zo@|H0{!!DpBDNvs%1SLz;lnx0#o;NB%*MNY=V8Y6A~vyVSneE5_*acZF2xc$+_o4M z!-d66`j4oBQh_M&tF+w+Lo5drXhr=~{3~j>yQHCWDTE?GU=8Uywi!A#x2hyvjF}zL zU0}P%7_hOLR(vDT^xG^XJGttAZ~#JlXv(F+QWmv;MUTQ5IA<+MM%O$fMg=RAVd)JL z%0ZDb8O7sI+No@v(d1;3mxAe%>uAhCsWbUMM9PIOKm{6CqqI6&N%uY~g?URFvL7}; zxF6%pK-*rzVIZTVIkFOlO)L#597!bQVKdguvg^E2H{JPR6t3XXe^M4sB1ltqdFJaJ z3Wi<;BjiiEu-G*yh$G50cNx`KfYBy*-cdS){9B0riqdhJi$|4ZVlx zsEFs5IN)m+Fn^@ni!v{{ z#()W9I}~ZPT}RG=YYXQoBd>GRMUgNbh?@izh|eL@D4gr{=0hUcL1xq67C|Zniesun zccTE$;Y1QUOiJg5(VY@r=^pUU(WF!0HEX$L_pqZj0&ayJ;V`f&po=kCVD;I0Zn^8) zx8`0;m=OMy&f)wOfM;Epf@@dYP0`PxPZv_LsO4 zs8Xnuva1k_JiizwQTaTcM~LS1m6eq*S|2wbU-ypkOHt9%v!Q`+w#=iQMp}}Y(|?%= zPXjM|Nm|cEpuwhtZujG6bLWWzl)UZ#COP(|U;g<%{5kc_=Ky7H^6l>=h^WH{sx2|T zy@D(RpfnID!;2dhSXHIJ@?d?=mMYXoFgW}QCS3h@WK=3}w zoxd|4`tdS5{+}N;H8mjcP&}&1`)3aBan9GK>2N>%+sXEgALmznsr{z+jmz_n90cA0 zZFz8f>->NJ^os_O27l2>>^!>w!U93>v^ZtXO62!ql;gtbYBO!l+WRuhNJ^T+T8LxDffgG`9; z#|Hnty*vDR4xgHcSb$I>P($xr9%94oY!EJmk-d@hl~b}eR>z#znyL(3UYRQw)TwJM z11yZd%kv2-tUV+e`J_0pir~Z*DZexooM~iiQa4s;F2jVZC{?0a7h5Q6)9mis8cT*1 z-khsSC4-w7kjjx0Isr-T)#wRl$-HiHA=Gr3+Oci;MRI{b!s&VTl3Ykh6MVp^ph{Zl z#eft@2oY&WHI|z`WMNvvQ>flCLaH^II2{J0e#dF-eu(86a z{GAHKStU^E`=}8ME!Z1COd4U-ETOS2_d?i2L(HnlIM2m!U6$a2E-2h^Yjo8kXA(9& z1a)uMOuf%uIn8QG2+R+b{sKPIEOn#`)VYl!<$mH!rSIgp7XdVo^qJJ`lIGG%*)idd zG;cp!EdH?T<799VFBC_#SYm=%5m(aD!38dzcYDZ1ZXg`rb;QChtdO5NQr{$>-)&^K zkkZ6Lb!LvLf~khy!?g@P{B4Z^JQO%mmP6&>@MH!O9iGpNB(g^F1aD&z@(Ih@O@S$;2xKHOjv7L%k0$}9uC zPPj_X!y=Z0lJdR>uB5dQ_ECl{9as-`2g!4fpr5(MQj=;M`ctOBS+f@rAiD7I6wg@| z@Y&+36OO~yyZOtS{m^l-puom7?wKOlRNa@Wb z7ivnw?4i4)Fd98YnN0+U zoUey+EZj!vt{cB^8urq5+aF@L5#is*22*iwKNAr4Bn{K!{5XDBJJSjE;u`PNH`4Ks z*5MgmCfhBd;oxp-oOL%C1;2U=J$jx0GHF~DBw^v}LCOSMw+yu3+tnv~d zW(c-Lx{b~Bo0?D8f0>P3Tt`^Q>jod-nwzDoTwSGJBRcdFUQYwgqJ(&f?1D*=9fLi`wOX0J? zq)0he4n@sB%uI1;0wUjZ4by$-GFHrzhMMhE-4m?r=h}7YCG9Q zJgl%dBRn)Dd1|T2Y@J(apyv+dd>b_hhZCs>M&Z5bz^^XL##ugv!!ds!PVka-#pGCc zb8~MgT{Gxcb&+4UAt1VB+0-rG{@y<>b|h$E^fm-%{)%qVhLf}Vjf<-@j2C--!w10o z3ue_f`2ZG_5dBuI!EnHF!sl@(*YMkks&^vtlf~S^SGdOm!P+JNcq*&pPNibDIu};WY56n;`gKYxbkB$$2J~yJ4GXoABTgs%0Bhr zh+)xa=4cFhx7#f^cpPn~=6S7?*Ln00L3lA%=LMa|x5~^%)~V!du1u93zEV(WzOb%I zFXe1K=;{f!9r;iqrVC@s#S0N&<&9A>Eqy2Yu0CkaJVkLiqvFq!~rDQ$^5Xb}s2K>8NRH>ryrIffNBCc8>Mi^g4fPP`@(ManV2_3DK z+K|eT*v|meJ9A|?QNHhtTI(OA!kbhvXajSgfGb9rq1QW_hUJAY9L(1 z${A1+mB5n6_nLWod&OS7*vLan2t-u8C9$W9Q=c~FmK(jDy#L$xfptQeny0J$az ztY+paW<(4c6N2VvY($|>(5{#uFY%+O36s9XRRspLg`{uT#BbsjZAB?GTfuW=S^G^D zHcM#H)E`)XL@~jt??k!BIat+Qa_XNA5i4g@1hAmZr6q}i&=3Q^Lq8-`3@5n$BUD<% zhoWD1JK_(%p5y97)>R{}n(P{__+zZZRxz`XAxIBTC9Gj1Ee1V68;pq1Qa2~_U1zQ! z|EKMEz%UuJ3v9~_sVV_xn`%bMA8VXtHN3GpXK$n4M3T+p6ed(99#Wpoe%^VmS|R8b z=7{;ZU@6v?c|@Mm@n#6=d5n3w-Db5S%zk_pUfIV8#&pRx|?H8Gf3F&5=mmy=WXLzj%JXtC+Lv>(s6H z{X1b+XKUwlFUR@O2eUmJO);VgDqBgel7)VP|HER80k66VPJb-2t-*Pp_WAWyV!Ad6 zwQ?z51g&7EL8;yPxuxmHwn2lxsRo{bjt|E6v7p7xeWikLRJ{ND;rp9{U()A?z(0xq zrITYFe1gYK2O=@3ddq2#&gP3jl7%k`wa@B}!DE%iZ6S*9S=e7tW)Cs9*TX=M7|wJ_#H|7`1oxw z3rYuT@4Sp~-pzRQCWBs6gb$S9+44Ni1!0Fmudc4>xWfCsqR=2E_Gh)Iu)xQ;!u@6Q z?Em&RgI{|gQc_uvCH=Ygd0X+%f;LD~Pet+(m zZT$H&eSc|pe?XfKJ4T%B8nmQJ_aXR71pPfq-lhLuc`9_Z`zyh$#ZxHd&+tLW47cA| zxL?E<+eg*x5#pC0Xd?W4sQer<@VlPPOwSV5sPU5QB6KGssX78kXwqB5-$+{b)uyKK zhRf0#*)>h6gv&5YzVw>Z~2uHhPtdtZ|m&rzn9GE7n)2KonN~;WkE5Xx3$r6gG zF%KkFh1^DQF=YNm3te$tY3j6Zc#Aw@Yh|uUVSQ4O%ET-cecfTndP=d9EmsZG!jES~ zW{&$iKwK%7ZXzsTs45&ioYqIW5Kk8jCKUxgEQtb%BT0&BM(hqyN@U{*DU=x9lFv9x z7>uAtF!z;V&oUlbES}>yh74qrw5ZG-K2I}J3Sfu4U0tuPov@V}{0}BgvFg%K_^@>Z zRf?Px@Eghs{Q#4hT(zTHR}r#&j^rj?*i4eB<%0QWfq*`%3a`(zhy~L;uq5E(ZZ`&D zuCy>YK(4?na0uM?Nvf4A1|T_40v9tWNteovyJmb|!vS9tekL_RBG(5g=NJi+SzK2@ zi&XPQRX84@<1fRuhg`Gc=ITJFJGxN7sm1}BAAo8H!w08^EtG%3=AE}op+M5K;3E#Z z-%W;f*l@>QLr4EvrsU9#<)Di33O2G`^Olp)uj?osN2pNC2*C%*uVAe1vr7>(af zXq#&uv$Q;UhAQ82XptKkiEPYCVQu0v zkxC@RbSX@{vXaVp>qUrxbeGU-1-=E*aiqW?srK(m_(nDS_x*cGlwM4AeJusr{Wx$> z|7n2JM_UJYg``E;Ymej>uCT}Im2cn0T=nflm1Xv?Jzic>kVfhErIB@Sl6uNn6`U2M zb3gu9-Gy}j1PHH2b^t7a#h9jQG1`Wrsi13ghr7pnk+%ewBCq16;{(^t9GoGyFN+xY zN3jrLE)q^Q#D*SqS=cpZZWdGd>)UM`!heId3l~(p44J3jG zY~K8H=x}d5UG^sH^>QC7 z^bKh)uXncljoGLDS+hHth~RM-f_~u|rbm%u!xw&Pf86Fbh4+Yve{QZ`H?x*U z&>xo9(l&B*5HVk2%m_G2%lf+y{Tu_O=g=^)h}=K*NAMM4_LqFHpU-YWKqHNl! zF%$gIf35!a4gwt3WIO=XL&*)aQi)A)xU2+#7pqwbMsOG!)&?$sM>guL;2iFU3c4_o zU##bRBM0O}s$c_=OTyW#1tRr*J> zVE%dK7=(ox!F3Akq~>3tHft3lXIxA~NQhTr3%7kcmjt2O#jmewG}W2a%sPkkGkPqS z*LeeZwd=b0jb2-%3f%Sx@HmWf9ugIuZgoW2tlJ&Aw8_yqJ>Aoxx$JS@`S*2fcoEY% zIu4&kJx{W`Fwe=S_4n#FJ#hb>yZ^KD30od!UF+H8($+Km+!5V=wB;Ucoy5_iUs+%4 z6#cugxxVqq^F}7u?wYn*Ti?j)pJLl8IFz!Xgmztl?^@ z=#F@Xqo?e`PqPOa#Ua7>*pffg4r0P%u~7%DO`Xsb8S086B|#y7bNR1FQ8d4>3VxC) zU?uOnR2vEo+$-`iyDvPjyfRaz0dujbG^&CngpaivbK^7=3p`KM2r&e?R9ckY8Iukw zg*h|45EBuuIK2B0zRXkxcLhaPdX8|Ugd(VgC9ZNFru#wZQt5!v0fN*;mq&lN8Idt?WiI z+Mk0mbyOcLgtMi>!nG=`s^L4S=dL`&kX zrK-w7^1w!}J5kHV?3u#hi6bR}9(|2rj45(AG!t|iQdr1D5fT85O%0T1Ih2h?#ZMn@ zNGbO-8t<2uW+FwTX{MHK0;Zxi;#H$H7t==-SSFYzw%8)-jCeswlKx1==Q&IYFBNsx z#S%-&*e%vB>;|W}yt;PzS4qX~d$BYbl;K|wafLw@=W?+`-S)HXyz_b_X!+UEq^G-i z;=lFuBctt?PtcCV{_E8A**9N+pUa@vIppv@;_&AvSwa6Z8zih282sWE-kh(zGz+}3 zf~bc6d5j<1>0DfV#6uAg4VrX6E*nQ*Kwur0r{`zSWsuY|NtdV;v%0#P(a{J*XTCYm z1GT+=t!dqL-(Pu8PZ;N)K@b|KroR6EX+L}M z{pwm*Y;SDu&&c8#_OBR8w9iX}rJJHJ%ChYbg1@~}$9Ue(#y#f=ycP=#c>C+MD_c{W zS`C}T`$lv2-o`Qlgtm5fPZ|FmFun}n^g4draat4kcv{>Car8UzHumyLw|8`mf1LyE zyRO>4wVR>tb)4oMK7ao4->>%n>#tHj8_`$*fPN?6UjcndQe7lf>I(vx^F-f&gp#JD zj7kIOf*yRH@qjj-!2Tml$a)Ruc>X^KRs(Tjj)ey?C0|~3T<6ULs*ipz7 zai-wz9p$a9Fx7ZN$9MThj_85}S%HQ$ukwyUXtG0Y*mlH)TAGE5_c1xJlkL7^zoBC# zu>LkmSV;yC;`fseH{pjJ@gHC!K&7Jdh3&bRIJxIpF~JF`96C(|qNRuysgOrue0Ly#B8vY(@KC=$0{u>`pc%REU?L*vYDg+z(SgPii8R{DKv0Fg2x#4^O(F5@i_0 zO*5skDO8+(FfxQllqE}gO=?IY^0H0?(J^UbGw@r6R;Uc2G7J!-Od*89*h|jU)F~}O zR8BPkcC6qJx+UvPkTR(qydkEPM@66Wwn69Zq$q4t3_JWhdCM%T{PvHj3c;|DpMX?w zQvMn8mdP2XZHpSQ2e?v|I2W&2_aMkv)P^_c%K$l|Y_BXOF=+^fWxA>eihaGJr@RW9 zGKe#!0Yq;^3UdC!-~42}Cb;Ujj}Y>Yh%3bNtVG-gq=~vvAIKA26K!O!fw_^Ri2NzS zDu_P{x;y)%Wt3`Irk*VU!90jBk6Ai6gwy6?&r=LlYZj&2W|UxgY9%RLIDDt0X^Tbe zJSnn=XiISi1#oK@=+!XgYdRgG{+?mI#-0atthTzn18KR&o809m7C)>v8khNJF68$v zCJ1x*{W2GuLEQfoIdGgfqB$b2jNK_4dHzw1!?;!5>$P=llU|yf?VUp(Pbjx>$5KD6 z=tG6(p5DpYrg7TdzlcI!$Q*m_J&{eU4;$Fg!DBw}bjQm&nmKs|95am(R42~=mj!6M z<6?fgG`LvjYaP^Fp`J?#k84eJV{nTj>)KqKUX-1TaqyP!uv%Yg{}zM~Fs_Iq{83rgK_Vk~P)EO-a}W zT=e8N<2YjbaS@cLR3LDBuZu2A_-GCxxz3^?5{OlrnnSt(5xUCOE0i6i)fG(`?{uJ4 zDe<`(|FJMCYj&pDYo{`yA8r@vIR*q@*^e5FT2bww$*$z2Wp?h2;Z9U#{L9t+9>^+ zJ1-^vsi;&?W-={P&Mh_A02Il7@wmg>H0(kn*K)96Um7?OABRq$S<=rSC_s#}s5Sb* z;e&>I610v+Lm^=)#+;`AZHkFm_8d{zvpK3~U`3XVbK2fB=Ds)0MhCTy@a@pKs}L?pbDHmtHR`X9S|PVAp3?4e_pFun*t zsRL!Ab>IfJrmUHX<;2!EFGMx$F^Va*9uq!O2^OkO&bEY9 zD3Y{eWunSStp=KetRH^08|;493FgRE$K(%_67v>?lsi)%WhNjKPZZ9?pFuTBz>cOo z_n9Y@%21aYHI;2`_7ExwaY5@u|3xpnR&1g?_l*kOkw-D-9?Zh-Ba&=gyqE@(n&Awb z$LOc_DD03DM)PRCG;Psf>IE)_(g3}uA#pmUJ|>Mg@Sf|Y--0aC2~J9lLIpF(PHObv zOQI+}jbi1`V@!EVXzfSCCWIPo@ONq4Tvm$_RO79==|{vJG>+bMW_{2O2RNnWAob&>=L9T zFC`+d=xbpKw8V&Mq**wDfT%1(4jFW1G7+Kfgl-X=VUPF~eyS8)9g>DIcQZKSE9VN~ z@fYEZFN?|DC2NL-`A-7sw7~QYbcIG%I*EjYH1RKqm>iurDbBxB_8%fl7S!baZJ3kF zWd@{8XUH~QvDWVegQIMkJ&RKZC1tff@jcf_YH4Yi8XF(N#7%+XJ|Hl&By8Yz&i0KJ zz(+V+@s2-3ZTGPH-|O5(UPHq&Qr#QKu@wTkm+jm-y6BC8R1?V)M{j1^KA>9s(VG9? zHP6Qd$-bF;l_(J1&;aP{{1CPl%W_Zce^34XZ2!SYQ-XuDmxkO@=YMz!vTX!{?4C7D zcw^dnddK!3&-NWYulG;8{GfGF_g$?0yM~b<5wBYeDDC|9hW}F*?l3eZ@Ov+q5A>|< zzl_Cy?ei0Gy}l=g=$ zb-oNA*Smjt|4Vm2Jw1U!i3Vwu?mM2;H-0Z&nF?im&+EqBAouA9j$nH9NDy_NPZE>w zxvb9#Ti*WX*w^>K+c#wJ@nm3tvuxIc_aD{>(5Y=*ahU~5oc9&oz<}^SeO(2{vSPTg z5}%@wE=G9%xxPgvQZvhv-!~u*w!xxsOH0d$x!~Kz<;~k^X!+@32-)Dje**SiOFwE6 z#CN=VA4{0-`u>G~^pnT)-RrG+D;vr1&vmHmnrY*K#2p~j7*ypAW=o9nE~UvfNMpA3 zd7P}R{nwutoq}%gcT(dOBv{MyxVMIp)9?<`qykpZoVA5o8YTXP=3mVy5Sk!e=U7%4 zGC4R4XR$j{j^S?P1oC0ZX~>==qw7YevB+3*E=BYQWVI+ zxdeXo{!=J=o;3J$hCD2?j9g?Lb%%=|A)YHB11_B?Os0y8%ZjoJW|ePE=Mv*lG@lgF zGgh8d4jDU0zRuadF0x!aTU0G<-7&lVsBc`f_l_t5pL(g-NY{gvO$4h_P%g}!MSQgw zNkO_;UhguX(>*Z+qC@7O7v>qe3fCEhP<@Gvc*<(ULoI`&k!DEf~R`h9i2l(NgMp=lH6xvJ5S32*yi6T?Q+a+=M z#}Iy1CIa$jm4%lWGgkpQLtq@7G1P&@wT%RlzjLstN|b6j33UlP-0ZkGxJ|5W<1V}o z+RU!1Ic(NBu68)wri0Fp0H)nx*%w-bgvPFigk8MOB2TzQJw-N(*Fs-wJk82sFX0ss z#?0xqI`B7MUK*W`@WP&mn!6@fMxDQJJ9x}halaIwaNBm6Hq5kLfRZql(N#JeGm-ti zPIPqU$Q!nEj*lDWTw9fiOJNI_)|KYgwO3!Ao{JsI=bWsHhHBH!tf|kxN7tAyUoc{? zK)+bXe(OZS?#kvd%VZ!-{<2>_hDA58Z>qxe$01vU$aDlH9{RkHz#lA@ar7Zv{cPu zUYaK1)F;(9Di#9DqtO$`wh-Amv=@$e2Nw1>haF*u44}Pb0pfOOC-wU!w=|7U)6U3P z#2)MZ4%YeFw7JAIE0saWTqew${CzmbUhY(rO=;<^4tg>6s8 zmCaT=E%j90`nUR+uAk1to>Y7ln5)rf^*G2d`+Fc@y8X~L!r7KL&)4({&*`S)b{f{w z6|%9%#oH5mzQ%a}qBbXjFR{d+?~A)3&@e?%M{zade)n6POM5GZ&pTFCeXFT&Z{dl< z?nc`!k7k{YLG49xT4bcdO3t;#oJ&A-+Vl#|$g9^(U+AlObxv>ONoBn{Q3+$;^yD?S z!e)Q!M24n0T?sAueuP=$$4C7$2<=+x-f?>K!MKZ^m?&$i=BnoE>Z(!a*45LT9@g4F zIvx|cd0L>T@mB2i zbxUQ}bM<8PBxRbtXIqCy(dPEATBqO~m2y@xRUVYd%={y?MX6!sX@BMUBK!E0a#48tgM81@2>5X!= zoowx}^PPx^b70Pj*+;3mua&>Y!lUI_B|)-dGeO8$S0jt%Y5ayy*HBaaG9=UtMaw0l z!{UNngPCJO>{~-tv!n@zV_eJ7A}jjvrG~R3$cI#k=g%M+ag3(dc2mESuw8`w&wka&M3?r^l4VM>N@;PC32=T)EdZTd+?6YwDOL{b$e!{-{^OTT zv-$2yW?7KOikS;gEk4ta^_@N02FE>4$tq>?NH&MPr!_)b{oBxD)-SkC66s(ySU9*e zLqbPpysHg(HM|F5ZhYp*y@51%dF*aT*~$%J&IRA1^3i=YRKN?SnV&LPjgj&`6vbE{*&+;+Cu__1q}9GOj3*=% zPS(0cl3WJRb1J#zG5!5=T6ODmY($-pVAU}r{fa{|D5 zhA!;&d+-_%;F@P|m5Hz*<(DG?L4bHrHV)nvXs3laAf{9xltTU(g)`S1K>!`c@bk=X zowJqqraO5k9Hq(Emf*%YbeJG;OE@i$z`it*na#@&_4e=6Zr@I<>)AZ%XFmHW?T$9! zvoe>>?HmU3mfgtPHofG^rZe89`@g2YgG3(0yld{LCa+#tFI&ziAQ?Ng9l_fB$+y0V z&va5Rtw2Suy^j8Nt;h2fp1L{}-=DLhHcZ3nmaFUQ`%e&cUH5L^Jzd{>Y1`#Y6!(qi zocHa{!>0lS$^Yc$V#MQTH;< zbN4@o)jsN&?IXjUNq*O-3$@RzJ?Ngv?f;K2@8kXS_0L*g96{JkaLewhW693Co-6OS z)hawqke=>yLCE)hJ7mwJ@)j&Z@Ogl}_5b(JA6Q3IE;DCiV;KvzJ&&638rKJ{(m!R61fwde;m4&A{K!j;S{3wU=l}tb9yF6`arBN)JB_SRX zl#0GNrS>xwcIB$Rsg{0eu_>Z?$!l9ZScjdm=Pwi#n)!On?<$Oq%5kqs!0!T#OEPYMt0LH-fTtn7rJPy)0ZveO^l5rP<&AFU%_=^g z8RuvhNpU%_Z<^IJ2eHZ`_t4f&vT({Fi%MSgv`i{=((~AL>|&Q+TBk=iwNKlGxtTYQ zN)AmkV~R$kBFjWoV;_9o;zFlMMkG~KBNoLFHkeoPA5>RA*+-spl>{*iH=!djs+ucMwltD zaAZM65P!@yu?ibWsiZp_gCavVxBf$_Vv&zq?j!OC+M4IjKtULY+{3EoA|7yw6vfSJ zN@0UDtW2WHa44KnQ)~1VW_N=htxD1;%Bwa!@8sJ+!hvK7ZNzyX5#iC+9~;Ws>h&iT z>aQ#`KjLs?Nw2PhXw5t^Tsy>+i*1|?`5#_}Dvdnjw?(wpBvL&tS#7rR8MZ5f^78D{ z^`5NfOmnV=`QH`Cv#(I^zXL|_rvBWSbG;nBb#(R!dmf=m?)V{jgVh>DUZFX>Tsgm9 zP!S4D6uooJ5%N#zc_;SjIGjuhP@~Kwwh;k8774lkp;|Y!Ic^}>ceu|Eem%Zu(OV>f znSQFlpvhG%ejBD<)sT1c!#yh!$^76vk;1eD|R>>}WdRt%VYDgv?g|JD* zd^x$N`dPam9naqxbuIB&^&Q$;>swf9c{@w^OsNP>K|H^BMaEc^89EKGd>^V58@}HB zGa8#q%4HQr`kCr*8kVnS{$Rvx%X(>9IV9F;dE)?0YSAXkqRbG$rU@2b=P_e>NewG1 zNCgTStVd~iB|tl+9B$l>gq_%OAS~pcf&Yj9TMm^Kg{6um4O-z=zDf2r>QQn-A=?#` zVDcoch4Qr5Nc){?gNRi|TU4b~bF29vE_IVBgSCJbCk*9K=U8)8?PWp=iTLIYEA(?p z&~<>c@d8X>7@Wosl9jd57qyh>tq{8#Xd1D1FJb=Z^7*A-HEcXAri#1b)NF&(MG7sC zYmzaOG~b@bvacD@uHz9!C))8?XuZvThW(n6~I6It; zQ-2W+wYcY$b?G{+6$0&9%}lckvZ&wPl}GURf5ShO=<%>QoJAP*Uo?mu2s5+BmGgdIUvr`EP!s4>ryNSSPi0HZ-DM&S}H z#Dk;N72TrM+n?Xumqe;`F1AQ4Ag_g@B~Z3Cl)`3++I)oku1pjA$nRUXP}v{7hlu!q z-DB6_OBM&2n8NT=+)hMU0^@~4**XUM1a}!-ERzq?mgbB__|P>xDy=7lNROTnh@>A< zh$ZzlteH|nYPkC6-@5_Hy-iw=h=de-*+1Dec`~-pgDfsa( ze^s2`moowYbEs)CkO3WJ6%iDqk%l5}Bw^UV4RqI3D8MecXeiUYA0|a%cVU}h^H?;c zbTrmfekgp#XoM5I%851i@qFRKC01xTa*7f5KqaiQaWEBkJgul(v~<7h^h}WUnP`3* z2qc^{ah=a06S4Dphrv~HVA@76lKgbbi-DOYX zq}%P0_(_la6wo92gKm(sply#eN~89_<<@6>dvUzDCGAs&_W37H^Zft4UHgNW+Wz?g zPoIu8`wREKATQivpHBaOCq)5Je5$^qu7B4Foi>qx%y93wm4s zAeIxXfeY^s#%Me-kDo&*4{4x)R4ej0lmF|~qpu=t;Aiu$4YRmq^*=ZzC`)c*Ys)|$ z)P~)-y1MrJ5hRa;c**(v>F)RYDSLn}O)8$cjCHQ}KW@hCzWz^URDDyEv-iLSCqu}G zzQ?h7=U1jK_)t zS+!5geN+ge1EDE~5Ma6Lzl@O2l`p9lU~HqXDoT(cW+} zWN)TyD9;QD(^5t&G*pou2^oN#mJwHzUvL!5QrtkITeglQO;f!@Gn@Y=QY1O8X0oiK zi$)_qXlv=RU*O_0@x6k^#X5s^F%$lhC|Vos4L?>?9$ZXOd2KqWbUBCt5?DxwMWdx| zB`XM!U>!4t!`~!XCdTCFw3-KFz)mI0X<=6v9cN)U#TxZ!ophY4PE#Nu&mGZv}t-#yBFwU`N zbdwx*8@34H^gjZ?hw+PtY0Bl&_wPfgTksc#7F*PS?9Gg*u8BFPq+PK}&JoxQ2x2(p z>JcSVu`i~B8CO10GD^~#B$(O@pzplebeNA~siz7py2}xqb1kIeDURHfju>=MTtuw? z%S>q4@XZvE(WR0+^WxH%?2}^4BEiad6M-Vw`~dNDtP=HRa85X*Gv!ohCaI`m^&%^I z9Yjp+L-}DOcpVCmnbA@Njk%MIW&*l0g~UY4U-R+NSQN_%ET)`B9Z@DlrjL{`t za|(Q(jAF47lWN~MPd55YI@stI&7MD0#j_w8vQUZU+gQA5UOWxxF7_8y+pIMRU|=45saLu33XC}oxN@r?HnEmWvgz*>G1K{yKNoR>r9sY<<8|{7Fyps!SC&`e;f3@^yGeu zDY+HnatNCD#ooDGw%fyaa-br~ikFp;^J=?g?>-dIT4${Nb{>r2Cr-N)|Lr^iTj#*>1^bT+OMT+JlXgT^ z4WqxgLpC+Fw`WT~QpPad=5FsH!nt~Vvw2J5{GAk<1jAB&x1u>_yygZRz8+SZq7IF& zC#<3$Z?WhyoZUQ~Rg9|VmeMX%rLE|R4;!t(mC}%jmAX#I&}L#2)0C+`!B;fInCBAI zg7U7T@CMwatY$XYkChVC!db|Ubju!c_P4@ptN3V&R}xyN-vT}I>rD~-Vg$JQH;|Gz zBkrW^%WX~i^H11fDp*=Z6O|;AfwDUAsWnOi%mkE=Wgjmehwdq~xFG!sA}Z2moFUVm zB(^w3rH_go-@42a{v3cKgqeIDA5C&4HN~}fO@w91rN*3HU5XXcHnM2A#?57xMFxR_ z!^JBMj{_58Bgg_HM?tkosLyV`!Z5^KK+VN1zYz&xqYPWro?w;g`+I9)6-MV(d!;0W zuTWP8D}hcNqH!sd%TE3jlo!C0n`_jXO$2M*-)r_?BsVpqF0l3W%kz6*D>4G? zSvj|a^kNw1C|ez;X1awMQ|-ro9{FP$1o?9eukuWd z!D8g!ZbDc=@>sze;;v(WsH92-`ohv{{z?E`YC%efHNush2@5UUN>CPjI?1e>-3kE8 zT0ZWZmguhmd<3t+HmFF_u{+gavDm0U1V|3q(hKYlgu?svz%FV$+f@&2&dOxf_ z3MS3BIW&2J1xB4_En&4RR0i!d5aylN{5AnT99vlF3b&x(3-uY933E5`8Kq%;1cg{| zv`A*Zw)|INYALEfu9zl6be;gwd9avZ!vgYXJsxXfF{nZtH~GjyZ22=b&Bftq;9~Ta zdRbwfp%6Cc8!GMMPEi#idQpJNh?Fkl`VxYtWsvg zzbP|?CiA(H+MNR;Ux%efrhSvR%gGj?3tV0ySSxk^RIA8h&a0Li8P12vq~-et7Pz*j z0OS*;O-Tz=M!5osk*&(b7hY`+(@7#CaYN2RkLY>SBLY~V0P#5DkJx&eDwETk2(V#i zPSG(G7UIgogbRo)1&aYvqY>sSTK~@iv`Bzk0hqCqC_<)zKcWjYHwW?V@`LJ z0%os5ap`#iWbjM)$e?SmI4g8j5}c}vRJ7VLK>wQ)41?5H46}19wxoOJTuAX9cW7x% zOc)rp-iLQ*LV@Oii;D}CUrG(DPWMOBAbm!M+b{f`Hw_NtNfh6SSW9~fvmW)cj@KTR zFh#%n(*vG9?IEAak)E31^IZbGw+oHF z$*0RTZVo_W~`BJc5|~?xKC3oAQp|Umres2JOGRU*bU$-A^a%0lSasu6m|< zSqj-`|J=W;x$UF{RZJ+5lGo?$=kCc?$HV)hqW@VdP)~2|eLem!ZnXGRCL5C<)ALKE zW`Ro7OV5q(ewkMXl{J4XYHa)><3*_?Y~W(?V+I7 zq@fM2wISAm`iGxEGf864BgsYlOqGMrY!zGI+ndj2DE0ahWtDB<*Se;RX)P3nheXl0 ztX>P)BDhWV80aCaNJ4JDVAX~sb;kfbMfQS1n>eMKT9PKLLIu@X)aW3fyYS|`oRTU~ zs!Bu#DVX!jXp*^+P=>*m%TP6!0-53PNpzUZ5C?T6a5KMBXF03v8N5M)wt$mEbjvhW zjJA?c`MWXxQc-dND;yI|697TBIs}NHnHdpBByB$Ckjfsd`dza8uKlPUkU|V-P#rK& zO9~UW2S`PfZ+*$>XVAOMv0|fxi_eIuv#24N0D1{$k7)%zGk+=cO5${(1^T#cn}U}a zqFbcGCgG(3j1nSJ1-f1-6T}uG3nQXpqA(ZhF#}RWx(#*R5XDn(wV5BTq(s?+bBcyo z8L4Hn+Epm9B1EB}k4RWl9XoDuEGFV;urrO-OyuF1XqyU{0a#7Ja;Y1RcJkQ2CTV0+ zU8tDEXoYx$H+@CQX`-bR^9RkWvEa9VOfP67Tj-;2dSdf@qb?mFqbf|h(E%^aBc~xN z4FEg>nG3=T0+djrukzKk=h=|N^URggGs4A`wTjj9%f$2!Ch{$9$A>yxBO15r=N}QO zD@cN5Mf92z;8SG9@&MIlT9_Fv!b}ts2!EGQm%Y}h^Kp?vTY!mNk`e`%?%=3s@`C6QBD1?xm=s-Ac68KLwUJb63K ziSj;YyMLNH%PY3AYxH8Bb<@6s3aO~Zwsu#?VVg1nhl@4W;kU@#zz_nm;#`p;Oe#Gm^*^VaCf)zRqx#Qy{>gD-bI&L z2#o!`Tk`d;+=DFMnY$5W0Wqq-j=fWAxcq|`vrvqiSQk?Sy6yxqQ~aAxzO}WMM}^d{ zSjg8Npzze8E}vT@%xPI-4_-_2_#GO7UyhY)3_N8?9WE1Ln{uFJ4`g; zrlE1$v7t*;F?b0MzH~VYremrfN24~RL`;2asbW1Vyc}?*I&^cDy;d?y*95JShNh-L z-6f=W-Z7+>=Z~jooenC?;Fk#x85EvWe7%5TMXL_p$7ltXIQ;{Jtyq;LNuYLU#Na- zMYwI03!?hzRb92=73c94@w7uMyB#+R!9tzfoq20U_l>|w$-(`jLL8q1_2sVzITSrp z@3VyTy~%o#YF%^hKi@sx=wEg<9nSAFCc0{!=Tft5Lx#+v?fjVjrUur);NvRv14FId zZ-yXedoj7MsMvqG{`o7~?O-wd-b>(P!@n1Hh={{*8c)5GwA!9KYvc|;tJf>{wu+>l zr5DFD^shixw+^L%lbYf~PvM%#_#>je(s~tHChU8cO=*_L8k|Fv@_2raZ=1X>6QI`e zfD6>)8tA$-oEp@kE=NfIvU8hLWBga;v z_d3ZDRw7J^YCt+WivUU0%f3M^UKPHn0fPoa(8$+h2cCmC;lF(Y&{4qfh-J4Xu$s6E zPY)`GfQ_KOpsE>(B@UAxuwa&}o;=wSHS12I$j9p4R<4`xlZ9oh)6bsbgG6mozm`I~1g7J{2U~Bj3N-N|y4}Cv2Zhn?3 zTcD)q`C@(RTd1vF82L&@V|sZUOu{Kw8+x)~%w?2_qXc6Q!V|2)=WI@YIe|zt=yb-Jg?C7lZw+ zm;bZ5|8pz#2MD>uZt(GEZP$T7f9P2|%CXMPGzY{B0C{HL(|#_sGJtfeI8ro@r#bHT zRUi9;TPposG;VsJ#$9kQM7DF?m+9S@jE>gUQ4hWo5XpP=C2$S&3JW>{cJA)!pj_00 zy_Nr;VQK+KowaEKIL)Gkh|lo%!E(iSL8txe|4^Gx1|P2fovQ{Bm~MIVUJ*ZD^8V3$ zp4MJh+j>V@tk+;kZ$Xv7$22riW5mxz*aUUn`;NdZ?f%7yt&WZk2*dfcqvVU{_vLpG z)#*9v$EDlbs65(b!`RN4aXkMhXqu!`?gXJW?=S@KFnsQl^Nv1|o+z0A?EdY1vdVWc z^3!H3G!Rtk`fj}Csx+e2tc4*TNH-b-S?0C z-QIt$ewSCJY^@$R&Ms_@cOIO$Tj4}*uNVYUl<5cCQ`)w@B)p<*O z<#RAaZSlT^DSPK^O3)r#NQ8M(Vs>SnAEEvz-5)JBB14uBRgCk(J`0jCUI;DRG}t$E zA!-pQ-F>K*Gn?Lqg-X%JP?45{w^KzV4|USOixi(k>Z~nnLa@>+_?t3Ny_oi9NVX~& zMz*gSm?>KQFsM*K1P@VKdZ|Md8yH%|#DS&PT6nW&=rx>9G4X4Lh6WMemJH@sP+_wL zQv{T3WOHK2MTM)hIeb(x8{#(nWY+ZZqCi&?Ft|Kd#VOgKTMM|vtx}Nq8bD0n`30-r z=}Th}+@4Qh!_;Bzy(|uv<_cM**i?2oyjOB433<}r2ehC_RC1Yte5V+tVsb+z;u8o} z+QjBT91#X?6>2dbT^{;qA=HUjZ<80dw2pqt_-mvd_;n|4Udm86{KB$j{4qj61U9gO zZKsF>ga?KYYZ;echaMyWkpDhbs%)luOK=KqA$f#lb+I7H!pE58qmUs(y{jY(&Fy9G z*p`#c#j+*Cjn)>bWUs*{%iSYc#!3sGjzJQ!_lj|PRKOsVs}9;ZXqHTNSTrt~1y_4K z(>=_F>6}k?30y^vL{rW}#o9cowY7!nJT7F+MMaQ7>Rkd5dPKLTiL0o3A@}y5he&sr zl+RPz1uSX}KV}q$`~Yb!%e-v0RRC;@BFCXVrtIx$%qiuCLy^J^v}T14MgzrHnvd4Y zBSKc`mPp{U>Qhj5@~0;$0t-4r-As601Xt=v!Ydg9Xrob98HJnpda4w7Td`)unD}O)%<>( zw!TP@P(9GzUq3Z<*E@%WtMfAQ*H5f&z*yeAW52zq68aiJI6qoG-*8Wu_=kso+dJ6d z*7rl(;m|uQx%8gC%Dy~C64S=+GJd|6<@2!&cQgHw>Jb}UaQN>jYMW?e;SX`r_UYbm z58)fg7{*Rr{|CyA8sz|msr-cCYI|RL%}Hx`D{VNHz~+x@r?NO2Z(Ier4G{4l&dZPAR0|eZ#h%nfa|aVYZg`6THZVdz|1HV?gBF%4N=N3tdDT^ zDzm^BT|`!+vf5pc&Q~>#0t%ts?VwwSdqgiF0fo=I1HNL%iCAwbkt;8aZMo@JMl3>i zeUS-I2~@Ydph9S^QN|^rLB}m4lBd^-D3XgC(It;91khnu4uk}R^fNnQg5icVUTC^t zO(OJITnwVB4b-1mL=-#4(1R10j-c|F+8HKh{Br%>l4hjOW^Kj!7^JmeRBPS6Kwk;o zw)?%)c)5~#2F2nLG1D4(RVG1*16^faE_!^{Zo*63*lr9nT)Q?E;`zNlL+ugPO(U*x zGhJ7C_jrDm#>6$f=qIJ#n_lZT4Os77KhuGZeZL(q73af9|C2#)@bDFuEb@=w{R$XQ z0S^ViTf+1$MKbd|A^RF9_bs5;AuS^%@rF;t`IR`MEqiw79s1wk!O)zCZtF|PqJsTC z!3TDf?I(b_qP!9lVIlYZN28x@ygv_3`HNfkTV2Su!rf7r`RYFeZ_8xw(=MOObx-16 zr*9`m0?*pP|MJ$jUkpc%)+xhYbI#ZhsOZ>Qzpjf-AO{;9OXYC&xurrBPR-! zSLgnA$;E@#&E)79PKAZoDe;2Pd{Y4w{uUQ=O01%Yhun0VD8rr=SnGn>BY|@%l_8A3 zFB4h;lXc!-ukyXVUk$6Mc*8zFGKx$rsKtZqFvaOI8~PYLR!j5+&489xdJkRyIEIKMHfAQ%Y18=b!ts|aZ%Mh!8tG@{a0nGCSp)|Ts;u7)Db0NcgR z=$z}#pJ#@})E8x$hl~|92lZu9vk(nmLJcG4x%$Z(sESQFYPq2KG{uFX3osB>k~)Nu zX^HX!r~v&3g@d%?l8sr3&Y6d)ibiGW=YFKT>fz`+o<~5u)zADl!}%Lc^1(M+S3mOg{rEOm**5}z>D-# zSct*4h`wiJU>9eoX~IFtP&F@_QL8gh*t0OMad~s(uL#{ok--hX`_Z6AK~k))4+h3d zP1m$WmjgtEVs3{q6dleNP5u6q2|kiLUM;)M9L5XIe!5;k^*O=%zP>#1jEo#%VQ_Rz z84)+;Q6D`DGTQt?R1ve#VcbN(l*QN!WF@Y>tFM+mD*4AT%0C2q|FNI1^Wg%+pf=tu z{__l|N$3CK?%#HVLIcW(P3VBniHCqDtL)Eu-7s!bG?OXV{!{wb;kENlZDPA)F4z0bsx;ES{181K$q+}H6MZ;(yJ6ZAOF z?)OMq|Fs8t>2-VDVF9|k6+FCMm-gw}damDo#5JuAdlOe|8@o<$Ow%@KlW4WbN% zY{*Brr&BiZx=a9ddEW65x&1VXbgN-<54=H(vijQL_XYlp9E+g3Q+fB~ERiI)Pe(yA z4G&~9cbK5M!?ZyOo*H6}sb8^icW+pZ9r*=d=n+8BFq8(B#FHH&5XM^3D(IVH6T(yE<;j*XUs-L_E;oVz=6oG zFMnnQaP6;5=tz{AF9DAB!w(kYp_!AcG&XrgC}~PevX%rFR}|+f!i5gW4!ck;hl%4a z{r)1}5py3(2!V*N%D4=t7P14E^26hu8)fB4hdP zWQX?$nH-BpJc%~37|`@YAQyT~z9hm@i}bjWXdnkAp(W(3qVi)L+`>n=$k)xom_!tU zBoGUMN5u-J#|*#$6_-!1jR%AjHpX&+gq%VhxR?$@!eWnsgE#{Rrs7PbMas&_OtBV$ zKL!o3r%;F}n`#(lu*TEHs2FPEP6NzL0@1tzkH%SK8c5(`feS*(;D;TP)K4X%&?rVp zIz8l=?4J8-1kJXAL2ktr*w8U$jQ1=`d}7wPsFTI#!-FbtXqg! z0idFd;T2dhzA=*Yx8JbXGf_kVXgxBjne2-9L^YM=2tC=P7zHr)93|j904y=~&TDD( z$ee+YAQK35IxnmU+fX_L;4eU`#8Z~1fzec;kodwcbaf)I_kM{21?3~`bQpkz~UUuQ&D&8FU+WThJXesizO}rv+Q(6J4ELt<_diB2L(Vf}cs}zAO-I?CA~LUK^S;8r+3F0wkwbaF zU3(2@b7%EzC^^zO(`&!0LHc+6D;yLzhPWkx;hS=X(B(lItL;hmKM8m~<9VsOE~<<5 zxa$pkJK<-_=}4!3VzkdBI;i%7=U#9&u}{AraIg3Nh40S6kp3c(Vm0Wl9{-@!H~IUh z>5OQKUNt-7GDGxxw&0*F;VtL2A$wLsMw>4FwTbM$%h80$d;-WUtj3C7UY||!vf(T#5Sn^X?iKB^BH63E6arj0kjCr^M zzoNcAql;Lt2}>Eqd|n=u5Mzp_owc*qGIM$(FOp3yBZR|11uLKli&ctQdPt1H@Wif+ zly**v`-JTiALl@VX8HzomOHAgE4NPNA2gg<*oKxvR_o}2l7kHk&q1`L9%X_^M}=k% zMJ2SYN>SsmfF1=Vn72R5W;R4Pj~IxU!vcSYQ|nWayV)k8SmU6NRl4tnt1mvjMzuws!b070*>l86Ze3PWD<+v&I z^UHbOqd3fYxXNywrfB#VpU9>MbVADQQEkLV@nEzpDCuf_9+l>VJnouR#%j7Yjh*zd4-pkaX?Wu3CgOXu)i1TLqyd{Dg~29JqA0Mgh|Q&QjCdr+gGNAPhXLGv z`iBsv!>)PjyC`w}7{sFrGXMckUAajJWMJUPo+iEK_ceyq*ch2|I8?raMsQA(o=`)H zGag)+EZUEIQ_>@BmryIxtcVpN$9WeEkrOYGA1Lb7J!6>vpuVIAkQ?5nXxBKW=bxRe z{z)G#)WA{@CdG#ijjErtnSTHMhQpk^x|VDj=Slmc&q18w(rRZNj}DuR1ps zvoyRSStq@n^tj*k9)B;5;YOg{f)&O0%Qct-QnUWbAo1FDBQYfi3+}=6pafiVTs z>1>upUeo^XlxN@Vfb>=*Cx2{@S9o?Zk^VK|!qJilkXZ#;h*QEx(S$x(@aM}#DrAv~ zJmRxJpVLc_t>Ot8wTKghE4O44`JO^SC7f*v{2)zK6c$$S1Y@D@ay*%L}UR`MgdUlv?6{`7GF>iE2tF z{I^)Up{@PoRB>l{v;mSALr{Co->ICKZil9_X-?!Jtm$!IU#?>t=}^VfTBz}44; zatGOfPTwYL&DT#3!wrpYaf-)9McMD3-4EZLhuoK2kUM6n8+05z2AwQX`kr+9MsRv> zp*m~57p$K?yO*H&eNAW@Z++3~O(vZTqkgx?8i<7c?`=&a)^Fo!rN&o?M&RRh4#T*c zF8eQttuE;%U^ycx_(vHT1*NZU-Cj*?H{D~!mFP3{B@%Pj`ty9%{4CV57w7M;?7y0u zTW-)Q4<)7p$>_sRVU~O6vGm)WGiXi(Eh(R2$n;B6ey{rb#q7S@gP39;AOHBt*3Mq& z+)A;chvc=LBa>N$^VBkZaZfTTm@nh<=`tAD!&lJ!x=x(3nd=AsapivlHy4>p%^`~N z``Q}6A7_`}*CpT96VBr*q<2*i42+Bg+iS zXq{9IZi$_p0O?y48np;1!#0IV8bhOFu$^m!I`uil!sa;3f~v64O#LrpHoQol0t8sg z$VF%5hT#ShZSf3jF+w#6W%pr6A>%V_p^iv6W>-VwSPRWcAu=F-MhRk<06eoo0UH=E zg#&&GbV3+j)F8~Qz=QEH(BU^NOF}u;@4~sSUdh`}qPH8K*Y}O`@n|@b%}t(;#j9n~ zu{RhjHGNScc4b4fgPU5>yZz8@^K;EavQ zU6o^+{=If%oPeO&o%H}kT{<4G=E%FIZdjx-JYl4f(LyBzG*6(2+9P?2fO0~;RcL#p zmG;2@vjAd%pVh}=@djlPz_Q!RGR+d*^^h;(CMzqR`P}e467&LX4LGl_9dKIRGT@Ue zv0xz2eF&*yE4dOfe3)1Ue2!iMbnq}=J0{e6NMTWbK2}I+P<{hNSeCBHa$U}#*_V(Y zXp|IbDH>xsF~e*C&q;?aAY_YK3am81H@pQt45?64{jxkynN9*)3fUiawd_48KcTl+ zA1S1Pd?d}(o_QhJi4n|zDhZL|2drk=<-Q7ABH>Tk`#pLou__^MGmRf#y?_M{rKCiz zzmbCPF>I(+3x?UTdZMLbmbYQW4ip9esKJyBGC`L#$p;By=O|io{OIW7SeBy2X5wA6 zN_w$~&>0DQ7My2vImQ_eL5{pC6h`GQc*|5W*1dRXWv_bB%;rE&X=ZLu!J#U3 zz7G11&JS`MWW~mAePsm&r(?XijpWmYe~@$R9BVcqe=sfIrZTL}+ZS{t1$&P=qz4u> z?CwoGb0u(mED`o-umyc%4_wR67}agA^#e~s$~J;8rlv12x=*$?rN{jDvU{d8FD0+0 z_qr_M<0W%DS%cmEV%-asz2ZHdjkciq-2Ory3hL$a$?);JuS+=kv`+k;ao5~hH*L4M zo5IL`gor1ekycm$Q90;2J6Z`WIccq$MhI-?Dim0F7Y>&l7e`&U!k9NKGR|^6kOy7m z4Ty~SdWz%2T}T@Ud7~Da3es(`_?t=#xvsd`u#4@YEXgl$>Dz=g&|H_B))xV$a9$J4 zNYj7&Nr}JXSnwMLQPyAz^IR-Df}$uKh?XHcXw^y*;dbURRx+w_4dZ=pvMlWbOQ~5- zNeQ8pSg1j!%Ry{df7(9YQ2aG%WMzf2jWNp|J&4Nd#Vi3lM)b6_b?1lZ#s#;OqIhr~ za`!Pc`b9x$5e(9pVz#JcJrMu2!jEfP|iJMX~gbLWg0pm^Gz2RRCrQgWpNf> z%wB^e&Z=qw_K~g>L<*XjKPWVuy74q^wK;P=kz2G1pQwiRNek6=39PonnrbkrWaIK7 zBr!;J?J|k$0HrX)J>TW3s?&G`utZN%%jS&MK;{hHJMk#UZ!_cb5{} ziw1Xhch};@-QA137PsO~an}OH-K~WazBB&ITfNpvu;(M^>s0=5!V z;EP0YPAlA@C$jXU8R_{gKiyRd7mKk<**XpJiIsujW}i~ZRFnl65H;}OnEcy=3Wcq6 zC9TSVPSsj*GNx(Y=Sqc9eAV***|Orq3; zT4!MJXJ?h@=w$jR@lAho(gbN@oXd7aT3KUYAQdTDA>h_=g6~fe7a4-DB;zwSHiDEh zrhIBOO@$7*3AR&v{7(ia<{fL(siM_V|E zB|(Y!f5qV&NhC>;^)%#uud zD(K7+Q4zA4zh)&<#uQ3e0#!eOZb5SyUKl$26@^yl<_YD9NxZ0iW?Y&one@1Gy{+G$ zSj4uSP8KprrF7FlVeFPuP7i0=2e-Ucizlx}hMO*K8|{$^c&zmXlcU~V(L26EhY+qO z!-shHgM;<`HGCRlsg{{qbiD;a(scA18r4x({|hm{P|DAD?e0m0Kt{8RSSNBAq3cM+ zE*_zB10?%zUQ{aLPrdL$PRkm7wwiUl>e|jfxTdsUp2yth_a{sf zw|(!FO=Lb2=bg4q3&4SqFK^fD%deT=pYcENSsUs+kSy72u`hWfoJzrbTQXr)F z9^YkzosSLShs${D=jHzpq&K6KUvWN*BKW?{zo&h>{_LOoaeHmuRxAlI20mYW?U|qz zx<+KtYwPuU+#E4u+j;cAe0=))e!)I{Y1_J;efZdj7qmhOX&QFA^j0^2pdgH!b-D+; z@4DEf#hu^&CU?F6yX>jTW-J*zeA^*al5uu&>UC-V^U-HS3wd@cgPV%?J2Um&XEgLe ztoLL7NpLUFrN4=p_#M7$JJQR2`JiuId0-N1L8i#zwsyh3;Pmcz{_mjT-@!+0`=0OL zYfqm}AyC7oe-I?AHVQG{hIk8;c`9&y5Qv(Qk*vqx70D=Y&f&CyyoWMyvXT<4#kMJL z*I}9wi(AQz=nX%>*|cSDs+H8DXe_44FwKUK)>gk_)`Aamm%d?t(U1Q^ zmobJBT(K&o)v!Svsi>JkTgxU`ouPnKh#cZwyz)Jvx*$F>$OoSw^lnB;Wr2MXCDe|4 z#Tm>Fz7sbM7gn_$KMf+q8nOcEs%m)ZvC>J8B4xy;{G^hQgw)xm{P?0Ch)MIfIbt8YL5B>d;C;b=%1LPe&`t3nJ`p5*+WCO)yue zE(ubHau}^_ZXdi0UI8$tr2#qCEU=pn1xu_U3C#|jrSLH0Fv1Qn+Zl_|msdnVF|;QKnKGO#&sEXs%) zE!O*U1{GDE5|}LOZ!S}2rbR?Z3hO!2>4^Zgfk-7Rr}#{sTE#|;6|6RuT%v9wWsr2- zFdDW-aO#-`JEZ|_6S61DaC#eA3`;t(wE%-n(AZOi5aCJ0u+a-@P9GMAeZx3r72a&Kyr#g(MpE1dYlHoVp?zYKYLx zaNx|1Fu9n|h<$gnl3V_tLX# zA+YPtA67PjV&LlB_Y6;J_HDIrpX$6pU!mlXhr>}Kj4-E@TrU!5;)cPIuNzIVJM5L# zvR%NyQhi~8yROlh?dt3xhF$lO?J3Vkk!Cnp)h=(PXeP3zvOhbyd}V$dE|kx#V@FFK zbA4$}5n!y*kcxQ@&}!BFv?$-LnwVv(;b=;WkzFS7o(WWirUpJsiar zRC6Z`B+gQwlnz7}G4cBz&ZPE96{_HP6u8Q@N3g;z6q{g2&xWaBy3)@K2rKi#{OTwA zZ5Mh=EU&aO%Sr$Z3PR)2Wo_bB*$fjm4{6u=qqh8hm$?16z6EI;SxYgNGL%FRCaCeK zz{n{r#oO-7oQ6_Jlsft3f9!B+=F$`idJ|Hi$%8ZAOnFNwa-E6F90jP@sV2e&lbD-~ zmHuJt2&^Op+?*EbDi6%uyEJT539A^nt7WYGOyOcd-$8e25HuAHw0||L#~+JDCyveH zxkQhjMq(bv-DOvt^96^$f1~^M)syEq5uZ=8S#xE0qgej@<>~(Cw>s@A&%U<4RLDQd ztWuG9O1#oXSI<2_a&eo>4df=w9KGrsHAH>!nStdvt^3Ac4omP>vpetfLHBOj-qkVY z>|dj84x_^Ech8{nRf#FXuQ`4voJ@bYJ)M&1I>WN>JKNj82AZPvWFZe&D;TW(jwD^% zKXL7x(ce?A+cI}tH_5}H*~8D{ZxC62*zkD~2i^BO+=3Vkr@>g$4LpkU-dp}UB3 z0H1xw*I>^${0j+{Hl@!+z;0#~b34W^RH~;v5T7d%W)`^s7@<645v{_fMqF`+eeM&d zN&U*Dvfx_DayV9G+pr#HvTs$!ii#5KQvOo{iM&0+HpGY#PBURR$f`K^q=+OHc7(#y5ePG&>7b;TsoKhEAmRuU2mJCMn2|No z08v5M7IqlpT51&ayOrwz5(_tKlsmmW&c{&f?2hHNgYYHO8Mu5xi@34dAqw*4E?6^=rF`7HUaAeW! zhc-97Xh=nn!3hEf1Ef&B-FKblFj6Q7alqPz({V^irCbEF?R&E;EbRE$83{N2>X>|h z>Os|NQmGhizod^jMqw* zxZzd|RX_6!k2jQB)}A|G|Akff&g;G$e0X_SR%`olkSm?1U#>Hx4Qci)&Wl&B;EZ@P z7rsq*f(UP{Xnc2`@uE;DM3?U&SHej2{%96W8RwTf>krS3CbrE7ymU8`)__K5)5a4s z&~zm3`k}SwAC6)8vD^5^Zj5vA)hF=eJD!xD@>RjN=g*e}$i5%sQ%GMgHsb1|yZF`I z*$+Yp-M@UhxO8DWV2p77xGH`m?0NiN?ijb?T;twPA!{tao@e;Kqi4UJ zird5IkGTIw-m6ULz5?(3Yip}d-|Kz&MHqqmUG6T%VmdO0q;1XlPMZ(Mu~ zQTkp6>gv~HkS4){`_%U@(-3(wgv>gRCO6qmZSZf=@E^|ix4SY!CcWdsbvQ$hOz%*O zK7J0AO3sjf7ePzWiuiKx9$PO<-=^I7{sjsyGfwO6y#Ec3zZrRdFq|)?{^uKd96!*t zmmk6~xuR1&p>9Fg=7zL*(Ll$oY(2yT7sWg>C^p~35uTQB;{onFM?8LlaTHN-*pVMI zDamXXZ=I!xH8yVL@jqdp0lrj?I73DZ&V~!%IM%{4^T0KVm2Bxcq9soBOhZn}85hZy zD&bEc9JvkLiD&sz-QQoK3*mf2OmrJ`n$B!s`_PLiPnhkrSna4{V#{SPnnpHq=1`50 ztMsH+;&c7{{C- z6zvqb#1y`e-h2~}7MdF!IvY7|OmH;Ir-+isFwqcYmt-g2-f|bLs|=WdHWDkuaWIer zDw=>FAq`ZW*&NxNuf{545m=cb)eUZMa)3}s^$%c#N86&0*nY_rigrnIV28-%#t6BB z)gfM+`a1|~(D2u5s90_g!Hmv+THgGW$zyMU@NaUDvA!Z@Ly8G?1B3~ z=EF4^5uAv`4UeCb5@Ooelc#C_Y4@H8j?)8SMdKMh6~Y%fkN&so$SG|DpoE623i-3d zDNTGt!R8t2EZPak+_&|05L`aRB!+_#qa|);ahw)oZ`80#{XJO7FIE&v7o_f#f!TaV z#)p;=>9q~CV@Z;UD<%{`!s8RyJ80vTs{HSmUUF>2I+*fUd{MW9ZecM3Unb^!l@xo; zi_d)ZgkOz`CrVb0*Vqnx#-NgdxOne2pETvuwE3qTcetERH<}4kABkvu6s5UX9Zpr! zBaQgi@aV4sYPtA~cKL(oDmum-Ll~|X<`^{&?LNp(ZPJX>*W<2xpotB+D<3B15 z;(k?SRx+q%gd1(wFw@K|&JK^*v@Af2Mf?lGT6TM!>~KwbJY>GllP8QRBY^ETZ`>A^ z{^mxeywx(n_KBVO!|Qco#~i~yMwdX%i_Y}p#&>+)N3cb_;8f?fXH?nub~*1w-Z=gB zgOJrfu@+PN7l6l#psGt1J0bTRWLj^o3&G-x3)90tUI(|_2~#Zf=Uj@Xdqh<|!E5x& z6LCEJlJ|pL8S`$*(RMA_JgIFU!i**?3+r@a8#)_0`Jn#!>^+X!!iPw;rnWJ_i?BVh z{8d|FK0eN`Vlxx$opN)w^XppQ0KyVmT$B~oFj10SC@QiElk-}V04oX)ADnF@s9{H- z5a;C^gmLrilqF0^IYxIzfnG#`jl!h?U@=p0#x|MV!Sp1gcc4?Lu}(5y;=*pWC}C>s ztCypc$Sp$yhgea%Ar)bhdyN|aD?me-4+Zm#;^!(H-1w!?rbUt2f_~jbRk>`BLDD#l z-2v-dMAFk%wAh5b^6?CKPwGQ0s3ApRwHwA$$sB!+f)g{B76KwZ0!raf?nW7Ko~276 zi$Xq{+)DotPk8oDk8PXQ>wVr9&q@MaE%AyO>&y)dEDyIv+CQtE>2*qd^NJ?z;F63} z*xi#)(?s)xkDQPUTZNszTI0TY8K6ao7n;-}Zg79+oI>LyQfJz7$z9gBqYEds9EYv# z_KWIa3%mj(_qo>UI!hZ`oErS#^nzyh-m_XL~DDgbYnCRH_KTXxJum*?gOeGJhDZh!`2J zl%!C32FzFE+?PxcD)&Q`)?5W$hPF$^${W=u7%@La8+xvh^eh!ZwmYGn$S(oVZqOW> zl;9kNnzFHWG|E87Jz9KpmJvIxbk#@H#yJ$8eGH+VWX-l*>7}wkiHRvhg_zjTfdLP=)##`kl33+ygG#nk956Uan=njI z%9hHL2m=VAP~hMcICIR%fFuBid=jk{J)K+7uqPm@91e*C6GaDN-=Sow=1^Jj&Ce4M zsWJX%56v}FuD(o(m_qCf46;fH5W|q8x?lCm(00m?P9$L+%U`PdZiP&5TthxrzzM@a zBQf00DwEHu&4b14C1c`1+=k|3DsQQ-WIS~u))JC=y6(c~KfKL3XQ;;Biq{;|5Ue1B^UxPlms zKc=gzTIaS82Is0$1I+3wlr|1+={AYaYuuK$kr%>geO_5)4vbIWpZVpH?; zrIvI8g)q-fM*=lpW| zddW!x>lBtRP>SVNauht=7J`{Euly7+C(4nQCw@$&i65Pif^IelmX{L+a+Xe>&anhw zNl2Py!t9CQc**CBlC8xFN2(+yFxdnEu}q+40R*ygX6R2x)`QA)=z0dE9vG=`bSO0V za2y)JH=m@P%hOW&YLGoJ?d#A5g_$Ce+@i#lr8r;&^WC5($hq;y`SR4MlO}pp(+ybp z@Wvs*O9U-v0InUmm)|jLqrp1iXR1{A#i&6b=a32z`6dAqmZs2Kwkc^Ab#JYgRHSQo zCb6*KYa*St8RmHcTo5zjT?7{$ba(mW-y{J9C4Gx@BqT=|36GGH#F#65GJ;r+pf<4x z4}AeDEl1#=+e0HA!uv_v=wp0HlJNZu$#m|462^tcho%j3ox!NKHSyd=oL+vFIj zVv+bGa4P<&aDbaS*eVR%zy_7=YrxnxsG`1NE*TTKg^=wRuFFe+NcBY}(!%RcrUG1f zTmzAy2HNPH66?SVb+~;b!KWqL7irmDZ9ewBLFKo}G)bt)L}lV&38AU-*RVrxF~U&S zDR$CFAZ_5U;4Ir@%hj$wvyF(?Q3sR9y{TRkzHDqhE`3zIQ$6>*xQ5#GeD1;U!^`B{ zsBL;1BSWj{?E>3}nHKS}2LQ=0F1g8?jx*n14h5QhB3tbgwdFCt{QYB|wEcV1cUbK4 z%fMD}J)bY(fXG<=*U;s$AV+d~i)u-0+ zRx@`h2=5rY!#D&~U=*Wav*76haa=dkRhZPGRj9XU3rP_v0V;*>hw*<~NyC!*3CBU? zV{-}|3_RlSm|55Y&h;s$FApL8DHu3_DW>C`UXw;NFi{QUn8ogQ+k7%d7sXJ@tKe zQsX!0ZIy33TG#%DI!UJzy8$!L&m0Q9gN4*(r<*fQ2M78)<>^|)jmHiYJI{cJ@vok{ zZ+VTHt@V%R&Mt}(x1=T7Bn|bj+4F;Egprn89)X)>j!y4Wm_BMw9Osb}^LE^>2ib9< z-f1WYR_aQ78L`}%Es3>lqjp{ZnIQ|NRWzs?fqi%QGOh?+WQ*ugJK3ViB*;LoSY-5n zS%6g%0cD&ghPja5Vz*)g5v%fFH1hQs$}6>CjWt#5v^=RzoJreI^!i#emOPZQ2K`a| zC3NdBMAbTcS4Bb{N$)+7y$9ovh)Zle{xM;BEO|wWt$WExH4!EyLo-K*5vA9#!F)D3 zcShR=7pD5dZ>dXA>exk`5MlDm%udSGR4fS`vQhZ< z1zn*s2dowt8~3|lWILwkLOu!$Y>F&VT$GIDi-sv?3YQpH^Z0{fjocJwEzxYi3a)gR z0ickgNF{<;SwFF6Q8W&oi#k^wdpsa4frx99fin`Oh7OY0zf%jI=+~I@YRK0@W~Jb< zwsLM;2y)?FqoypKkGN(+lp;v%!;}{VhsFlA2HEryKxxnFhC_A9P=z#TBlDZMbT^FK zGifx7GsTKW?I%=y^+~Xj(g9*nM1iQ95X*(QZxAtb!W*GuXRRV5*qWHJ$3#|ptwd<= zUV06mh1QSVWg~Dz>iW`?T>P9Sk*nJ3txS*g2dPBTN$@E36VZrj=#@;QxhSZ>MKc`| zutP>T?bd6SosZr>BDH{j`E=H+DZP^j6LrMy5FJqnB;;s1o7HN&A^7#6RH8aUzrhtI zIi0$Mx%vfA@Q(FO3O2b+KG4M$Q~3y*M>3D5m8%TEmrx09u2h6B>VUPd1_~p|CaR(eDekgRHgtiGzFly-QB_FZLaT49?z$kKST2> zxlK7=Z18?SFL!3i_18Cfh05EC_zy#a79Kqe1h+5B7IN#p*{(yXhf_Jc0~Z$;#IWUs zbWdjx02W1n?@ts5ZpIe-35X%)p_8jUSICc`hI9MxK@r(WoI@iX5;cT(j?i;W*yF5O z?!DgPdsjrdfAA|CSOd`)eAJ9${`N2G zyI>+ylR4(T{pa9VGA*yy%^${&zKaJe(cci+5AL_8@Nc7g+x~yKvKgb5 zKf7sn|M`K3p!(TWZF9`8!~lrb^?D2edv(2TULK&J_3YGs55Ii0{Pqs_?e5z<=zaS8 zU-CDrDbaH$?^Bvzd9)FQE6lvOxK@Z8zNr1h7O!&1(+-9GK`b5s!hVJAUI(hR?COVB zCI8TMA?a=SHBDX%Zlr#Zp+AGv2-#tdyx~%u$*tkR$~*<<+`!2s>0GJtoz5%+_`9Qe=^Z}f2q}R)ST)%$ei4q7s(uF8 z2V#vVxoXe!Rzlp=N>N6aj9FF^2V=W`rec<=m%?uH`N>0Gd-_#wJ=isd1POkRA%8PK zJx|2E){Gf_BoUSF>NgWxWmg(Lj*KKL{!MiR4|NPcOZkW@0=UtULmSJ-?Ga5w6-p(s z;Jj&+6Tv_xt;!H_x^xs_hUW=Wg*LN5=IU!$XlfM0g(mwei*g34gccJxLnk18>i&n7 zLSe56TqW=TL;i$O1wE6j6Z{!QUWkR-`_9NH4G}@coI?VDf=Ohukhp?G1 z%otTZqYO-;MF+J^jDTv!Q6>oFvPJH!YXTELNyh_Vh~UgdgOw;-Gc9alI9PV%B+9U9 zMASfND4chEq~>%?(wHYo7>uF$i29;#MhS3-wn>87LasOT5PY1g2 ztl$=C9Q-{LToB%;;zCPS$`nJYd z;tGMFPfOpiekrYYRu!V(Wm3&;ym9+fySfCY>c&Rk8smjJWJlqaRVVlglWZJaRkv+= z8;R95hP1pvGqJ-~mM86N|AsKa{WJ1eX5@a;5A|(;zx^d{^jOx>yhzE{=RIM6n4Y8~ zqwNUwIq|E$h~F!bCMm*0uloEL*f`5TY_mB4jx2)qZ8 zCT-$!p3V*FG>LOtL$Knq^d47g&Yw0UJ3%Gqg3y7=gOw%Jlq?F=;$6VMKAgKM1*O%X zaR)Z_nb<6Q-MNe;8%_}q%u@cb>x&3B_3|3ty?oYxT2D*g-YBaV{-8LJ_E5!E9S7A%5bg1qgHfp#Xr5pS1o>G8f=Ztv$)B8r1E zWep?mo(_4KHY#!khZ|o;LWj2)^W_&JrlbJ8+(=w751TA|S4_ERy*wQF)fBeV&uEpj z9z7$Dd1yv?o=t(GWJ`PE7^>YQU z6SicPMbfsebgcd80QDK5+A#s<8yTaxg(5m!LcM*7=L`>5v7aym%kJxEFRnH&vb|=6 ze&N-1#j<-oeEq&t0FQ!(%4{geDUvO=(HLdvf3%o!sdvb)dAT<{+jw?Fsdrs;=8lr( z<9QNOg4dU~W_tO?&8jCtMTzmQE-g4TxMPPXT9&X=L*z=!|$Ip?fQ>>>kIOmd` zvxs(HrOnff!DJ#9VwQ`1E`qor+b5^b?Afd;tO#^pNlgWJ&A^Q(blk}0hg6-2eZTKX z81OYJE#j1c7~6DrgKX8N<}m5RehLLK6jtfH2V$alQ5qa`$l$L}Ad_EN{8V9qlySb& z>eZ1_-9hj1&D_zc9NiNF-!9+ve^RGm9p-FQve_D*GuV~djn6pjh2gJZ0>LL3pT_XW zI;g22KugNz1rs3n*CZ@uELh6VvSNLc1gzH!JIch|{$FQo!vq)0vWaGieroFJSmW@6 z{UsZoqZw~w8ix&UiBgV0gTLWmq-W3JyFkx~djdgWO#_1_N|8u3g^XzRG(`wD;nUZj z_OlF2V2JAVQc5S8UI9svZc~g@G!onkm7$k_aMt7j zBpls8hX{XYNqgcXrmz+w=7Lkb5{p4vsq5(3P;X5_scYVLq^OERxEg|>kzE*u7Ip>J5|>hh-HHzE zsfh6}8>}y~nWGM$qOIuUNBfBpQSQje!RD`zQh{z68QbwfNMPg^kmJy`gT#$XU#w(F z5_ss>C$#E7y(Ff5jTv5(0?4wvU|hrD6x)WEH3qO`3%7cu>`n&hnSroIOumOMqRc_u zk>2pQaKwGBJgKw=?LSzfqrlXx%y!k6X&ZOJ*D#jALeX{imYZ-BEHSwwxnGi}AyEV| zq9_D)`RJjEoD8XezCS$nj=e#s4E$t6M%|*?$mELY@EkO_=#=t^8jdEm^u|H?G2ldA zQ!utNOb|t+BnpNzK?y|?K<04HnHWbzQZ6W;GD$dv{D^2siY^IZgqF7Jrp6IO5Wl*) z`LE!=q*N7%X_>_DkMi&y2p%5Z5i9JiL9UuVl*LPz>YVvnWWfhXr`7P$cKTcFhXhB< z7E(!U7vm|fjKVYYP5c)e{MF0gxxE0parLbBFFnT2aoKkZfy}EKJcH47=1UeczYmTB z_qSVah*;9HL3KJStDKEWi7uef&~OTies{C03y6AI5L*IB(~dZzS7K z*`I}1f5bQ$;%nnl-q}o62SuJAX&mzK&{cGvtzn${=^GHn$1QB=Fb{EXd=vt3A(7b6y(29MmJq7jFFn!nz$)a0={ z08TB8aPiJ!iAv+`_$6DVu-(U`k7kDxahV-h0sA>Nd_x{l8APQvbjhX#IP!WsGO@C- z<46F;Vm81;oC@}sl^G8>MP%=&P&g4jB}{lhDIYzVcq4P4g~>-rr`#|8jxotfT*hR% zK#sy_Mq{>+PR(Hr#R?7$Z0(&3!mo)1c1Nz=Az6lO9iiAjb&=nKuJc{)6-X(D5p(X2 z*338}P^?nnmH4#HW@mAb$}s2f%R_1}BNS9w|3J;kzi$<0L>I+F(2}=CTF`C; zlwOMBT#!ME5|b|2sXlPE$*tVTF5Wq^Rf4;!Ok|*{_w6X8`v$tp7<&?Oh5z)rRNw#XbX!ImJ6s2rCg zb~MhhFA0Sa=RlSzbZC%>CmDvMDKRTM_LP_!4d!V@hQd}-pY{Vtc}w@=@-5o>e;maF zPtrWt3iUjyC5dH`N;fek_ET0@8XP%oAn$GDFs}MRj1gj8?xm)kPmEv4)tB3OD!oiB zBeQ?C{oHKyX*bTotkZWE@cmhunPZ-1Kqc40YlEyX9vIB{$oA7R@NQd-1aPM3nZ!8! zgU_M;#%Syxp244A`BrFk^=hOcBR?g-og@Bi{}TMdXZud>kf&$T=A5Sb*c10f=vVuQ zLWE`dSxxO8u58{c+yIIGDP67Z#TTV6Z*#C;?V*-eo>W=;5BId}7k&Y)jo*X7mXUR$ zE|r@OKBLxE<8p?kP8lh*-7Nts7Uq)$6f?=9e(jDLdNwIsxg&hM#9AAA%<^PExy^aB zv?e|Yy>oVwQl(tc%rq67jX?}t2!U_6V^o|zX|3eQC(R1%C#2+2AUx! zLp2U?Ch0zrqLBIw)SWq!D&Zi2%4H=FisW$*I*A5osipnF=?)NDy&{jDVN)t}1~+KH zSz^;8V!B{OfZE$XS1)TZ!lY||;!A5H$S>O#hi|^|GThLB%oWP zqae0so|%yZt*Hc*CJ4)|PBBX(Xc)uiGv0hExGGmrqBoOmA6Fj4Esq%<*#PS8g2vI^ zBng>9k2a2y{u4Ax4&WH2383Y393coTGFN~YaoW$E#`Gg_Q$JPCa4>W-p+pJk|8gI# zr0~eD_D9a(9F`Q-B~yoCtag$bKVv--cDarFL0~O_g2N?J$Em>Rji%x$iq)Wz;1KBo z%NAcQqgBXG5(~A=sFr9NTugERSECx|gPJAsxVp3@?%Q0NFN&D)+qKmws2DlTN&pc@ z#5Nllb}9cZil(|=wq@j8yH#osd zD`S)o9@M~qK9sCCs6C;2SC}4wzh#>m-#orbr?FF15T38=NZ{=j)PX9)Y#Pvv$`n9FGGv zT00*GKMiw1C(YhxVv0|Wru32CiitZ9N5A=3Bw7*m?bmNUm|76_1CjkY1j`PLAE7Hb z>WITL@Z8Zaifg^NyfJ>+QJL`3d2penh>#p4ENj4+TDJzTX&b-8&n4?c?P6T=1r-{O$kz_miT) z^`MWzV=VX9@5b-{&WPj6)?v%|TmHp84tFA`U6LDA#QK~pnSM-co{9xSydxhIoWoYv z^S{Hpmi6r@9EH{v&xcjZ%kgxdolra;0lsn3*>#0i2*wmLa{al5p!6Xu)oKk!jVc`Z zc~-+o?MXbnPLEhkL%-C+JfFB}NCN-w`Su%gczC!YR)s@wV~^NiM{MXl$;`voJ>5-C zaGUjr??<)rX?XTwAPV^t5i#-g_qX}?iJtc_Z;q%-v~GNo)|b!IroJ6@DQFnN`hkL4!r4wDM&jo-ba8db;r zWg_zWbDbnEcK%t*7YXw3Mqt)AVlFdj*X&H~!r6mzxoP zx@Ro}u_D^$_sfPJr#tas_?fMe&Q^28FakM``c>}YH1K2O+eC^ca9n!^=uq<0wD4Hv zT>7L!W_*e(wL@S{Db*xUyd~0^hLM67L-J?G(1S&B2x??M#gP#g_5m`r8C*r&KS_k2 z07PuNY^1kT+HvOz)pn#x2c_eRtU(c4cSu1KwM3f-U~6V0IkO6NhuUNkLS~~zMirkc zK5ivi2>>Er96-EI9*5Pk@P9)%fa@FXm+D z76||;W`QP)67+^uq9*qR7bR^5ck4e-uO|r7IdV z{NUw<{2x9>X_iK2phu4;={*e#C?&Kb$?@o4bHi3^x7KA;Gd*IqvgZM-zHlnXvJd74 zTn8P&6^kDW*=i>JH=@H7+N3Rw45f|~JexsttLn-&wm;32J;Yllz{j9O+|2?Kavd!c zw!<1m%^$UZQ6ZV~QlfCPvP*t$w2JqXS3ypxIC2kS32JZ~%g3Jyz#|tAXNO9ep_au^ zVZi_i0;soSJ^Hh8#JDM>Bv+BPtaWhcbB9Ng4A8`p^w7i-Gi{8esJ@WL63Y;QU`5ZA z8$-%5epoq=75Io*!qGHKUW!mNpHh*fIS7tC(9pt-!|rz&aaCpbAXie?@>e(Cod)^0 zN$*KE7j*Xsl) zC+?%pS2K39C7c)SgacD&lXCd$k`jFe5k>I}nk^hdjI+YL;| z_R*SRG8_w(I4q!!`D8!nQ*hg}G&sok@t;%15{W7cSnNt$c%eTL?$XJRSg zWQlS7Tg~Qd6~ZuUP+cd$p#IjNSkXaBc)?1Jm<=xlu&rok;hp553B0!Ul04c_jtS3@ z$t&jgnX|@)h=N57n#WWB3ywmrOOCzA5ff7tQunFn^)Qs;_dF--H;jXQ>ZyNPMlSBz zgz(!&e&+)@amcvF(LN8K+5ce_RA6quEOC`>0UKXt)M-xqGTc&S>-LgS zc*tkt^Xtqxv(=!5TUdX-;e1wtCE^9xlreNuSyP4+Tou|;4YHR!BVt@JbKzl5l>9Nd zTJp37;Rxmy#G^tApcpAZ4$Dkx_@5cET1F4&QPsQzVQ{`M?Gbgp6L3AD{3@VGOzoG> zeT-?GA_|LH-~GDrnd=@Z*9VMn?!e zHV3n)v^F^D$K(;dXm6I@V<(MLGxKZ=Yp*A&aZ@ojPAp&eDW6Kn&!8k!eT`n=9MZX< z{mPEE`FaVQP|7AVx7; zSbjxr((*%4;gyKoRs1UI=Uj?f0@ zD_E^Dza@-NAT)}Rj`+A;X8PIBDAl9zG!-yRzM^Up!Hh({6s(a`_Dy~@iQ4Oh%XqeXRvr%L30c8eu zA56-4tVC9DvM>@Owv5v(T|>@uFH%j(R)tjAVf3W{xw@(E9*UG$2DT9P zT98gkJ)Qtb?J}~|IG-#uV0bqilCL32Z@ET&6PSWCBVmB3bxo4{InlSumcj($5k8A~XkCgb*!^h1DMg+${kh~D|z6oe~pc(a4{EhGNh-#y5r(e2JkVoFuwwod=WVY&Ik z0KNBt1Jlo?kfDc!{zd%Hm;GZQlb0$}x~wQd44AUA@z0)ek@Noq2fJwn>BezbwFOyXm%_ zcwXl}ej%YZ$;%>R;MR^%$8B>v4z>58x#PdC$f&Ki&PTp)&->}Tyu4nD2oOGhJcP~K zbvGxw4S%@Jvaz)^^JLg_NA16_>Ax@dSks&ap}H19WJA}2up-J)_ujuCzUh$<0rvKT z=Z&B81v6fLS99IPpV3Vc$1ZB1*jQn$S*Z14AH9UNOd3;C1+kWCIE7g@d$QoK-6Q-ssFI?*vVU9=?G&#C)s;IejcmJ$=rV}=;Z zI0hbzwZm4=gcr45m!|U@Re{)ql}p@eY&21-WyTUaYFs@1K+MFW&6MwFry0hV^NAIk z@z|oMnnv3wo+4w3)xM4lkTg7it#2@BaWOCQM@%ab|3r{6ONO%If+;F?OttYMKu%10 zk2v`zLID7l=ZQl?Ss|)kRBWZ`^Q4AgXO3qqNm@2R}nxs@kVY7JKl;hCEm1yePF=vc>CG-~D<|rx# z36k+B#6oqTA@0El|CHzqA4Mj>rxc<6kbryfnnaF?E_V$w&U`BqQI%+|+!slp`F5SSuI?2EJ_&1Co)rviLX`|ExP2 zwop3BedG~#qfh_|`JC8fznei&s%I6eU!UH9$K<*}B}~iOis))SSfBt?BSlV`YS&^k zN2z}}8a|7{F)%XU&f_tglYG%@vvakDM9~=FhpYlt!H;~lqDYTV)un<{3(>M-f+~aM zgO>;=#Gdki`5t;J8Yg9)hCya;AT}%-5SPqjYzxzZ6V#0F(Q<(xCZcRHUR_A5Ew2`7 zfK0=4f~xj~j8Wb+o*pc!h+D2QTlD$66LW5s z{OmCE_4w_r&hCHwZ{zDj1os5xuD4vzifM)7^`BkGh!^A9o@aZHOTR2`1OG_&bKGsO zC#bM%&EMnJe|+k0_SIBh!!t`iH+H=+Jq)LN`jti=KC+%8E*t*4e9m->?Rh!K;x3ES zeoPP9fqHvBaeS&8`7)gR**CD@{nPfrr$-NF#a}|BvY$z2T*BZNPrGiu#H@Ii>>qz? zi+88Y5keJT6+Mq%kwsp(hW+_iWGck8+`hFf%XE3D_Lpsf@$yh|LVxL=!1bI-wt2wL zJIFci;4dW)|IWd6$hrS7|JK2UxYLp%2ZFgKv(p1VfG$+e*PyewS@~%fb7`9?Fa7#6 zi}DWRrXZeE>vZZL#F3KlZIJ~)7(*C~s$S{21qRHhpc;>10bwSe6odKb5+&GwKg?A` zNwF~dYHZFB_%y0nrO;}bfF^^-pda{jBZV}8ejW>D8#{Qbf}%b=${gIRqBtA2fmG;Y zPq{C_Z+~F^^}L_HKY!KJ{J{ddDA80sGqLeU9QkJy0AxbI+CiPG#^g3F6+9cjL&Sm= z12@5^6Qwb4C!x2e{r_mXr?|@B{%hdBw6k{RWZSlF*JPVhO-*(?+qUh=wrz8!nmj#w z?&tMC=(yAG{#Ha(F-yL-yj%(HNb0Ne-n54?pHM+xZ~i865;pmr{EFRd51(^S*O0l> z$n*tfwI0t|yFkbI`98z%r~>bIGPdnwU+FaOa$E0mrk5Ezr@OJ6h`(15X}z7&Ovah-ym7rZAGi52kOEi|=l=D?+3oVMXrT1f%>5#Mb&}xyD3rbXPpt1ZHiP5ep^TMj zwJxrotZAp21ByIt1ZT55<{m7^{oaGWb76UWU)fw)j8m=7ZqCzZQ0Jy$uFCgMnooKU zho%Vx^~(?e-1)&HAgp1dVj&C_+mQhx^;!8>$H*zEvG{a=wZ%AtXNc+$F)ubo+z5Kl zKzphVubSJK57khTpzjEr7s@5@7-DVfby$dlAixXJ&HJbihS3*9T9SH~Dnin~q2&>d;Oh{) z*}7cfkrvDV$Q6@&awN3jM^wffk?}rrVKNfZusy?R8LCbc;=EW#cL$~-Dezb!#`;4D zCX@uG0VA2y+Q{6ap{eQIW#QqLmsOs}1ENk2GZpSnbAR8P*LI zi}ZkDm7H_1E0!3@7@?vv4-#x^9I`{z7#naK9%udF7s-{XWVEjZin+vessYl)ds@PN zi4ciWd`Zz%?rS`=9App}NOUyLP-je4hLCjD@x(nqjWLGW5nKeALQL78NMOA}#4Kf& zRJ`i$+Yo^UNmo`Xj6BrLkOD=7pjJpevPJE)85}${gksWVF6RSrwnV16P59UlcECs) zF)OwPnXNbuJC8;)=|%{ZGEF#~R#^99myA1%pA{R@QhZfgESc$iFRT@p=VO3cSSyT~ z&ssfU2(+z8WC=UMHmoW7oScl|iG~E%tsy=p%!G7UJ`D#2Kx{+7GZL?xIm!e2+BGRb z6`=%>%$+WZZeP2oWnQc2ugk71FQKBE5F;jWy4J}Wq153gL8}2wPEzE+4We;p+x5zj zj9rtE1IQBBAk*2rOXVZ^?HvrS@~jE(ZK2M`deE0Xfn)J5V5|cB9tLbp$n)=x^bF=~ zkv%#(X10C&{S#5pJ>8PB&2!NT^`N*e2KG5zL&4TV-wr8o>t>~ceSxO?^`c7PaY@|^ zrlQYquKY4{-a5qX<_l4R9s~COX087{gGK^`@7aY1|1n)po=iRO2tOXb{+;YA(g4kIJ7&p$8}XKktQSLlJRqE<#@KXFp!LI?o-2w}aYur-%Q% z-_PEs)P093!Th&eeTxwHl_~B02ly3I_q)b#5YOKA_vTFknA?cw?GuoiQ`gn?sh{wj zI=Cy~<@b?Q>P-*%0`kj;o=2$RP;5F`x613W8!TiE`)BvxuEja=mhE6OcQ3y_-F&Z{ zzIKFI=kEKV&GY8V)8NR7c)@R=?bTVc8}ahVx9ll0|6^90J?D-g2f^tML-}~|1KYIm6oPD_dm$7t zSZa`6&OtxMY=auZB*-6MHH~qx2_tiubu%Vi69b!E^33PKzmSE|N@dUy zS<|5+45mD_h)-p0sQm7V8|1beGN?I_hGo`d$y(_m<;;;RYlaPT*;-gmw9v-klJ7*- zo-u%8=YEVgB|%^Owu7ky4wGc;+Xz-hJ=l&7F2G%v`uT37>f{ha zNK$^EJ5!9_(^-KQ7Hc+L22h2Hx(C`~#p=h869DFk;oSL1;VcyP1S-P&d75W}?T(!| zr;s|#$N9Cevt8rWlV98l*+s;w7_?wmsJd1dty?6jx|L#p5l5U*G(i*HYK$53_@>xB zbh6&_dsvlMDmwuZdYGjSEE_=gLK5_ZEx3+3j?huZxj*oVY6u<2JmPoeZGAwQ(R@k~ zSSkwx>AA>63An7;G8)`XrxTf=$Ax7tM9kXtIx;6|3Uilx(%?QmFF}Uu9NU>o9PA-SJ&> za$?bIj`=$(ezO_s)c1<((A__N7#Xb?zTuCdFF3ps%jsK&V*S*n`lWr$4=1hrRbyHl z)_2QochTVQjwJD~T&J|urh8UB6yCSLMDLf(F3)@F0v@a^KOj3xjeURfrTj=f*tuo- zafYw0?7+%$lHD^Py5G>k@=|N&RAwyw1g&1Q3B+FWiEag&E}N=PGaxK8%wxfC zA~ZC+_wQ5eEub521)Rq*jv#uiA;q|qVy za638Bmf&cSmD-wF3q1mV=O$#bpAFGq6>BQz5vo365>QvfBJ+$A#_3Wgx~-8KYlTU+ zNQKEP+L%@}Af8Qx{N?_fy!{IzrVofaB1Bz$V62%PQ=L#o^?OJH-LJY|%NhzU=I$j+<@7meWRzgiCt zH^sx$rGorFn^#z)3Lv@cTf8uo?ESfKQv-)x=qBb$Fg$POgl2t)~gs`z}a=+Eh=!UQ_Jct03JzZAu>{-&69;f8Pzd z@4n;v*?&`)RKmR=o*w*kdp{IA+9A+~@`lpkk~8?jH7wj{`*5LxoS4Tq^CQdc z=9Il0MrX=5tica5oVIN!=JQK^^aqcSZ7sL&)aTezDdtzf z9CFH~;A$?~N|w>LYRcYa3ZX#vh)u@us6890EN6O*aW+d@t`_Y0`sD|%I^Aj&h?pIIRY=mFkgBc)j~MMa5^a(O6#;U zRh=9|^YU!(Ta08I5%+M_!`Nv&wXwovIVd{?&}o{=i;S>2TAPF-O$f;wg=SF~lG7?& zvsfjP((hF#Pv(9yxFXSceHNN-3_cs$dTT}wR_3L5wSua#>_7^l4SuvH+Tihl6ftr- ziy6^%@`^D67$kbpw7IISzlHU9?tN(G#y?55PCddDk!WHjG#IfO31omsLibb2z|Q(1 z*%Li9_OdEB{30^eS>t|wEj?8$N7@3YL$&~;Llp@vnxSBLI%eGF00a(qOvMZwVZOG- zHE2FN`?Uh{((%0nDsGqP`dn~jSv!NX+gB9<(jbrX4|FV-iHF# z0t6=N7)89QGTFQ@9 z?QMr!AS2K6RW}yA(Crv{B5{-Mh?`Td!qgFLI44lnEzCLij#HJBpldX9wW{7TkDQvi z%a`@aa;Lh=C*p5Fb8+4S`?U&_{XN&a~*;QuS{@n@M*vE zHyf(lMj-FtJ$7Qe|DBmUGOYW-FMj#fUF;Rd(+fTy3EWSy3(uuI?7lkT0{%Tf?ykqs z417K?{~b2Wkp0({eCg_Y>*CM6-Qgsr9sqAtGyei#&7NyPmAjuGySqc^SpQIZFKvj+ zg%Wx2X!QHA{!Nb8-MAxby=hqcuHw&U@N&?|{j6|Y#NAm@+;8v&@2GYdBJb^9xXfXb zpDgHhPj8z^X*}mUIKf8sSZg|e%}`aA>k~Cf?0Z$qx*+^=C@e*ApKAT!7ifdAiVN<$nmhNMokpWqG(Sd7IaRx#OCdvM?FRQ1K8lWn=vD zLXEvTw6{ukgR{)s*wQxq-C@57{F;4Qy~NX$p=`)UkMdE|G7u`rQMg*TiFJ(G#WRg<)M8h-#+|-(ypdn z7K5AV^}iUk0U0iob} zurdM$Lw{h&F4CRAyiW*Feu_y=curD!0Uc|+fphy1&l%nxN2MQ4?c{r;h(;tC5=GtJ z3|gmzE`lJ$pa>g4F>sYc+)}@^oSiyZpqg^1n`>FjAn*o5gAQsZ#U#=g`DXwKe=5;G zK-4bAK}7q34s9NHp;SU@u?kWVu`oeX3?cS+Rtr2IHzQfOP(x!>KY)*@UXPqhxUX11 zF2O85bl5JG67?0IS?3&nMU4ho9A1x{u8zAznfGrx*@AVlp;dM`R?sO9T zFB+C;Fuq74sf5VuR^mCbjF<^)kJLJG%s|9U1MK*FgG?}0VquWdPpWEdhD4PpF*Q*P zKnO}w2onlVQ6!@Bd8h_V40A-Nn6;`Di3kI}DNejtxx7v_=QwrLjye+2m3ujg0S%m$ zaUfYp#Eo`w%L$KX%obO95ES4$kBL21^EE;pqS!voQ=OYV!*FGO*Sd+}Y(Jmr29|yk z*0pAIWG48Q8O8fCtWL;gWwT;%(VFpXe;|XNp-y08c@#wZ$0zF6CzT(WS{kRF)h?!WX>J~q{Z`Sp&@$Sk@9wm<0(lqqu_B7`6 z1tPpIr_`QL0ED;+HB9I1XE(v?8)oA-)WRO;YAiHHUKQA$?R@{+tDXCM0F~``TsOa! z#`~hk=N!CW1-w=p4hJ`!Qx`6t(USsq+g4|(($J6ONOfP0Tbs1P2s8e zS_xc6#wvq=EcJ%$bO8AFR|Ct}Qam&dqRU2twonO0L)I{KlqbRtE5x@RRxOcvphSpO z2BaWOH0#ht+L8=|3UJMW3e$+MvBq_`)N~xh3m{7g3$77#t=Dc;dn7;qe7Eusb* z^C8TC%d=C@;bL$XFDO6)u!3+`9x4j2L&uHJ!m#0CTI+{|;+rKA>MI9TEu6OssoF&< zA&Xkec5PLA3RMy)urd+)F%SkjZ_@&~YKUZu$uP6?!b8umCCBt-1tel* zM`R-ZNyBZ8X;QoF0f0ZX9oMjlptz7A!jRT zP`r7FDv+_91E7|SIIAo5F2CMB_0Db{8fCaFcaIc(*%=YMYJb@fG!S@XSj`G#ywCgf zT9uL0JWg4m`i6z`s@?9XrE=wB(>`Us*`z`=dyh~w4$DK2SepZHf6JF@8M2ehb_i`T zYOjQuvt!ZV98d1Cj&M7f7Hc^Iez7!bS6XH^7%+B2747FtR5^KaGPoQD2)-*Cd&?G^4nC0cF=OHAV z!QVJC$%J`2MM-Dklk$m%$AiRNVn8TG19S*Dtm0Bq$EGjdtIl`J#h z<&ru2O)uS6+N)o{)n_2C0nfo0#=OKy`kn|plTYLFkaGx#^9aVe3s~fe{(cfz4kd@! zjNm{j8SE*>jL=_D4|9^sSATdQmV{I}m<+|bcOE>ODDCk2{Xltq$JjC27y#RV0Z;4q??_bRj?grPuG5)RlX# zTjJUK{xW|azm3#Ng#6RL_Flk`rngT&q$w2a2Ge>Ub{kq+JhV%fzkJMp>3PBZSF`ld z{&n^Hc=G$T-B;hm>(ZU*x8kKNw5P7?wz53`OzOi^8a|!tE^a)F_y2aga)C*kQ zY(vz(-BawLRT|edMwMkNz zw7c9>^*zY{ zHl2CSRa}FjF_x@j1!yR!O-t4|$xov3jAqc?!iD%*IvXdgKjJ5Q$rxuEIXfpp7vBiC z&saYhfF6_BnKlNE1p2jg*X$d-RD>(f>#SL*JB9jJ`5RDbKS0~E2jABFN93!|GxtrL z2bs7}B2g_z2`n+1GDI0O*0Vx_6|oN)P0u>EK)gvvr)^O8LWe6-^*Y8=9?X+xKZ`=*Af z>mMhsyMe)t*(4LS0JMx;iADehb_pFWsaF&YehE1jf~Yhd?I~|41R>oE+c{hP6wD8_ zp5#W0Usb`SBUZx(42LPgG#0VehJ>f3Jk>-9L=HBC*l}!}<5<*aw4%ua5X<;Q$awYg zW1707p25SmUqebr$y0*euj>iHJ)r%8GR2m%*e! zt7Zm57>+E)cO7&Bzebrx>~Z?lsEAY1h>k*(aH^)b;xwx~4$Mid(8V^xSI=33+2uHT z>C31X)x=_3&E%#7m)f-#N$-VplycW!){#`35GjPJ(8(kn)Xt@J}>{ zn1IXQByji}9dKjBBBjD4%GhK`B&0nvhTy_lIVAq%7A(-@In(&;78R3CMkI+2GVEVx z+oDITlh;yFDURVMrE2g2HxxFBl3vmMRmHpEi!uf5=8CGaX_SvwRC-6lGwp=ZtiSUE zS!p8wFAI>LiQqwz9$uGFCg{^Veo_*cRkN>=)xN^CmX}lTv9D-pn{$0BID2jXdr>=W zYLV+LNv0`v-W$Vmbc^Q=@=JBxi=$u8cX}7^Phu(5$83VWiItMvFI#tno~i2Euzw4J z4z+!5daTA*T+=?L#f`jg%-WN1;&U)+d)%WC@9DGceP)D(`~9BZ40JzfXG&JR&!JGA zyKmZg@Y#Q-4i+sM@Gmx>(`D%LkGIno;Mc|T@ z*T{K~+IsXokl^G$k49rJm8DCTW~e8qHYEqP`vD*BB0i8gUPG_&iTPnf12L;3do^O# zU;sEuLC?osfR6hR;XzH)R7`}b(Ks?jSv}8yli(7gL)X~yz-neI<5${{aV7}*z0IN3 z#6rYQgm?H$ZNHiV!wm@V_<8A8lW6)YScDdO6Z8uJKHj6(Z$gc~tR=Eeg2jMg!+%<^i~|004U7%Fz}E z`$HiqMa)e>mN7lTou3K|@O@z(daw}DJkQxK5|eI7X}?}nUs6Tnq9JOTApB*)G~J{t zY-fp~uDSdp^QBrkmTp8#C!aMswHe)|z@(vGp)*htUuO-Y6&JU}SLZiJ~oA&5a<5Q<|(Isvej<@wSxjQv=h_BK9l<-VD zI`))Oo}^+e8rSSzY3lq)jMWnIOm0uVR<_IeQM~jctoQN$)VmYoud>szXrd(Yc9bPp z=X|86>R25kd)`{&qrG#`MW6$y6nQip>+;Fa^zUz>ZLLY?XMB_9{)!^EDW;X|b^CS0 z+>?b#Gb+?2fp31X`_+fPABm_2ljRs@b}6PjWdwenyax z50kjz0~oUFPMx(9TEfklU$L0Z31VQxmm^xqVA2HVf~RP30TrHnB;is|cC1(Myn9cxrgwv2cw}u0@WQ=bb6e)8(^cayy?vO2m z=A0ln&W3xYL8Vz*z+=hza>S+*5fs8H z_88g#xFsS>@QQJ=VRMKpA%!rdSoTJ8g)D`tyz{Wp%aJi+GBOJJh^Qp-{m?^NFwk|T z=oA|495uo4DH)$sYZz(1M7quS8muZYWF@+IGTbsYsqL1c8WtGb=rTwhe(^#^e}!BQT`5zN1-0 z=YuHn3VD7?E1N!eJ|8zz*HW?I0950A_S+0DX*<^ zV>)pk*^tfCQ_ekT;1IC-iH1WJ}%WpNe(CWiKwhhS1P-;X87)lvA;uWJ3P1JR(minh0_S^?H26k>(@{1e>2$KRTw9}yKmsy;0X85)(JRp&tNr^-C-AU zSNHd#Zifo9XPwD=)E|iy?3jJuuiY(j`ti2;{i$nLGV+=Q)tUy#eUF=OJnyx05Nu4u{WV{Z)^5;jf>3pC>AH@JqHU+Y#xZ$>*GGN=2OZaO4UL&s#R<7h|S&)=JMX`x7jwnYnL0 z4#7SWOt!|D+#%(=!;kyJS`5L~=ePE41=_<%&dEQ6d zFz!s8Ols763%HSKdxa}0Pmb+w1M413B|ps)9WqzsJ}d*<4R5Z##W&*Xu8H3QBtAt3 z@@uH+u!ayKVhTzWyXOC7!jgroWh>uG)MTLND^VpSohZaXXAKidX*HNcDv>U!N2O)l zQcY?exPTB3Ete3Hvr$6hOJR{^*Jd#yI%y7+(UwTSLY%A`I^wG4s3kn>C9hiGsL`Ws z7!%5`j<>|B#CFA|P@QlHQ)m`M2}Dy>UDSk>Gtp9&mLMlW(hMIUn@D?{fgFIV_IU6N zRK-H14doHCQ9xZPCBYmjyt5VnMdb!?W-0~V+|#KR$osZSyh6md6mKP!(7`44lc2cn zCRJ$|$=@V+(|Jp59zJ9b!MRjDW||MgvwA8;fX>)Qk{b)zIHvPK+R=`|sQEceNIHu+ zGc-i_P&FiuI{O41dOj*BTL|A$vFMTy89SPp3vu%M>GVsB0v2*5BqR=T(9JlNIAH0- z=#VobhQmNt482&*fkyO=vkG_5dq1r&tnWO-iUAIUbf`y|fe}iQAuSF+heF14OH?Ur z<}^j@q^Dyt=7+QfY4+@gAB<;KI;m}t4flBXEvF-DTBWAYLqLRBw9GPUW+mYz()6>K zCiSp7b|e&JsXMc9rIgxHFKTOZ7^U3<&KxBDY*UQd(stz~r?EA7iWukB`_AXQLNCNG z38U#>e>hcJrR7G&4(Sec)H{ex&Df!?iTzfd>89H=)Bi+# zIx$0uO#V~4*JSoM|OxF7)>Q1>~iVTK`gAdUf)yB4Tgp`)}p6j?DZl&BGB zgnvLLPMu!bY!PCAXE^;w%F^X%ok0768rkFb5aFFxL!gz=WIE?`17VRT;pJhf z;I0yA{VJpihuGM^>L6iJP+D5Ow%0T1@dJa&ZjWxMh>;7M2xkP<bt_zhpDK=hchRdS21RkGDp6?V(V_+38@bQWamX8tkxWt+R>HEyXL=i$%ks-p8@&W>_60Or;cp zQ_axIr4)JV31kjoxF{unowsx3afYC?X(V!NEY0!5a6AsIk)JHHONYb`NMz_l9Q(yk z$10xCy7R{Y=Y%^p4{D;ES;8{e%xd_gJLG@7#Kj@bP#lbmvOP!d4!e3N)QTs6{C3^w&BK>dw$h3{@}tN zHaLtgRl%eZNieD<#Y~=FGbGs_P5&Z~s46UD2}3jR`=6Tp>X8{3TS-uSbAB@&_$-cA zWMPf9KJ1E~7;QGO4jfnD~ zV~7*pLU!UmcH3sDK;r1HTc$1S+nF?Xeo1A7?LKK4DdQg&~VWKm005Z z@iC=pl01?m;lFuImnRa1=O%E&%VzNt0@M;_tbzD;kU|96y79sNnfMimpEfG^;;5np z3Xunq6Kf(i?;JryY@~F_vCjo?zIq(e^0*mTG2#M<3|to36A@p~EL8O1coQu|qWMvDkeRZ_O>>P1fB2><4}M2~v24?nf6MEbNPSet)G-rU^G=5;&CyJ8vVbvs|6^al@n zr~Mo9zWp}y`x6m|>8@ke@5V1Q@7Q(x_Ve#8JJMj6WEFq5^yhou^XYpPxbC=(wTE&C zzI*-pXHUG~{xc(Rz}Q$-z~f`xkD~UR8|a`us1t{pV{qA$8!Wqi9Dn_5;X+6o`UUX+ zIkB6%mKM&NzEA(&muV;Lr@gLhZKuyC`p=iTyJ2Skgz0I;+;0c)Ogldk{`D@YN4~8- z=T{HqgXz{X;g9ntm<}igY(%ig|M#Xg&P(5z&*K8~-v^{`@QW4u-+lhw{SI&kGS1;q ze;~_0TGPXd@J=agS>HwU z_*3BXkJl&T=aY8tfU(zlE0&v}i35)*Yv$p_P)7G?iN&n@q${g3PcDULvgN!okFt5L zQ{k$>h<7UWY5h8xL#TmDc^dcr1B9d;SHA%L#wS8WYv=>(7x@mJ2>M zYb7TRhAq<5EOm+0YQyV{yd8`0k~))u*II)wjtYH#LxC+QGPTA$`(eeDeNED~4`uK%=dV=kCL^26B?tGU%X=d5u?@bouH)6R*>iRiBQ4vH zTlOduU=^~P@{Ld}B5F9uCJw3aNP4grMQ0qbIS7mChO>q07gq%yt}HHrtod9)OS%Po zqEslILD2OQESd?l8gwq6s-YPgJWv*NI>-@~W1{;hgEO2CB^4)Pn{Ww~rufMeF>o>? z`320=eTgL2vCF*@(>qsIOw-+B|JAS-l2W>32Tcq!Vrf5zP!OJloO|$ojUo$6RI-oM zF|c7qsYLRxifH5vGA-A_pFkTkB4rAkwkCuK%tv1>N~Q`AtVWVm%ec>!;jB}sZNF*y zZC-|mBaag)T_#h+q06z*Ql3C{@}f^TwS#RWby2^O0zos3UidxCI6|r*c%)pR3<(Qx z3}pl6qFE5M2sCJ>d3&%Fj6UJ8jMC?S6>Fr6?K&m0#1oYRB z1&+|MAr>Q+H0TE#NAM=rFxd_3;8P{h)roR2_=GNEGRV?fd}>oZifFeR4PFlbfDYK% z*6t}|mEy_6q(j7XT_XD;n5uwAMeDkGOOe9S=;6@DR3)gj&cO3*YeSQQFoYt~ClQ!aQio7Y0s~)&7U*Lukg{l<^ZD$J*xFEbmkBxC zJcIVwfrUpV7CVMb6g}7^WxW$X_HemOqJ;;IC_3~BG z(|-D7u)dXrp^i$3M|f}9t!!@}>e)njm=EV9t>cgA^Vtkww8+h%8&B2>s?9OSs{7IJ zl^wzV?AyMJ{Kp53u3|?+*Kq8%c6#%* zX&_?4VHM-A1k?sWJl2)E`;FRzUq7~fZdYYYKrU8eJdqvBnlqv@%)o2}n{8Q6kNk@G zu7zta5zAy8W4SdoUeT`#gdHLHzMa3422BYK#bj>E8Lt^Ci)EWFYZ@PF!X$su(%hK} za8)MMq%cz{7_CAmVWfI=A2+Qrnb)gcwuWD`Awl~!LqeM$YhfgM%wTdZyF!Xcnm)BQ z!$LcE`4gUzSG!#&Q#$sBR|ZgorD+?#kNYwF<6ihj#{#;miT3^GrFutvCA*tNeN%2S0NWIewlEkc*bc-xf>ABqXa&UI-~%?1qMse$ z_MpSN4VMG4XIMN38VOhqBPJu)+0<4cezl#w!xcf%!e5_ZM;liZ4tJ%Zk?~Qc_S(1Y z;FW4)*g3}1`%(Y<5Rx%;-D>A~xv@2yYuV+O_XEEaplm z2`Z_^<*$>e{a_9ZWi6MT6^$^|9$d{sqZg` zfx|fmfuR>}x|_PEju)9wAMh;wh{pwsY30mMc0ttJTW85y7QDE2bYR&5AAxMs%N*;6 zeQ-(eqOB4xs2!5I5aN;3QIG4LrmPLonTT;x*IqJj`zBq#rA~$Nq)hJF?^jIe|5)22u z5U?285cWcCv^cad!XZNh8#4I5nU>4ip%Cx^%>Ij0&$!}P2##Uj(SDXx-jtx4H!lXiHnJa4QfAEML3^i5$Lu+g=y-LvhE0hQm`>1;&stqc-Qerh|sS4Nl ztI|*fqf%Lkh`RlSk&iu-@jXyky+n(by52ZBK!T&9KCzPQM8muotC-G4wvJOb1visu zq7dHZoK<2R7jwm&0%80WGHLc$!mub_nO8PeC0PVGi9juSbbG0)~ax!8N zL#042$eLB=R2IE3(%OX{AZ9KD>c?jg18N_{(uvf{HRU6prHfDk0q~^}(GFCaYHKDm zuL>_h=?bZ8Z`p4#sSCYkGRh-Q!)PXskcxwqv?Hl9hu0_&a`GN*)e`al9XK<_bCg(kV-avB z0Adl0^)*Q%MG^LT)kEQ|pc%u8u?k>fO>r?BE?5B<*=R{JTIi}g81kDr6!j?jYLOC1 zoRQU#1x-3u=y`};CTB91LBt^z*mOB)cr3jG+L>}BsOaFX1d)`e7Pdnay(~2?6H5YH zPYfkpQB1sjWNlOkT%y34ybtC?r;oiDc?%~-{ z{Ktp7u`HP0HDd;fM;5Y95<%pvHL75~V!y4*#mN>djfyBVNtI~!K!Ow{V!-wmzm4&1p)`a zV!$F-*o&!uxb>eEH~!OS@YkZ^zp?B-yhu$j+HoK$^g18+8*F>IefxGtT&KT_{z0$k zA1D0x*$}2Dc_9m>mD^kOwn-TT0zHE_j2@|u{P}WzgJbjob^ec4@BMwBPXcd)R=eb- zPfCAM{Bhnc3~Om0i*mGYTXNK#e(Z1uUeiO=f>)n>uULg%#+6-fd!GKvxIE;!W+{~k zJdP^=;{P1|99UkpY%W56?KXFfPrtGRp$e!!8 zrO)Wwa;-;}mA_9K5MWn-Wg+bC%=i5++gA=pF8>gCKS@ilNW8hL-1$UD;Fwo5Z?TaS z6^w|pzMeZz94D(S)jkbVcM<68bk)$h!j{8?`^WQ}{b2-7-QdO@^y+HddUv+Y(Kf2Ta#w-5+8^4T4(Y?;#Cj0J;Q9v=E^H-IpW zJ7GhM749rj$}Gid!Zg64a^5m%JWzJgIe+Dx8VW(C!*VHZo({u9dNJTqUxt$kP(HGx z6hUz@gZ2v7QVaYITmV*Lhhnz*oXWE^6U~TJb7)?i znM30b43 zK%}B|@1dDm#zeoG_yvO-H;%2Sj43a(2S8*h07y1s%c`Ze$kW!A7Qm*|yZY{3_9tT{ z)2JK&0>T3$HcYDvV^t_cC=1aW&8z8HsdoW|p)B;0oTU>-H04IB+6Y5QF(WJ_rm}yb z%_e-dtFsqXp)o>@pj|l6h$8{AM56pBle{ZbsS_%XV!2-BF6({klBQ*6_RoR7V@Ew1nLu|UawYaZUqbK&f+KZO&Wh+u1WdsVZMa1FCSNQ@4Lo#}s>OmO zY=_cfN1_T~k3_sgE{?sdLS{dlP5qKf{;FAwJ7q&WUEw5j(YTu=VQhXbTc%AZc|TRG zt`VhVI8j{0WY$uR*l84#h0kpy9ZM9{B#rqp`vcKizq17wi!4-59HF+G(iNY$-_+Hs zB*@4Y*|%Un<S1<%&T;Xrhn_w|ypi_Zs4u7{wDSNP)}z|!XT%8q_7%P*ta zh$}yM_6LG<)0mtZdhP+fSZ?lS$Aks^VTeL4CWfdcz@TbZ~7MV=0uk&FJUD8MpZYK;$R;b@R+y^#l7+WnA>Jj>QPy1`&&)W|u z6kIf?@oaRMM7hh>D)&>|%#_+v1@IdR$i=gC{{%kj6$G2I&9^sLT$MF%^J!+1=$_%@ z4tuy_W|ouz3pU0cYD*JyIn`_76>xb#X32UipwNm^0^^A094SupE|#TM@%8`uNs(#5 zN_%nEigi~pF(iewHA2?N@-V6GFd9HPjs>2)dS;I=)uEKw=Bfsi@EZxPqH@0Parb@o zYpr;w7)F)Im|!KF2KskHv#EdubYz9tQd|Bjoq1hJcAnCr+*BBHq#FtHSaG~?2TVg5 zBvF>ep-H|!?NnTxDXZB_(U8Sep%dD0=y`g@Ujp?_UjvWxRop{t#n=gSY!T%{4WF8& zgYcfxUs&m!OvEMYP-UVsC7XV_>kt3g;F!w5z;;`(Eajc3FHPt)v*v==RMz1->NGP@ zJ_}MY^iDr+f#IHl+Vbr-P6+ko;@|k-98hWC+CF>`Tt(*%?QqBV=tsSq@SOeofeN%p zqZB?W85Sozb!e^KJt*+S8a-!tn!uZx`2dAaBC0O`*>Cq}J`1VU+@*U~Ppm#*_ ziKR|6^1CQ*jtF6Edq29SR=0a2sK)1g9-bjYwK5}1oXRI0qc4ABw?Eh1F;TZ_RD%tz z@VNeR{Tk>|6p_=fG0*aLdK@G#fGw5JCK+j{pGASszMN$oozs0|H&@p*m~vMVk0aZw{f6pkU$!wOhWXN(tZL!wOXyAph%={`OdQ4A?6ZcC+K8%b+` zf+QsGnVMNPBu)4nT6OE=g$M1l+Z3$&eFR}RTgdHGc$CPS14uJt5j zql7@Txpfeo%YUrH4n;7E;ceI${1ltOevJOwba^&tKu+|fv>j%~9QJPstqdCUdJeLP z)a7suAr#hxTs&-;ezF?;p?Fm_CAL_@Jb7_Dr@zzvY4FaokwzvH{66uo>} zC?A0cOUHZc1cD2C$|OgRB0?1~e6>vAev93@<{#)9DIHSXk}c?)3QPR`KRZTgX)ie4 z+eMk@LzenvAG^0UJ^0%Q>fWmUo9h~n+mPT%qUmsO+wuMJ>yPN$@255!t$yl+9e(>i z^pA8Iu(!IslWu=}zP*EKF}%Jf-@Z|>`yf5jEl<*Q-vWO8`?4QNo!d_Dbw2pzFU!9x zS>DT()j#Eb5=@NY{S#ah{vi>kt6=Wp-|qLFnV;6bdCBLMw%$iA-vYI(>+5YziH)^2 zV_d-h@K!9_%E|+I@XEMhQ3N=}CHx#LoPXKLT@=CG{R{~PG|Fx+z5&r^as?;BhcX-R zO-^JcgMix+&1?^RCj1|>0Ve#(zPzoC?x-8DZ)_Z#`rn-50%oJZ?CeczpI3w~SQzvA z5CH!d=Dt6iYBNq4sXMOXJ(Sih4)W~yF4q^De;;Q5#t6R-3Lk;@3AnWDjOgdf_zBf- z-Hm%_IkrjZD!f=5c9iGTZkaWD?7G@;b=rt@z$EPRVcdPB^7o*(n=aJTEoFmt{II~! zyU!2UzpKnYGWwoh+t%1P?~|sAJ4LxU7(9*L1xz=Yc=5HfJwcZp(oU3A`}hoh+H+CL zyNJNa*`s`uBkl@~VU4~ScdseQHmFPewR6_D(bM$}9)Qgm7q`vqwmI)&x65C?^L)#y zCx)wZo1WoW1EPj@I;2aeWhm;9VbaAzqRd#@(b0?=X+rJB!9R#AM*-f8COIU&o88WH zzw`az1%+TPQysnWdg|t2bG0usEp?oivQ0MJW4^{!*C^h#DV0}_J$JI$t>AuHF89SO zB7kaKFD2vN2NFnIq^@~OWOM0P*vl{#9s7+Cm*n& zI8b86;NY;7*yK}rTqxzJ2henpP4o=do{i>o6JU~OhA85p&7koxO+_L?X7UMWYX;=T zl1Bz0#OZJ=6J6ykXt-8_7R1q0CDPyxmZ~?RRR$5NQiyb6By<%f+%NtNTcXMbYatX( z)T;`}7-m0AAV`xfbzu4zK$gegXv*p5*YlXgt>Clvvh+3PyGvt77h@4?LamVW7IR}u z5Y{G>?~@KMnA^}lRMNqVp>IZc5MzDUmB$Z_!Yd-zgI}R_-7XwrrC{MpOd_!u1zHBx zVp1WnCIe(+s^^FY3?xU!^EH$uz;@5^fwiqY#c8HqNGoDH{P0T&gE(jj`zHyaXz0*S zIBCo>loI-Jid4Ci{Pe09Qo!a&;I`dG(pS0+V*|y{9uzRzK*}r67Dr@ z-guQ;n`88;Yuxxw%@!{ccOT%{H+GrbI>VLiO@8`64Vb$&!VD-8RvscY=QV;-pJ*7n%j6T&d&L@fP! zV)sZGZSAnIo^^YgDhNv#7;hS?p{6G=SvEv1xN$`j4Q5=kSSq~BB}%*AP?;%uYYpiK z)|&-Rt)b`{j3zD0^={A#-zH?7&~`*kKvg5W>af*3!$-d5-U)4t;JmIV5L>98xo* zk!)F#Wm$q_#0Yd@Ko|ZWY+!?3EMQ+PvH=_^m?(A%A$Tl3? z*;VYUMl;f!IY%Cv>_c@O-qUl+#Z%;voRO>xiD03N)!nSOtE=jLp6~Db{d_4R4ADbT z@@Xhk65*{Bx9hJ6H3)HUkS#Qqex={kLpD2UzJDCJnkTI2#;6 z1je#K^)-#rtXNVCLo?5f8{4+0JJR%nX1TXS9(o)VgSv@q42{*Srk>$Ok3&(5K(kEr zt5a-L1Z`O~Cy11Y`vb$<4RKqtm?^?vBg=x*?)+y=e8m~U}ZMtZ9 zW|4Ti+~xeu6JCDem^hmd)hY3Y=0faftAtwp=k%$eJa>e+b(3fC9EufhM(94B*ys;9 zd+!d6Hu&OGXI%WQ;7>QMb7AvMK3r%%HQyr@M@-HMUT#XBd1{~L-3`u%G4q`d3HP3) zmap>R&tK>2;yvPqr)xgVt|+-Vf@$#{)7jHZ$5VWKk81B35^(uAae74)%D~2reVV5f z2a~(hW{mR_#Ap+-@{CpDY}8}p9!7y31*&08T@K8ZWV;#DZz!CYvt#zqgU4(dR$fwu zNFfD9>FBEw?W|?26N4QitYG9M%erTCwnMw!Q_U@I!_)T#qw);LI5)cZf;5gOA8BJ^ zlsuFcyk@a#G1HF4P_ti_v>swwG13yB%zE)4iK<$kz$2AVWW2Y9-Y^tvQO378xj~c( zMa%|mKSzZrsqnODQVJAKW8{!sM*Rqid@?6QT9v4rBbpM~G_-Y1wRRaTv}8gABn~k2 zFc{n*3F96^L1^<-N!r|0XmTQr|{w`%!s7evX5}77ADJY$TD&V+|H3R zpY{PKG3kR1Ot+hOvD%& zQbMf;QVBk0IBdI&DCuwt(%?WqaE>7*qHjq-5mTi1p4jG?x%Y_>0om5}BzVxLp{mAFZjT<-k^`?A#izkKa$U*k7_^EZENu{4D6;24C+(ZwI<`RTpq z_kaKQ`SU;ja}XI=eE<6%0QG?j7cTIPZ+zp29#2Y%-}#;2;d|eEIro)(LYw8|7sR9N zwU1q-%mwm~M_V6he0(VS`baD1qa3-9yA|c50`Dhq!|q?N%8D0Wc!BHJu2KC2%N;%` zF8IH`_{aRG@BKAuu5gt?#}2C{cYUOYyU1ps*BukxvfWxfxHM(so&T-1@&MT$ww)@j3{(2O<`u8$}?CB%~bXc=}qWiBnI5(+Oh zMX3?d5~dwyWieHv35K!gnZ=5_3Jgn!9$Tt5(AFO5M>q}BxqywxnTJsfD4Wl-76&x6 zY)}mm*5}zgj9Cx3gdpev;n&eWt#bRY09KJO5~LK+LgDF=v1HwY0v&|HqoSsff|1I6 z@iNm@*X_h>u_~Lo5H8ULL07>pR936(Kau5c3l^gpCllzoxg5a}}D%KH?r*{@(Koj#&GJ0C0 zkuwOJQ2BsB5+ta(AdNyUc0nQTFZ2Z9R-kJ-HBj^g-5jbt)@!OfjE>PGRSSAb3<{}W z@B=~_v`+|=3yA_2)dR))vGff=*CL1$@E z0Vy;PD}shV#3JZfP%s7@FGn~ve>8@&I$8hZ{d?97>;2vSvX zdwIsyn>RTz=ZUu}-afd@rKA6o8#|kfk0xv^wuw)_#`_;GxNvos4_>~6OmhOS^2|o! zEoXS5xx@$0NVqAvylVNte!v&~b^hV{I|zH8U+Ql1w@Dz&i=2CNU~_wy`nk9H!Px|v zegW+h&o!QQGq7Xdr%R4^$A+g>!E`pkHgN7|VW~!RuXTueftWtQhC0vWT7$c%INS_e zDLh?MQE$zu>~ox|5u3pgm1op#qlG{p+@W@#CT!19P0y&jOsfaZFGnm#iD23+PKGgY z>@fY5!Ue)PP^v`v#4w255Ez!kO^c3_X;Q3AKr{uT%HgEW&FpH56@nOgj=O@*GGUZM zEPJR6A`UsI>|!NSVCj92(FMc2C8>&Pl~ojQ6|Q}>Eg70ABltbidp>XAm_@I{eduD(S`&7u=jwZ{gDixCwP ztMw+z3@uCJDKwPH5<*K-lDW*Ab1OR9)g~JoOBw!6_OULl;7oOzScaE8k zB_CAB{QPaf&LnZzN)DeJ7|Su|Z!0#!vy8$K$L;H!rk0tw!%Sa>)1KMgD_l6Nne}&3 zS2ox>Jz{Tug&P-ln4B#*KUJJ8PiPuPUG>Dvp56B}&AF1%sUXa^IV>&Z($N=@?c$JI zZbUVV=sS(y?3oBjsXcRFv6+?}jWnBu;V9K?sg59ex;8OV7AF^o5s0p)?ISkS$T}hW zg1RzvfKw7#8)BD0C8{Byog<|Ta8|BBj==RKl|Wtfa=q+>TPBk&<;|Oa^I6KqQY20&N7# zFi=KCvJoQ%0})A2LK6{KmzAz05=!P=yGVI@V#InuQb}b9DC?!3C zA_jy~2q{>Z1r~!cikK22X^NQ8kU2>}TY_*3tL`gN`Ex7pNy=unQqm9thP-J}fF#lY zRp>L!+zXN`NI_7@NYoM`HOfn(@@OPF=xlip0VxNJR)l#%jwHQr(XzmcfJ&Aia(tfFSepFa=N&gmxGtYS1__ zAf!bD{TURtMMO&sJwgc*7U>oEEb@sI@+J3d6LBa%KxfdYr%{?BNnDc!Vk097jfe(B zcGRg9*Okq=EmOplgjy%&}gf zB|3nQ60HR!$si*NOOOI51X2V{QaP6EKnaQJ4AQO;vV;)8C5me{6#;K4F9Y=ymz13+jisuO5yPK42~h`GB95QWkZVs};-T zg0^Y!4{?@+_;};t$GKbi@aN)h_{i7$k^WFO_y40w9cHjA6HxrA@H|<`?uV@dGkSJ@NpNGl8UBn_~l>zR}hxC$|$mdY=!+2Gv8yp&o7+R1bgcN3Dbp+72I!5kAr=_>dFpqtAb` zD{DHP^7+qyp09rOt32_<6F-%xAi&|>L;klHU*vcH$N!1dopOIudML$gx$@=lWK$EgNyWT$~p0U-Z|A=8I|<2H<07&=p)ZL ze~ZF6`Xp$UjwW<$-FSxT>A>dEoOkzO|J>UY((wFr%F!&ab!&mWGUlyz#@J2p@r>1S z#5pH9ee#Sl-Q!&G6gR^ers)`0jx7?#M_jBJH$6o;B5XRevn-=vZ&aY{KsubWQh`!d zU<$B?TCJ#*At*=T6gRzusz<94R(EK|gmRJ3S!0j$9zTnem7pvV$t_4|G`SVJG$ll+ z`i^KcPJ2dDBUNCP99s1BzQjm_Sw(uS@G{Ve6-o^x3c?wP8uXx%@YJ5oHreERdlMT7<}QS(g+>M2yyP`Vli~2G>k!#4wie<0@JN)<;3UZ;gtocmFiB96*bAbT#Li<%y&ioQ$hL!G?JyG%q(Mbs5NNGP!DU@a z3v>zyx55<#3XSO>Oiby8Mz0&K6OI%zKeU$v290WR6p_Bbnf$v^B4yCKBp**RFeHQ4 z3Lgff2nfG{M_@xhDuEN8T19-Xa9ScQNN8C@vRt)Ww%!Ig|VkDqj?VMK41=)#gt z8-|HusT@`qY9(mNuNfH~cZH%DTa-J+vxyfHLJ!M^Bnw1bGKiiu6wEg?#xz9VP!$T_ z^{o1aFbtr<3;{QB2%os?8kF#S_~AJwy=NxhLNAt_GZwuxq^6*sN`^*KpWcCXz`v}x zcQECq{66RH3CH`Fh-1l}#Ws6euhRcNmh(lyYhC2p<|g0OM{LhJy64W(OlrEeVX}A| zbFyOZ%4O!whpcu#B()`5zUR&XgbUaB>g`?LJn6am>DPI;c#>T&xi_5S;P@udzX`E)aYB?(dcGEL5Q}j?_wI)c9DJ!}{GLD8WDnu11U563qqMbaoAtB~k{O#!{HTYN@CShl&QOLSX`&Yj`^aI5(A|!_z2|`K)8<{#m?<+)9 zBqJzO2Yn*hl4hPLH&*D@unbTqjj{o45`~i4?n%J7nq}+}(qbEf)-zl?rces#v0Z^p zfzBxAL1ScMtX4Q#kvMY?i|mk#X>@?^%w$%J%ypqU>si-uS=$m0X-3->r`96SA#duK~# zJLj3dz2J$1GcH`Z!0T;G@y3T-{O~TbtCwa^7(Kd&) zKl47~#y+cZ#^v+^4ELy>9#L-G!d$q<-Q5$)XG`p1;zB1W=Pehc=H}#0(x_$gXq(M* zdnDCy_WGDqM#2V+$4l;wD&kVGmpY<{#bOsB8aArPqBx^cj&xK}Z$KFnrYY&Ff_fQQ z6cMFI)LOA9B!ySZjmL%!T<@rRgQ#0{FbLffsu6((856}Jm}p2U<#vNnNmz7rbwRBa zv5i;@GKqYmHw!vjvJz)_WigGwRsuN`C}WWAkVh0YASs{=sOXWxWsXkjk;0JZF;!%a zLQtWH2za#gG%V4Sv_4WG7?PwC0uvl0nfXUjB7)43Cz07fGWa}sh!GK023E7eu7xu# z1;R+^Bu;_Xfv9B`pJGp^1X}dD9YthFH7en~Knzjh|lYpreU4T+12C){X2$WQaDDXX~b)~XTF)!x2 zo;ErPm3dqSN!tgE%M(mnIK1~1O_3oFrp$3k(PS4N>Co5Btays5$mEyN$)Zo z9KGgqNeB+2mUJmmM8i-EOz6?N%FivWKnQ|xs8%9vq(@?~gdmY3=H^GCFu*;jDAIbJ zCG*c{fPQcol_w0e328<4>h-ymRk3z0q#TP333QSOpR%=AW?Q;f8XdA@(5O6|^D?)~ zX6&n>7f|{@vL()Xlu8syX8?Vjh)EI$iPC{qNVM?TWwwq9uyTlyqoiJmym8cmkUS}= z%+yHa=lYNUiz*T+YJ?UUzArsGT9l4CFVQ=cSG05pZLm5ZQr^t>Qc{M@5lMx{iX0o2 zDj{`dqa`F5gNOENkvQ$NM$m>He{H)lDTy>2#HV;l0@s= zoR~M!iNPjj_YQga)z=7aV0U-#r?R=#TC=ye$Mx&i+1lD-xmwZn-9!AUPlybDLJQx= zJ_`AX*B^}%%18cvKZf{-;PgQBdDPwV5pV0`@xzatE%IahtB;Ob@%68N{U_FT_{0AE z#b5jdFTVKV$A0enLftS7eB~=&`H^Cf5Q5FkO`d)BS-$+`FZ0DOevzl2e)`7}Hiu#0 z5B}f}I6gjpNX$_WejhKr^b(){{O8%)+WM*d{LVREeDOv8@-P4LqbS}3vFTCHloXQB zeD*UxRM7L@^UBMw@YdUJeI!Q7kJ|bk;aNQ_COvlh<19Z9I^_TWAOJ~3K~%0sAnQLA z-v03aDLDh&&F-bYz2Em%e|^$mA0tHV! zIh*q-x8;f(H_w<{+~>j_gAx`lD7yX(6_)t(n-mL47cbF=TL|+6lECT2a7tp*Z*k%l zbahYa5<44$#Y9u25lWV<`UbU?#R}~WQk0-Isu@USL2@;Et7eB8$=4_wNM)ckhS&vy zED6ZWr0P9=(zKHpzkyPf+y+$l}gZEejHWD98E#C#CsqLK_B#54~xh`B4e>;cIEd&BpBIxp%(_70M~=INEE8c=W}mbR9EEV9y(NM5ICfkXaUJ&=X}WU2auXB zf>yciTLNAP`sh#!WJsVC!V84epbC^sbe$j-0_8K4y-XoHutY%g9b(;#t%D|X5m^g_ zA26lD5VG?s=5@3PEv=BK!R6x{^13X@8rda864{-iJT{MRQ99y8N3}G#VucY?beU(G z(Fnv4NMnhi#)}3S)~$(E-ftm1G7gYB+R|q?yblyQq5T4PvV~}StePW2!EtiLz9sHd z6sHZn5%hC~Gd;4ILgR6*WMxP6qdSCdU{;KfH!WSX^h<{=N0hto!D5U4XvBwY$5B$a zbcAn!rN+*`%h9tN?1`H1jumyh$^70CT1Mopo@Z6b@NUW5Zv`%%ulR1T*sD7n-hGMw z=8|Pu^TZ8JapX8FmRwwT-n{x0ci(u6YA5kuymg&B{vA%!1@5ev zhkK)rDx^Psa^bLIarGtiYbUr%l5=ldrrjAhzc?n0Y6>*-i(_=7*b?U$nJyClS70G8_TTu$kvPY^hDlO=%0#QXeA(37ob=C{|LXo5G~qIw~0nMS(}sR*t9y+tQ$$L?Ik;Gq+CEBC+%d5y7R% z*lAobW2`rMS2S$MGged0#?g|tI7Ex{EJQ-afbM(fvM|w{U$WWOoVgks2PSsGma2H` zodsS?_IZ``=2JW|eVKCB68&@ByYnWy#RkRbGIyUY+4#Y0>~HMw`l99Z$g+ypsoy_D zbDp=yH!!cyIK0|2eSgXApSecM8Bbju^Aaz^-Ak+vw^_`3&V=R4>N2a{mpCz>rO=XL zZ=3N|$*jA;>Fbe$FIVg{;kze-C^|OAS2*WyQ|{g6=h_9$2WKpA?sNIc3GW}?B3=_* z+!_-WnqxghQgXJcsdS67HM_=fGAPE=gb|4%6zFEg%qYZUMZcObQk#^Ap546-Zk;X} zZ75>ta8pYmm)MnMDio)qft^K9Ybxpxsf?kufmA3o7P--(eMxF8y{%EM!*4iDA?Z^` z*G^ce$h6i7kvGTQNc3<@KPX&SV1@~WbX3YC28|>kM8q#NY7!tBk^w0P$jc3cDG@6} zvf$f@vLG-tBqq_K#Xyh(Ee#0)L(LE}L&!;q6%sE%c?D^pQJRnhR!Yu924!m%bKI-Z zw0b}rgXr4ahL&vJMn%0QnTX$AKI(F)}Ny`GwS z59a>w$KypVEwJR*iHNzCl3)?3BNU40C346Xc#aiC?eS<9QBnH*WF0DnG7_Og4jne@ zG9RG;j~aC5bf^y5>zsi#3D;`0?h#UuhH?!Pjk%FiOE3|YG)5_e$P?nBSBz{zC~#I& zI6>4sQD(@k5)v6xex7v!S%FY$otqbU9nn$}g2bqROahriE=N!aA@e9$h}>2r)PRZx zts*XJtO;b<*XJSv;gKT8vqDVV`tT0l|K2N(@Crcfc?V ztX8WB&YQ=@seh`OP(I|;`o!BGc3VAgcRlRv`lO3^RFsnPAwliouMrQTU7y6i5;8-w zzy9^F|HPsB4+F>l?(hDN-}}AadmutR0zqGkShsH8;xnK94Ey{0Kb7Nn>7|$WlmGos zP*Q&MoPFpqbpDXeHU}GWT_OF!x^>G47R4)u`Er& zC~3}49Oa-m8O^ygGxRl_>o#aN2CC=@W{ItK(M_Tmb$A&loyHCdZ=f7JV(HLhFs`LD zlG-?e8)4#rRgP0eSYuIsp!a2VB@GH)L~seM2h>Wj3=$;@taPZArLPJUF>@o!%p+AX zvlj=^V@m^CtU=%s<)HV9!b&;;MdwL6;|Yv1NE7f?4l8dZhCGmU(NM~sCKilEW>g__k%}4;z7&{K5EF&yBwYw3VF>HO zC52)L8Z8u3#N5OfH6lV%(0hR~0(wKdzn0T$ay_i$d*pE;C0Lnb+`s$fM1q6hd1DpNnPM z5YeSX1dv7nEvyQ#AX6S325qp*gq)NFDUrSfW03glFn5YUd9*TlpOIP?O~F(fdOIgA zCYUN^-f0j-nMkTd%>$wgC{d#N0jU*Dh@d5=6`YoeN$V)1C9Qh&XpEXWd|8l;BZx>F zAdXiVYqF(@t2xP51l8d6DWnN_8t18f^BEmuAb-k z=?I%6j@nn);dzdp{E(x&CyWljy>dp}J|NsZ&!<!B0%jAt~=$mKUn(p%K)jKqcBeo08@z#>fa>U}+2{W(Qm|fzaxXYQbG;+coJ}ZbJ!F2CDqU(sAyJ!qCSB z!4zl=c#Dq%TII$T1SqZXD@nA0)CYu7$Ue{~OH{da&3BF}7Xjmafz%Go98v`)x2ws% zM`{5=Vr2qnNHN37jVKTi?iGg7pmB0Q4GOQJ_Yx~05wKR~NWKV2qwpcIlH?j-<<~AK zl^rTlfow9_sJH7yNrS==J3%WYRwSYqxsgstWXz3f8U6?}V5$Si?CObqLR&!-p^}oc z(4TimY@cKP@q}jLquxH5ED`+0tG~awi?74R+L1QE6O_zGb)6@Us&EVntnU#{k<=WKDwbk})fOpQlFF8Dd5Y-)6+xB>u|}@efK(De4?4$m!crkephSa; z86GY~W=brzz_=D+K?Fk+BUUR!nj=;@?B{M4><^v=@Ys=#0T8a6#lY z$`n{Rh3yThR75%u1}Q+Byy)^$AsdgZ97QsV z2T8IT=_OJLh8Qqwq z$GS-MF?jqVk-x_sSsxRz9um$T`ksHPfv_kFKJ}?j@s+Q9g%@6UfsLQiYxllz`hy?* zfPeEp|1bR8|Kmm4ckiG_hH;RbRx>tzjWjE&exE8qzgeTZCDv}D%T1c;3CHe?sq>iC z4t~?JRm>69HmkjxjQ0#GZLryvY*YsQK72Up8K;s(F=FR<#iGBceXP=_7P z?%iQ@;T_&z?ZWLPN0&XROKjhLgCAUelAS$Ah!&PxEY9Y*{Uzyc%?EQyarG{r>00g< zyOh1hcQyB(PiQrwDlagkF_lh)MT1c#M@7jw=_pIVFsiA`KzDDB+1p{&ZXi@c#|};$ z;-bO?7}-q}BZiHEftHEfXDK8_ZHaM2VG1glD9T7IG=r$vY6p-j;&;?>xk)#17kbzt{B*00Z!T*_y!JzV*O*B5U#;nLLFPR9= zfXRhJc~4|ex<}+AM7e@k1)7zhwgsAj(-x{yF=()%Bd!K|T@t;;$c&_qgM?CW)E+UG z6UN%-HR+Itz4JCwj4F&+F_)InDjwtwiuTjqT$A? z73s9$nA`NTH)v;;7iJy(S0wNL;7u6M*?nuDy5Hmf=k3jYCCLsmzu#G7$;_K~zg5*$ z)!o&5Q)H7OWlEw95A;0#5Az22PF8hQbyFkD<|L5Fycuz$B5r17ocPZ7{l44rE?<6lNH10# zZGD5dnoxB$oogAr@GhS&R_t+&$(L>;P9HEXU*kb{i|6f^xqn?!J-CAS^q9V$BCd5* zC-<0CzsBt2yNoX#uya~*{3S)}j@e&5PyNXf_2L2Myg-Es$5L>q3fOiVN`)N?%32W) zSFoxnS0!!>ifAbNKpbyjyEUWkIi};5N;(#?Vi-a4C2h3??I`pX7r`)A4NJ4lD8jgm zq`pQDo@Bs>C7myb6P1~Gc#d=##8eg9ysA(i@tCog{^dm~up@OBg zJ!O|rLxC8#q$W^R6EFcSEv^kzx`3fY+8!ke=3Rj?3p!)5rw!`A_!s};_Yqq}rIG3( zGE{Vnnyp$P{eZR*%$k+0@F8N2qiaDYgK?e|CDK7rsLY{~g0|OGy+pN%U~A%9(YnY& zTc(Y|mjlBf5V}KGnpLpW^MJn-R z^rv)TA1f~Cn~179hAQIPZA`GN%Nc#6u!UflC1!_HqV8$d1$KGL?z{$lk4e>#7Dv2X zZj<6Edu~p%^A#@Lyv?MV@L)VAnOo2uB3Jjg*^gMCeo9=t$uKQhzH^7=-Iq8l2Wmg& zBx>4K&1^V_VZs9xNA??h+T3RP)&b&^`&>zT+`0_xHe4Bc%-4RChd6-#+er45tVvn&VnPD6QjkFd@_eit;h?Af{1u$Wvz6$?Cy z$zlhw@0p5-9wesG*ee<*91|Jo`~};Gf%Z($$bw#6P}L>s%%GyA9xQBW>|#kb@dQ@@ zo~bqzXhiZj5ed`5ATdGVNvLRXae*DCXcM>)P{oK!mX%Vd&_nD=L1PMN zrDCLW3z?7+v|>ovHB%IdMoM%NXshUPn4mx!TmaQ3h8oPqrW}MsrXC^s+?XZ<&PyhG z0M(E#qcext-}TG(%^XRgeymEFx_VNDNs#OVAbth3tu;qB8;`$e&x;(W%UE>Huq8 zuD6a2UgjA)Z6eO;3@}akbCp!WXy}B(io_r^dJqJyGH+Gn3y@TRk_Li6*g(>Oeo)j_ zAf#q62^}o5TY;KjRm=j3lgPqlZbgv=sh|}`q5}1$(QDKb0#7NT*y!*lX+`oI5>2!<9Wb!K$vg*3#+O=!E^2#fW$77buCC>TB zPAK^~fb}zgYVmpT>PZ*U=fo`eOl7Vlb z?|=W7v!R|4kk;!p-}~P8D2jsX*RTJRBW)=q-h1yo{@@S(fOp@0_X&|oJ$6g|L(P6E zCO-P;BOX3{NJ=TYrj-1A>)=zO(m(JycpRC0hD)WsfLrw}@9J|RmU_xD_IN+k(`>6p z%eJ<*_}bTgoo{{XTim#DgSxJNWx`cTiH|=1i2wP2`Xm0w|KY#k!SQ`Yvj(@7sH-ud z45)`Ybkh|oZPD9-g%?b9!EByzZicuau^+FP*liY#2HAn0*GlBKJE40g= zv@_4y}v61BTP$RlQAO`#R3Hk`UO+a{+nwi!@vmsB=rIR<$`BYF%YbPH{r zD3f6jOD0~^sDSSxamdt6;T&cH-j8uEuvJYk&f@A8+gpP5n7$-xfv>>14qZu-aj;CR zs{l$-d5B3PR}tzVQ{?-SWFtZ;icAB=nmpOk$^laZ%&_@?;BsqU_KI&>uSLj!_CB}r zc0C{pifF)s6Pi-25u!#oM^h>)1ZxG#NtEp}`&H-ooHv@%d;DOrI7d zVvi9oR8BXz2u9*$KocQG2nwe%9~2>xMv#O+Z@6Eg@mVN~0Yc2F8E`Fp+wB9zYwj35cR$>mL5#Y!!)v1Di@ zh4Lh$D2BigVWmK{nrcfhtOM&HNv5aPTMWYtYoQ^L;=oWOf&k$Sgf+rymhu9r3=3bO zMnHdoKdX_}5ous3S*rrKX&d+HoDd921%~Lby2V7#dVYqf1LY7{xE%^Lqd69IJDTlb zz;rdI#ToUzDZ}Lj?xMh5{DPq#nAOJwbHKrsdyH3xrtJ`6;IuwvzGc|DeaQLs39p0; z&h~a-`Zl|>np0gcs>W>3KSjTCpV_4|tG)mLAOJ~3K~#rljP;1K*Y>#N_IbEJqL=r0 zetCmp{|?6w-{iU1Dt?h3u>AYq;f8FBP)&vjZpy)!rX0l2UqrjOCBT81r;!23U!^<(o z^qKXR5@`q+<#5*J#__hINi(*LVGx#;C{X|TfAwGf{-E-#c}gYGSC}-=76Dyo6fH4q zp5M zv95{q%#LPM^*|vC^bqJPO9~hCjbSVX)}w++mndvWhhnQJnBP2R`O-ei3qcppS<+(%fBWBYa^;kRv1jcE&SsZ+T`c(V zoyht47O$LY(#K<#;uoAvYCbv|F&jm;Z;qM0aGRs}JRd#?2-(pLHL9*CAM`Aq%TVGQ z_s5h5iZ4B&JT2+QySN8EXInd%q)}1gFJ`Q-7K~^a2}M;GG-rwBL~;-!dOgK?i`a&) zg`^^#DS#2a2N@)1$x>)bDbe7L(nw)&E@5l}8_>z*Mmq#E0YL_=D-gPeXpshzR|Id6HXu+) z^rrPCvh5N1ShP8xBZsLb(b1{KKNQKpz zb|h1teIseSnCC%|EJ(dXv=KG-K*=B+I!OkZ!*ucymWU3CBozV?98yQLP~cmTB|fwm zX_3-r&~}KqM|o`!I)mwBxS;cvLP|P0kYYfUnHyzRP!<8H*F+@{LFRg5p%H5ZWdb5z z3K(*AH7+vv6;hWFJX&dpAOZv_8G<4PD17E4trQ65>5#b{Xb?yZQRj+je4AmFt181b zr66?!t<@Nj7*GftItjX{F(~koSPD7^&Vor6l^dOjmMn7SsYilbBf1gNWKqkJI^ zyw2T-a%B**fi=jY%pF2W5zTJVuTX8Nz)F8xar4?Q9*uv!afKMbL zGMrrG&_LQa&V+^yv28sqSQzQNrMs*(M6;&=pbpepd3VYgUJlMS5n{D<&Op;?^p^S^(O)8lh?cD8?|7stjJ4i67`{q@&5 zJUqmE&$?+4h+oRT62AoK{v;6o*+}8%qJz%@*`IM)eNnsIQ`>zO690to6};!>&G&id zop<=&_rAwp|Mg$`<~{o)WR7;FC{2p>12U7xclgeCzVq)DuAUN) zQsO5+`3Y~o{Wg=ygx%fUe>8V3#>l;U_xSd=zs;Zg$)B)Vtv=^OdNNw~2$KF}JnyMU zq52H&uAXs4J>|f9X89N2zra29OoZ?$(dvubSMq5f`{yC za_Q31uMEuoNVvLp?;ii_pZqC*_{aYpw|@K)GbI^|Ez+K%a1-Kr%W|hej8B;&5f3z~ z-(zck&51kZ>h{375L6dE7cX36x;kNJnrPNzW}}*^Tha|TP=4T=E17D=S$&_lRS=@! zu-@TR-sW0y!s*^AJMX-~&X>>GJDVW7NGe)BnC;&Dml$C;D zY5K@$Y|$zADWePpiM5PaEg8I{92wda&|2c9#t#EVLo@*$0Ion$zt%)C$~-HTn9Cle zD@KUyW={deimn%k!r+ZY$cXfcm>?xZ?*vM&vBE+VvP0QQLJzXa;!%|OF(HuT*l{nR z(mire2qlQhQM3w#!KWUt3#!eGS3%5%q|PGDri8_TNEuNe^*{=dLPqq4GliEK)S1Zc zWfG-~$VP%z7^hK65EBUD2v~#^Xyb5cKpBa5xdcW@g&;F4)21~~mXKUP2*sck8b^=9 zIEgT1#DEbXTxMyBP1T;raCkOt+9IfobdVXNAyCkz97j?HDRL98(t$zdqL+kX6#{jX zBo%SmVMqi=X7Yv}Qi+iP?-f$5K^3eN*j5ltVngJFl*f-!WF&$V22m7Pr_1v2%hL6L+pktf~;rCAq(Vwq4r z(w7?33ks9yO@mlQyfKW5j^r(h3xZCdOT=109WbK6H4nwDjZG+jCEZ2%yM$(-#%5|ch z1ZvrEd*~URXclK3?a?-P#juvhi!o|_&L^Q~ytPeOB^HBb+6Vm3J>vF?yFVSHZ~u@| zT;lMPigNFe-Qpd7*i^i5bH>G&uQU7b7Ke9c#J1z;KHQuA4!hMy-1?8^?7sgd=Kc?v zFMkVYI4D-wlU;5%AMoYjPt>;_Z4%0@8 z9#(bDa_AX1mcD3NoIB*snxe6+y2zduoZ1t@dcr!i>?{Sk9Qd>bd45K>gke$=mXUq2 z;Nz$nT_nmbu-Jo(Q_JG)AzvEx+-dUcjJva9n9jKpUgziO1GfBvvriKD2FXihi@7@E z*4Z`(HwEM8E99c()&s{!*E}!pzt4@oOZ;`X%JfCp9iL<8@coZ2NLLdnCXVhNBLCSw z&EJoi@$Y!+6n^{`ls~w{>*CkACqCs=JKp%x1InL$g`bLdc=7AoH1}#QUc1h#H{Zrz zNZxvDpZJS0A6>q}$9BQ1{imp-H@WCPW&iXV{PTrY{$a};Tp?Xo5u z{s8VA(7ZTdJRk5Ajj8w9Rvo&V!1xf|2h289Mp7Ms=^aZyrC9`C8gDV$ZE5G_zHD}pxqp8>zHA8j5upBWl1M|s*!`_h00<%_ks1YtA3zG*lGN<;f(Rg4@hl!R-=H`?DSd5&no9##2J}i zao|jT2hFCldRPg1YcSeTO7O{`1$c7%gdZEKM8!&* z-s#@q3WIVUsq#!>5BN2V>kZgUwpqy!g0_IlXD);2Evd+fyn>ixuD&E#h^vGd3ta3l zvZUWM6v|EIb#U29hUrMI+C&5#-jC7R1A>-Fg~9u5s2X%&XnV%V=9yHd^9O;%U<&Mp ztQJy{MKZTWn|c!)$i2-y5tRfwM1ofMl+d9?D1~jla$2Mp+Z3;2C5WD$>LH(4JmUP@WikpF=mJn8Dj>Uwk^>}LV!LxWPlJFVzdmd zBgH@nf_~BCwLprVAqbN9_z;L8;Jqh=K=3`jiv$_*J`zJ9^no^caDg;T5(*86{dheURR0)_ z-}^nTT)Fa3eqa9V&;E?R`J2Ca!cE6#jFzW;c08+jJ}H9k?d|ccZ+(k5-gtw{moGCK zjUI#Jz4x?j%VM$M)~#E7|NGzP$3On@)7uq~$bUQ*5g-2>n`J_XypH(%I*;$0gAo6y zdtUdE_{lF3I-hjsJuQHKCb)j#@@K@_N6$y25wE@a8ZX{>@mCrVeDe0-;RF8S-~0vt z`~UK#TVCsA9jgE;wOK9-|y13vcg+%T)ymQI11zbi$iy zB1Hv6V$*;cBTI+x6bOyh9mzpcN=BVTSpC^J(JpDI86iP<;$U$$QW98Tm~2X@Nt;5j z6|e=X9?Al=A3zHR6xR2oWbj5{yaR2a1z$;Y2NV$}He;>`PR5N1TvD3^s}?t|2|$U% zWdhcdy{9-7B097%;Gm_UvZF_Xro6q4%P6WfGHH^q2q3y_fbTctsysB`42~kC2GRul zri@U#HESstQGp_-DKG@Uu!dA`24bF=G)@GHJi^Lhg$?@(1j{}$QIWOYq#5Fx3t6y3 z%zN$(D+6`r^Wzg3B7^c91U~dJp<|1TCC-S9LrtJm9<|99Qkm%2g0jeyd=XHqypIV1 zTF@`S7A;F7QIyolfs}}KMwKihR7FeSG);&&=h@bV3nenX!{xSc+bL4(Xr=)~Vzd%C zoA8t*f`U>VlOR?6#nn4(pba=bQosVGB5Y~cN52(%)=7QNWQH@F(cb{-k zv#uJfP51`~`074eVQmKKNe3$jXl;Q^? zIyoTBn0w1LyGI?@@2`0UKz0B3yk@?PogZ*9p?alWAcoVQ3@S~Sb5GMjLdV}X)+2-CSCmi1YgtM;+ z#OW1YYAe*DVYM|8&hb)ly$*<-8+36+v3!li^rsx&I;4B`GG(*ImL)ILBOD7FT@%VkF+M~a z$4;x5$_SGwEuQ2RM%Hw~a#%JD^%NZ)lV-(PU1G`t-Hu6SponW27gR#9@&bj$%7NfD z>!=x5l16nHAsKZwNhhSr;;Q#^iZspRDAVJ6kJcqgD?*pQO1iM37lx`YunN5Ltc+rU zCk4-9X4%=2^s*sJLqVQ2D7%O(LXPiV^fYQs(qlxsn5U!^ZJSWV07+wwV68j_CD94m zAlR!q8b;Wq$BZ>A(V>PO6Q)El;7ceP%P<0cu|(B|J_V#V6otpj8tEKCu4%nt6fJI) zVCB(;MbdIEDvD-BZw1?fAgGdy_8g}oYGl-Q7lO59MexJL*jfrM>|EBt{CpESeu&lFv2X}XL@aii_;~(8#tdY zaD!zp2u|(@%xiOg{>i|N75E{-c!DxL`^Iudejju4IzKu883#vS;(@=9n$B6t=Xv?3 zlKEGE%F(RgonJKkdV(Lmy31>aYmWczA?4MNDQ;h4@!JpBc^7`MFQ7f*mFgQDJp4=E zKd{U`y@dR2&sYC$$!f>3T3n`<4=G;y3R_2K++5t}cUL2h+bOG81E-(%aq$svLE)l1B0W1iO^qt7&}>sNVLFZi0PJ<$BGyNCdlwQZ0%J zre6`aEX6z!>JdRg2pzH%6he{u9vv$#bYNmN-X|(&a7xgdQ?wkRsgTUkY|{)-8jqA3 zaglIiL2JOKkk3g&KusL@aW*MEI$<%u%)-HX)0t~YgTht$+JCbK7Kcj)BXWa^%C?us zO>JwS1{{fX@EE13^C=i|dKjHLdQs&Qaaw0}LT}M^g3_)*)*DtrK3h9L_X8qXC$Fq#HGw#cP*P{$_mtwvx&BWG^P`tNT8;` z4It>yHY<+r$uv|$^n%Vc)WsB*P!YK z%?L+Frgm*|dwA$AT>)j>;2}024OIsi6zg`N9vkq2R7B_`qFg~3)44=%1JiB|^%lex zQH}|1Zo9_7K!akGnOkH!ejg&H2*}33C~T050Zk&rERYt`6FQA5H@~+^q&l%6uoX0Y zg2HSLV*zaUq-04$HgTm@%G(av#e{$q1~8hT%jE_|k%%c*EG0LPq$14|zFZ?jB8h_7 zMVyETF%Y98L_>^ObZSF`Yz@g}F{&LrN_#?xgb--@Knxxg0-+0d5pvB#aD))>-r+(d zg+%ZjAqw0Oh$#?)BZMI*7eXSe0#SQ>>Pbn_#XRfj)(L4Nkx1wVoJ@F;uxQ?R<2AnV zwXd_iv-2P1BHB5}{rmTM|NZy5d-o3Bho?lTN6()Xu2S5*_78|#&))NL9t%rZ0NT8k z5;3b)U--MvidK)rq|ZdGjp&s&+jvThdV2k*#iu8J?-^n0DS_&dIQGozk6(Ra)uJf) z=l}da<#&GPTkP)c{(IlYloG4einrf>n{R*n+gzMqe6e1YyI>y+LeDOF>a|D0(W6k2 zR@8M(S(YFKF$B7dE)|^z?-9{vY4v&;RwGv!1V6r#a5%4S+n-9cSd0G5~+s_NsOmO*)*I9o5KBF5~cyapcJT@T1ND-Pd# zfH?X(pVoiJ{^{4)njUj!wPxpqBfj>Fz~99wMb%NfFe2RouD{3b{2Jq_B<#*Pv6r~) zYhDbNPxyc!U+2=w^6;wX#Wdn<9N5(r(LkXbBQwJ48cj=aX%`u{5dEBCn%Fui2)hRy zrUg;$;DyJCnx;w^HD=!~kzs<65?4qj5{9T4Pa|?!)5ePN?uxb_|6eX2C1n6RFFnd3JDmJ zgN1QSF_~uTdMfj1Ozbj_A$yp!E1s6nOH5H92m}Ob2qbG@38IXwg~SdZ>O3wBfJiZy zKo3irn=}Dq(-WW zR-fUVW~vA7K3ua~NmQ%&(dikl%Z?A{2kc$%S*9hNO=vF~eBmhlg5!sCcurDxJA9b# zk?!AR_xu&+)Bl^eyg~colIi?5>yv=K^alQRV0!r{oX@WFssE7m>PvJk5eLus-cOi~ z1ux%l+$tY%+NH!zcb)CjFdbh(Zaeg%LKg#Or{*w@IV&BLL1Ohe zYk!Ct*I4OM^%mR9g0pJH;bDzyYN*$2bytX0L(-B_&{!dGx+c~wbpmRSU0Y_Qp|px3 zN}`#OmX{c5L2Ekd!P1Nslg_g&JYE{gUO^#|aX=;cWg`%I=Kt1@EN3GFniv1YVxIf|Nf zv8LD87}l^~I__*wklhFL2e7!jqgqnR zy3b4Jo_DSY_G$}9+1a4XHg;`rI?<)q*mDE%@`#!Bv@=O{aDne@%>Ij4@PY4Z0d4ig9)~z_G1-=Nd8q-@SRt8@N#&b)vs}c7VajT@8Yeq&;P-ARF zE(U@;Cdw&NdZKGlLf}neWCenO<%Oi2*c>w&bOxvE0bvXpfo^K7G0?9;OpvO>>TC~^ zy@avI6}v=A6n%6gC5g&a<|4}g03ZNKL_t)LRLUo-C^i>Z8aH+s(iuIi(pV!&eNRX& zN)?0vN(%5D(n+LA;3d7@w8W?m6ZFREqo|a^({3=40{W0odKxqXVCbVE=>mm7sto;3 z>J*XcEUs;sklJS8G+hMSLjXM#45mWnO%l2emjv1;2r4UDl00?AuxYYOU_DwWJPs2T zQG%Bd-7Anf+q+Z9(#&HE5CpLRq429jWfd?Wu>>@&fLg$yC4xMYXE%Q@F=WOQ$)HMz z7)T*=lGso;dxh2#gJy_eHMxWUtK?;P>XcR$2kOpOCE}@VXgu=)~lo6>_7EI+MrEb@W|F-}i(NKDXW%J}UJ&*!dUnrIh+5vAt*7 z0Y4wz`^Q4upFXaqB7i=@-8HNE1IoJtg*ajSvPRbu{~_pZ25U`y$TgoqiHwg=iI<*df}mG>jN^S?UG4Mn)sk1&k#1{Eads8O zf{{HWT1UIRNBX4ZY_#A|R!q8{TJPdTqVWzfYLW4fG#=P50ijhEJl74aHHb9N@%~YXlYufAbR0I!N`(mqjbdIp${_ICQfLrf;^dmL zt>{aLvB3I)&MAgUQiu{S*QlhBn}+Gs30#p$3IxyzQd*;oz(<+KV*d|sZ`Na1nr7!c z?>Fte&lnRKOb(gJ9Bay|>g-mRC3hPT;9LI%{|8+dwk6o;3;Pe)FktvbFbu}IlWJF5I%F<}E4@l)u5{TkZZE2K7Teec7JTro|c5`YmY3nm#c z7*uzKgKLPA8Dk{6ghw;>BgScjjLiX+4dMka3M~rnJEC?agj_(p!W%`YqbXsYK`Io2 z#$Z$=QI}@Bv4*Nx110Q;NnwI6PC_H4X}l6t6ru_UrnDi7M#gd-wxa=KN|;w$(Fc#Q zrJ+y}P`xGBwmfsMP_g9DN`}}#)Pl(+GQru5FK^4stk_55DELNEcc5*=D31yjlp(m% zEsksnII3|VHX0?GtF9q5j#d&HVG?|?JQ}VfLq{M}MGYp=qp)Hb@<8aOm`0QO7OQe8 zm^lli#-eo5>O_OD1nVu{K@x}RChW{e6)f2nQcLMl2()hGZ1~04^_o+vZ-8!ChnbcbvyTNaFoM^@IxW~%usH!bt z1=$76F7Rklb7wr`tQS&~P+wTKteLxGF8wKs`jmQh2gA#Zk3Zw#eoL-@#MAeF%Z=_4 ze;!^#uMBS;W)|sF?%c285=_3!`ru2>PX2)W(tU1Tc6{*GLvHV7e!INOPk$LuFKxI8 zZ_`JCPgmT1BXha&{PgdQEc>4Hf#u23n;d=k0n^vkEbET5N}zLIliunh&tU8-+ztkk2B6)GM!G*mzrU5z`h%h^9plxPJJopWy`o5 zncA8-c&uDQs~#Jc3^yE0JbN*d_pdR?BW}qO(9C9zN`%XN&V(a$R50(*2}DnDgMh2? zeu7mNJHn*O1Y?=18Lm}y%b}1{GmDIZs1e(HCRuRNkxfU|8%T4~P@G3qh!_>Ph!y)p zlxTK3({zCx6wXG(3r%c@uBQnaqYPu))2E)QZ)mK>hmsNPM^8)%Yf2VzCy{9f*+#V9 zA!q$%)*;e}W(*FgHKFx{#!)M%a)wc$8i;L8?|Z6+CMk=fCygUW&DM@A2n?%0Zf4Y} zzEbo{MX2>#lCm&Xh-{$O?3NAE?U?Ay7;0qLlC&l@ExYxC#mo{f&*-WHY+MtvXX2K$ zk2d6^ExW%#du6J<>UNasjvN6dlMX+?dwB2FAsZ-?1A%|_GTRq^HfAA(Z|NIH z>w_un-AhckhFy+)_^(=0I^ZZi#-}yr6^+0A8BhMszu{;3B_92=3m(iX@SfX?*RhWx ze)&tjJiNx6pZu76{2Oj8g$L^mM06$vB2%!=gDtg;nu4sxQ~9$thtVQ`8Vvb7?Q?e}*x)S1dQCD1(!Z7^W!SA<}>aF$0kr%}7X*pqi^iQ%}eWEeY>SzLj`^Y00>GwkKNU z%rXn8L>N4yHdw6*9q77T^v3|0r&Mz7tL0K05?Xa2QwW*dlx=zFd%S3xs^H7I&BR*J zS9Y|lEaFnxuK7|QI+&gu9knu`JVSyI71J@3rv~AwsW2(%EnxyV0XdMgV1_`h6eif> zg!7cfms~-BSV8Uw23KJeR9lF%h$m5Bf!{kaH7)ol+76H^dWl#xS`vYT@vsxa)I_eN z7GMj^V2DsjS?#&X?DZ-9wzi?m}@;o+i# z?n(g5fD2^X!#E+k(lvO+qFp_wuRx=#y1{`y2(@txR}GOhnjAcF^q9%yEAlFnk(>&X zKaPdoi>@I0&k=e$MU>KzN)GZGRnEdQU_y0ey&Ry`bQ43w0vzPf^v*HW8zRUC~$|TC z;sDc$;_MeV4=EleG{a#>m;(8J~Uj8J~Re z30>EHzh&@S7Q=5G^Z(mM_yY3kTeQ`8XsqWfgwIxI_AZ_`*`f9`9`p}gSp-=L`YnxI0y zpT_#Oeejvx@o!6FeSOT=wA9~Z8~mEG`X+VtB1-GoF-=qR`s;6S_wHQ|4-bDYg4I`6 z!AFny=l|zF=YRiS{|_F8OO8COw^Jtd3a@L{b_L$jxVqiq%L`?PFU@h=)*NnJ>2Z>ax^<3&ocMd!gS(kx5v~?&#ic!-(GymD~C00sCj9) zNq4CD=u-IM@E-5iukz0PfFZ$fS#ke|JAP7sf&KNI-@Ucros%Pesjp#|f5}hgZ}1@e zj)O`VHFcC67YIwOiNu{BgsZ>wn3XCC4`^ zerIZa(i!?nQ$IFzf3#z&e$2I#4buOPFY+O3e}b3S`1xx)zWf62-V`RA3m&;wxGop0 z8;$7>sP>`S4#>+Be5#mDkC==dv&G0JAG2o#6(iYL`k7-gj>z5tP0m!-5f}SZo1P(U z7?u-mg$cn;pbAWkVT^`aC92@qPM+f0IkujXnhlmECSP!w4%jbo=h&=~D$}zgg@i^I zF{%@K7noa1NG0njNr%=o3VTH(cZ6-jdIks29B?6!M3)ktC>R6jijW=?D4%c@v}7hE zdMs));wFx$J9KKk{#~<%yeEh+gjTPwv>y*+1upj>ilK8<^{&jRIYPIANySLR08ALr zJlDJ$hB8Cus|BuU%K)i0aplR&h@md@brZ?9WKgBx3FayrGx}0-tRaNbJg;*{92%J9 ztF%!F0U8|`v*49xS|&DnAF1tCvEUjDhN^wa_Ejw1uz)2fNl|CmOd_umHBt@**N6eFd3?(k_`5eXXfS z*g0r&E{iP`w9rn#vcdLqaDfyI%7X6_+C`MIY!f&giK1vWLb4uTmBg(y1}f(PN8D=C ztVd#bzmr5Uil)wqBpoVR&>EjR%xO(HjD%qzcm;D|l55g#%Qy`X3}ZT{9*20B%$#6lFA;@=0tjOhT6+W zuXwPonQhP5>Iw5a@OVCwAN6GY2tV%8e%=!*O}PFUj~~B|41dA0c?)y?h<;t8k3Qyc z{u8cW`)8bgxL|v7MA|##-u^?H-6=QafZ$JfFgd1w{2}$x8-(Bfmi5oy;m*e&vb}tb z$3OZFSu+3r<&w*V;9{LQb(fAAmB{>880KkAsh|0lGce8Ar|74N50 z-u!XkQvV@?ddktq3(kJ}A(M}9B0oJvZ5vL8YrJ&-G4_>rS=v3qUdw~=GhVy#Hs=3r zX?{K;-4U@1JnTJh-W6I~@!IByN3(=JI%JO?(KU{qB}=?4cxit_znsx^12@8qUgpdX zdh%dM$AWp#(HtCuM66Tz)G(OtB`!D~jZ#Sf>2c>b* zvNC}tX7nzSq(_TkV=|-bnVSaCnAow64H7D{5t?k-=89fdhy&{rYtdA8#3%)0g>r_S zPnbRu8-}D^szy=HC2^}3`kwm^qOddAwl1r5}FA%Hzd6SzaX^%dnBaw zl1e+8aSv}M47(nG&9SL1Qa>SX16#FXvUY&u?Fs(9gs<1!desv@-LZYUM?F2^6RFeP}PoF=aM_*%f=epK|N@BCcxo)!L6tN?N3>OF@u)$ULOdMVgY=5zI>y0a8+XMRCq%14 z2KA|YTv7?(jEN-Wjj%SFQTsxdCBT-!-9*b^A&6iD7;SJm5!F>dI;vQ~#DeuD7E{Xh z-lGs>O5me~I7GZvq^L^prAa6Rl{F3_tCC}-M4`uwXlO5mx-LV99%7-G1WeATsK|OC zU|`hL8V0Yh8e$KEL-cd1kxh7|Z~{h2A;mB#0-_A2HAT!RiU!GR#DFJ)U7={uTw+aK zLIZ5E4h9UJ8q0HaBcO>66bgx^R4iZRAuyKwPpcuRzF7W%s061iLxQRUTtsn&&Vc?C`qA>LSnzRhe25M0Mr+Bekdsytm|-(IJ4= z4CYD)BqQFG>^Lc@vHB`UZEH1^0@Zqy(`YI(5iuh%)`*ShQ6c4pC5{P6x?piCpd^5H zh3LC_L#zwzMixPc47wD9x7wi5XoNs@^?j<*QIid9qat`=WMtOzzCOR_LfD@>Z~ZOG>_x=ZSFM8TTjbT% zV>ETm-Pc~@kN)V7_{A@N!OJhd%yc@vBGUfdTLm9Je8@ljr~e!O)qnHf@!ntl3sR*} zaY8$D%)DWz1XpS5bjWhop~8k*-Na94tcG(AryXGtkWqMP?|{|iV?x}~j@NMZg59f% z)pQOFsFyDBUmmgR9kGL66i!)AXDc2Jm%M)b1Gf5r#y{l4MaSN`LS9|)5W{}6|vc0ikZg291Su-~yx5kQ(me+ap#)^j@ya6wru)JY7-?z-z@KHad z8!r$SnA9EG|ChLn!_Kp;fj;E+7sO1HZj&3l|4mBF~_ZGM=@+1uC z<%A)$Ors|4YoaL;2vS+3Uon~QVWJ_XGsXn7pqX@*$x%ZH9m!ja=}r0x<;iy8ZuS|q@NWlO-hKX5v>Z{Z2}_GLiA`M=@I2Es!`PE z&{Zw97e;F^^cYdZKGG(QQL)S#Dxq?Z(xoC;qsvI8bZLE#sSH^Pq9mkF#JfPuvJvmk}u>T)2^f6YZzt6E=@U4XUx}yPW^0hkDK}i z+r#(Z$zA40PpDQ;_;~sN+p+D=`1sSC+&Y}nonEpye#{d;aC+kb(=Q^r zHypm|x&P5Ut`8Mva)5R#9=+e+8C5{F z4zqPkmV)t?tToD2%taIPgxXrPvaC%_sv3-mn9l!&YeX>j~mXN zMgN0;@SpsdN)@wg=_O-(#b|cSNaSgS^&YVs6bn>0f^}p)p!|qKqZ&;RPb-Ejk;V^9 zdWSSnnM4#vl!WmL?;}mULpjB0CQMD?HIlU@WLJ$$%`=O&CUn9$>kwbj#eg0vWKzSf z=G3($r5L(~#+(z}3^$2bvt~0W#Ch^;N^X0mmmPa6VS7-)qrf<6m{?63g;i3p-lAp} zIcl&evt0}v_al=%n58X!JZ0OrOsW}1=G;1Zz|nEV?(+%T{3{kq%|V8fe3!ecPsztm zX*aOCQ?Y#G7U{D!e|OvSVZF!R@_G*4EyxR*U|?N0dg z$G6Cze+~zkAMa~U*Vj2!A9JvG$Tfb<(I*d>cLQInZgOy#(SNXF_o48LdW$cQc1$;k zNBNXLxYXR5Y*_gpv5E?p199;sU*>C!*A~>xoTK?ZZ13atEZa&rx&0;1-Q@a{Dg8`y z*mcxWA$G!IVmWWN%+4&Xos(sG)mrAcFrI_7;Iiwf4{PF?C)W-!nK28PjE#Z$kt-G> z0&`l1$}-tz%&;KO3}Y3Uc}=VXxQv!5At+{*BgY=Ac6cv16=}9Lwi?)}3S%_7HmrMC z3>n{8NP^N^Dp4fSv~h}YBU%~M2!m6IH8>rCM2*1`*qDlG*rIez_8v1@#Flt;Wv;I5 zJ|Vh@Fnv@s4YUY0w}o^vJLnutOXDGZq_c|AE1ZHP&sy6`eJ)ueaBJ-|qAvKnjEYf9ApuiU!rhc9;+4IkYMT<`ZdCcc9F>$|zO`VBuqQx=VkSZoP*x*J zAmVSNcsk76+yMy04IR?%t@v?;M~ zS%j2I?gSO6tT0+=YzfNsI-rxL6QRN|7*C}%A~1?38KIJ~gy0SqZS|E{64BA%v>|Ja zwZ)F8RK`SoC8`8WHaINinQ&t$NoFY((ODuQ6-sHu1rSBVqOvL?tJ9dIP{v@4E-gZ0 zP*$Uo!&|VU@aX)Ezxw5Gd35%e*>uKiHv7F~WIeMOzWVB`y!F;wT)%!D5nET;-vkz`OsINfTT=%OdX3pzBT8ZA0u?6M<9)X3oM}Jf$jvb48>YKg zNa+cPo5G0z03ZNKL_t(%;evM9gUK;>wx@XY3NME>E?#F}IlOCG*DdR#4mn@YEhDcY zY|<3{$^pTjai>0H*F7cN+{2qC7qNmTOSmSJo*8T zZ@tIqYd_`w`M=`L0gNKCkTd124_)$CK)WgnPXMSUM$>x>%}WD6>j zgQ2NCDn_Chj0l5PC>y|yJ7eo!a|Vsw}~77;}*$Y@m3=&nRbWLv20 zR2i%mJO(A1NQI&h&Rz>T7v*cb0@WdaxuPosoFuYR*d&OmUYm;&?Ik2Ta5&bwW>6$ zueRvvoN*jTZi`G71c_{ijLr>tqFFq3bdwIBEtP8N^uT0VbFp2sl#!kCBm{Mlakj_U z%*DxuUak{1XG~nn(@P=LHQVkUL%4w?!EVpF2!X+Duw6pV6m#lZwn&G^ahj@Vo5@!*Rolg$O6{_v71 zneCICTwFXNq-zXK&EI+Oh!4)sczm9@_T&jR!L`*L{`}wjoRFaZ@_@_Pj33|0+`oT_ z+v!%W-V!ffX7BGG@a0GE(`Uy= zhll*&B=G31n%n)zUen+nMXLS=d&>doA90p%)6bzfb<7%}tt~tZ%x<*cTlS`oou8A{ ziv7s}z6WAtwwO@4a~M5~!J>|#I@jpK8lN6xGgQ@%u9>1;&*W)oFr+rvX3Hivto4S4 zwM0s8b6#nDZb^EA7-6D%OstSDqn8tW_84P|6}autM#}pgD-5;5p-JnCD3*Q@oZiqT zLlq5q7O~r!Xf!0KCPLO3B{Oy@Q00Wt6}(^eC;#sVcO~B^V>*+!Dl*yasIuSs^-O!$9XV z)o4ibjP7c%79)a0&5m=T7(%X@k{R_B`hm{WFz=}u=tITAT;hGjcGxkgYN!H>!LX|? zS@sQMtT|6TZY#9WpiShc*PQFbpfa5?jNUMx)C_)t9yIH24HLzTe=Fu(3OP_qf z=B+~rbdU3D$D4M``s7Vs+8uFb_Bs5Kr+V)`=X-19 z%>%mCf|>t@( zc8A%@8Euw!2~HI<>)r7>nmTddh*%q6@W35;Q&jx`c$Ty2P*5T~A9-LP;%i=oOwT_+?5 zl(qy0T$q5#biqsQ zQIWLZY~hxz64*lDXpDD61zw-isR@-;xCF{2L<>O_Do2#qGB9X`&K~jzN};pGrV-y| zqBEd1+GHdslBUonQAl19O(b2_>Q>uC`HxEAX0J5SDU85?qOxGBvaME0u%e1hGnTv} ztSW)PM5;kwHNWf#c}gV_PcHswUuYMSLg_6jI;;bgNAN;h57;0$26AO_NfFhvC{K;V zNOp>i+EFQ2nk9omO$EAyw-&1dyQDELqZlF0(Mn27PzEbPN)abD$%2U<>PR+R1rZ6( zCStNUU;gtU2?m9!hq5)3T(TpSA|Q;>;1uXiV{Ag35(uxb;4~^`QdWp=31LLUkrXJ# z5-REf+Uu+7PnYZkD;N=yZAnZRO`t)catR|1TBu^7#Ka9KlMt!Mg?Xh%umdQgP()%L zQ6f0)Ku2;}DS+OguY%9o7_no(8;jGz7$Rn^5oZ~_hOuNo7^6y%J{OFpVIbjpK~%tt zM#p?b)RYPXlt46Ph&BTROHPm~A*o`U?J+nB3{pf(QHCUfWQEcet;^%od9@BIZ|+`C6zH!K#5-wRO!V2ojJZ;!io@ACHB zZ*zQnj4|dbGV8m!Sn4?&mpmuv$ae%Pc}~QVXOz{q#Tt3;_Ps*S3rH(@j?VhFz$M>0 z=3B>q=VLFRxL!V=e+R%rQ}&U&$MrM^Khy@;y% zx5>i#j(DZj_Xt<&-!Av+8#nb0I_%l4u4`U@{Wacw_g#MRi(l~On{TqWw}&z2_hu9H z-t*r3@AHrU=l_v^{NMji{N~~Nn6cU;QLRPhXPH`xWp zg%`4Q)N8{-eM);^S+`TxZ&<9!Eb@YW?;b~Xp9gmy@kHHad+!t0bxR&Kv(qK|=`o!w zIo@BfiaYL($Bf|wCqLlR)kmzCH>lMCFU1ok_xAXyobY(>6_!TR8^Ju#T%PTtfBHk# zPXcq@v3R)Sa(#`v7yJAse9XJi8#QN`IZj56=mWkOr(C?Xp}O}vw~jKq zmo}U)Kjx+B8(iK}sJ)1veZ=JbAJNJY+sz#N^b)hs+CXeak%>kbr5msnEhE|?qPB|LB@*x?vw|^ z9g zK!v3N?9Py9mq=TKu{a>t39$yjF~pWWYlh^|lBumQ#-X@dRK$8qY9iJfBqem)!{mzC z9|A+2v1%xT&DwG%nWc#&W#|CcSEaaSY#DR0`=qFlsw@uGAczEZ+R((Nl<+VjPB8?* zsH@VwT(ERA^oYr*Q3zV0Qosj|36W$xDhXLs5s#!;6P-LOl2C|>_)(#o5w9F36-pl$ zaHGO&NMeX%M!5jaUK!~WiiATGogrsvMN_4SQju&%v~~EXAtW|d<5DErh#Cw^`I7Uc zO2!r_dNE98#O4|!5Gikron)wlY(09=FzF#Ck~3cgUZhy&aqS^Gg-T@sJ3`6Qq7Zn4 zRwSngF=CX%OGcZLo4U(Ti$D-m_UMTQ{S@p19Ux?1W?qI;_9TUh8Wqe)<+||9%AG7m z4QO3X#0s2c#boSBwxUDfRHn-nPG?9HydJO{bA{NN+E2JlErXddr~&2! z<2IvgMcr=*%N^1>7B=%ZY&fb6F(hg`a?x1wCbPJ=<=pNuz3F+nw`MZV$lEm^PgXR$ zGtA`#+01xy`(x~v#~hwK;l6EH#lYj!J5+bhd2)8imj`qH!_UrH&l}!*`d8e(wq;mu znLMsJJ3Hp5$6xaBLUGW;W@)L8o^o;HbyEK(ul(TwmtQ>Q%vm)bASKW#A^qf{_u?37h7h-KC5+0 zuRGox-r&>vmn_~o=C1K<{B7(Zgo_$(-C({*R8I%eW{>OFi+Fvw8BxbK3EhmBn+cl= zb_8w?4V|md*XArxRBnPitf+1&vKI1rWT=EaB604hcbfH1Q%z=!+QL@QI-n~H(WAvt z`#HhJk_o#L{Nju})J#$!r+|&HN`Yps2;N{ls1z9c3RyUuH>A3wm5Lc2IzgI3idOTM zQCY;)*t|vO8e$;35(e+Zp}nW=%FnCy5GRQ?offB^1TYStgsniM75X3kqkr^gVUxir z6b?P~Y%w^m$yLUL2m_3^#wuvFWr9X_C5t7iHDW4~@=UU(t_{JK`t+NsUr6++a$!9!DNdLXADh)Z9B*_R*Q^o zTV}n%&ogzO7>^V4ElGGEnA7A6q=C>%x)KzAi43l<;s2z2FhhGD4Oe>bV5#s{m z`@+S~&UtdCm@Ph|eoLr7zu;W9uxjCz3HkJO)THC+C(zz|pD@BJ*FIzQdk`6D~ z&M%nXc5Kz#{P9N*;96pL=T+`#$D^|)2dj_yc=r@*U*pyBb^5>jknQF%riQ2fChyJ_ z|8nMd?ZKMUFK<%Mj?k&+e(Z?NC3*e|qwjIK!-&Qv!5j`W8_#ZD5%v;`Zpm)`fVtYE zw+*%)xxT8|MyQ(#9XyTFMCrIVn4q?Xs?J1qsHtUa6T9fBCIMGDG?$FlF*BBAG?5+I z&S;aS2?mq4WIshT#9ZNO4V5sa9@k`a=%`Fxobs|E4Hi$pQ{j?eR7cPnl{R1+vNEN* zRt&xNSPwpCs>-4JHCk0{jUZJC7f%wXMh$hja4M|`S{Qt0&?C-RL=ALAY&Q5lptZ(~ z0!;u7xtr41SOx)Atas+BpT$Zdv>9bo39uJ~O7>X_G{lOm61IXE6lTnfRVYE$gOuz9 z>xn}yLYstwa+64@5Fw%>HY&QI%t|IHa-Y#zk!&hCU0hu-lRy~QilrU|YGG)5l5Us< z0okFYWKfCq#R@1e=!CO{o9>k@b}cg6ctWnx>MCdyP_aNN%7Bc4DmM%&kOvS~s+6r! zs4a-sxaul+Uh4AtrOc=V8%y&|6oV$CkkV?1pr{x^j}^dZQp$z&$^l~&Bm*+ygC{A6 zSDD>LsP%vtK@TJTiWm@22~L+D69|f(2o`A;U zE;VB#xS=%CSf!A<1#i)Hk5ZZJEHaMZG$>0DN}G>?&;}}{$tDod_$v#851>^~G*$T? z(<5q7m>?uQ5K%OeAZM&Nl*m;kMJ6dBN+weRv2j5%20_yioS}KB3ddX*kG>$=GFg4+?)K$m8R)^zxSKY zIWgUl$IuUi5VnHV zH{*DJquW;W(qD-H{;JbSzT&2m*Tnk1-BG3G^#FJIh8QK^aBO`;$a?M9>RZJt(enS< zk)^f%RpIN`L>I+>-_U*aSJA_-h*w{YLw-fPQr{w8>DP!(-w>w$Iwrs;F>%>GI5)U?vVdO?~s6EGeM?(<4bKp3AdPQg~l^wYIQu9f7 zg;WoC;9qdH@i_H>>&B8-XT<4>y;z}_9YpImbF<|zj+CTzw#JYtvj_>=?t@3UI} z-`upMff95!T z@CFZ02Nn^|-6`to0B-{iyPJGz-(a!ZG0h9U=D0a;yOm}c; zkFL4RR1yoFSdW%8zruBqV5U^ni1HevN5VltJIqwg(qv}Zk$dPQ(aiU--lIZB*E{$@ zGxQ^4*39N3mwJ~S)q}1WT}Nd!o3TY2%h(L4aYk2dkg*|DiWCz*2}voe*3>azjUkDK zL2%WG^3wt?4?@feql@U08;5M|&M9j&38fTKCg@sl22{2v*-(umvC0S*r5z@Ml8EZn z_S&<>PiTva&?b-+5FHU*K?S6U6-5$(7)evl1YW{o5|$fp^VyM3N%>)NjtKP zTg3hv2@}u}EgF$P3W`3ZVjkH*Gy)+r-DH?o1(dG`q_41*M`QyCT9r9eR4J7ib&EC$ zQJIYn*fl#Ul~q(fZQ>}Ksr}!bc?SH%g|!iJVbA5A{t z)@ZPHK!29G_}*>$^_u$DBW^z3@ae5NH@Xjb`o$Z(yVzme`D13Et~s8JCz zc6_uNc!!QtyU)(_=h*&?TUBIy<2pyXx4C|LO8>zI{~ulF*3YhUmLfy7gPkrocz%<* zKIV%DneTp9VIE&HUR<)cE!^s^^V82Kv^Q4hrw7d58Q5D#p05+Oy3Xv@3N<>eFNDi_ zfsHjzE;+XcShHra*R#B~N0l0;XB+(3Fji~q!ZH}4;gF4+vbQ(jFB?X0ktVQ{cW}0$ zo_44mk6Ig;d6djZzNb<>E?4NO5VON1U0U0xH3nE>aJ47*4HA3Q#L*dziiyqDhQIs41u#{HAu$XSv(T(VC#VRalCTFPi6dxnTtQpKc zb`cm}!QLz~>cCZ;GSz{2J=0&l;+ngGI}KdiRlFGIJm)2E)tWCaZWD$h_RQ|#YbbF*f>cgAY(h#!p; zUc7pPu|4MH{yWTu=S=4N%+n6%&xG%3$MMm?o7IY!>5}8=ngjQcTl=r*PAt3DQir+BhgvpGgEaSO@qXv7vrn(L))Yxhc zCy{9!vB~3Yz~_wf2Gj3in-RbEOpHT(&!V=B0i1ON@vMTP${w#hZ5o-5QzR-j!-&xp zc>t#s-dH3>a@Em$M`aAF)==k)Y&z^{(WV1bX$H(1YZTf?#59oCkQGkD+L!j1s#-I8 zhtXyD>=iUAAljkHB-px4GSQX6zH?xS$Y9V-052q6z>_HoNre(wQW@`aX`ayvH5SO^ zpxSa!PX?t2P&F|@wu0?5!Iqr8mBKH`M&pzs%79K5Mvbx~3>t;dX_#g(m9R;W>r#Ij z2SqgC@LL$A1#L?ci!H5vMjNbB+fAV*7=v*Aew9iLn5cbrZNmrdxoS?X@g`}RIjXydq-*56nnf1WyqqlrM{5D z4MP+;g#s4O;EhHw1O-|YS`X;4!i+*a0~t+WXgPx>6#Kd!QKCsWat38PR@Bs@7`H8v zbb_x8Dh4z{C8;oy$RLVNm)ApyJStSm;9;psrra1qVqJ#C?XC_D$Usa9rF{`tf+8aX zRlY|jMN%HEe{p~>qzoBhlb~@5h90ybs*FmmfJc=OvPCQKTBElXd5>Vb;=v&FbXA~H28jW2 zf+8|%!C8aewjLQ9Ai07`iyp#AwiSK0I49seqAHZmB&iD1O146n)dVT7DCq^U3ADnf z07(;_M||P1iDYurh&AZ3G*^b0uqhC&!)A+Cf-(vtWpLC=V^BDw5fw{|p^P|XQL!|t z1V$>8AX^*;6+FsWL~Cjhj8Q0+&=T;<5xSlaKYGIZ@BIavVPt2%plRyg=pp_WF~fWJ z?(z29Z*%Y7J!Z2hA;fQO)q7pU@7o@e*WUl_E~sC1Hp#CQpAq6mhyi}1A@G+G zzt;;W1LP#Mlk!g<`s@@lvz$ z5qGL+(g|KEc8||lZ6-AH6IkwXuqT`yujt;0>>UXDi(9<9K5}?)kHw~TRb0MaBuMr%hPMb9nHPweV&|sk8s$rH$7%@Ik50O)!Dzt z^Jc;2jX&ibd&$Y_IoSyDsNs&@VRuIV{imFy$6P%6l)dMQ$0xfi4{q|tav)BY z++MA*^K-(pk#zWoPY+M%&mHN-OZvXzMs>xbRmHOh75AGrd3pBa zorgjfYx?noyW<0%4Tk%1#N7t@vonrHxQcKYBb%wGb315xiB>gS_DpsHOSR7=8gg_@ znl<%AGgccWGAG*+v6(0n=5D0bHI2%6qgWlc>@_oDh@g9Rx{7vYp&pT_nCpP@mOMH( zPB2PgbB)$5l0vy|>KaX{dUvKF^d7MR#}!#?j3i8J>8&d5d1_N&$OcRu%BD(}N|_-V zj7o@xO%j|k5CaTCupZMHHrC)YWGXa?HVxQl=&VAyOgjip1k{EOi^Pmcf_9pmbXnHq zOi~Jouu>VbMLCR0qc&2K1JRIdAS^YbDeTKK!347Os8o~iMQqvRf}4l}l|o4c2*!ls z1V@kvUMY;;;y1()YREdGq6U@GVJwW%p$Aie2c;usOc*anB}HiJ>@TB?!bny^?qP@; zYdm>Wh}$kG0@MbS7{)PRw@X0{_-x4H$|4nCSP!Z+KgtNQW!Fb?nZi_LGzlf9G#{#5 zuq0$m5JnNYZ4-8dhe4C;^0^g_M`0Lp8I7Y9H&p~=6k>1;E>I^;l7WyMMh{pmY>3pA zEpD|m5~q$Fgdq-v<7zERBEFk}TM?*Gk`OjrL_?zun^5Dlq8>W@*pPCKVHUD!2XrwLv?11-(DqCngl@y2=1gf>`9NJOe7nQgMOID6G<$|x@GDO{*)R)=c2W^G z3X^AK4P9E|MuR(U@$)_GIFjnf%l%DRkUv{;m^F+31w_ZI7d6@)aq{9B-Hzks{p1t^~n{N=^?lGPk6hZ!ksgw+VT0$E^lrk?#7I<|B{o*1NKgf z^JroRLbJm-2Au1$exLbCLpK=+_K@jyjnAGO9QEjs%F~!g9TnqFpdK7%KOoW3)d8bA z($y5TYmwG~U6V|OZYC&+3=!%k(VKzFHpG}v9;zlFeFe3`SRuCxPs=1K8ka~DOIlTg zoerxNYX)jhD)G-i^Vv|5m6t=C=u14BKu6mrF(vA`1ic3|- z2%8H15B|a5`$N$)tkI;bORHZ~aDg_Jqj?=6+Jw%99-mak7=>hm9uv}NhLBN%BKQrp zbEsuPO-8g#>9z+VZxhiuG9|J#RS6wCHf><0BdG~gE1|0mmV~v5pdC{#z$#P)c@>Ge z!fTB*pgZBJ(YOhyvBBC6YBfRV&>k)}LUMsCJwflSsfQi35hgD(!HkH&+F#L3ZnF6@ z;EiT?6m-90X<8N>pr2jQ&PNWWk@=T!W1eZp1ycnFlaZ&_?xCN8TR(-~bFseU+Tj6v z9~mUPLiYbI$G0~;91>@DUJ=f&@%Xl5^0UBMSYq}A&*dkuJVQDSUt9-v_-wJ}!N2o@ z`L!F|{AA6z`-szZ$HklPv-G$5q5quA$q%{4C3kQ9haA86$H<)p`xno6zJJQSgUk=x zJzk`nys(#Cub&a^AxRyxm_EgBb{NkR_fgc#Q@ZqkPZt;5`KV_7UB{cN6;JmnrdO6> zVbP07uWITLsr?~m*9Rs7Q7QV$5hvv&uP-gto~Nk;e(k9@3zkbwG=|MAlXAk@$Pg2f z9hKA!RmZEg!qyv-sxURAK0{U0%0Rnu99D+pR|HeB*m8UZ3(nN!Arno)SdFj&0}hQ0 z5p6BC&7cRAcJwBp+lsYS2njt1D;rVCko8D36O2{}QsC96QTL0iRAD{KZai4eePTNs*pAV*sq zXi8xv0J=n#Xz8gjWQJH82t!K6b!0Vd)@6fc16DNNNJ&0Q;cht;)?7etkYwp4mG1+T z%IK^~y+WKoZnsoQPgE9-VA@NpwS}Q%1FPO(ZD~%GYy>TaZM!e2^;l<6 zz6c5mg&qQUjdlfinT$gX7ULAsS9Gp8k(6x_>f!{Fgff&t$_7?OkuwBYV{kx^h{NZE z)}AQ30MT>Ff%;sbZK;TkW#NW5#pM*jwvkVT_=HpvQ=2%7? zn>Tsu?YH>OcfM0v-;8D)22#pf{?%V`utfb;)bQKbS>JFj$*&Q=M12L`{u*%nR%rPK zu>ExmE&1B>z7F25e&LXMjd-QxTg5s3D*~B*&7WU$dyPo-OE=bQMXlEW+W*E3tgpDE zUK1Vsdc5%UkEz#+R{AS&`Cl@x)UP_PCXee&u(T0eukukfqyGj3q-;11`L=R7pG_|krgTnpTM?-4sK z#HXHVzaZ>=$j|a(;G=!y`o( z?{I$|ag}GK&pC2Ow0cQT&$XE&&F1J;WSj(PQ*FlLj@B(CC&(5UuWYp~7J@De zSY1JXh13-Rg>H(&jJRz}Ri#+P7OFi_=TaP%LFbX66ME1j5{9x=A}6%Z7 zvZSU%i9=g3UL$72k2TRGG8R1!SnWtD(Ithm1LNpOHqfMs5Di^BpabX%L@d&4RNsQr zR3Xz36?H!l#(`xuquFGnRt!<$n;Pf9;xM&v0odLVY^HG|A_)}~{g|=NvmSeVS0O`* z&)K=ht}Y0*e`Uk@0`961Ueax%b1)poh^^YI&k!tAFE$+W{gXO~m+^dG+ zy(e77YwR9ha=HH##yaud%TKs{|2s54|8wqEhjh0V9I1-6tGTWO<9FG-zb4(%xGtV;P5prb4NaylGKYMOJG}bPQS1R4u{Qh|{d2BgVwWI;J|4bwcIH+FW7M zg0=2S8Q{vHbRv!hTleTc_f38J~k8y0(ORCAqV6XVj-j;D+t?o&NH<7ujB7B$*lFm7gy&2wUc?uPKT zc|vvmi0Gc2i#`<>SN}!TUb52GPL%P>E$a{jiFgAX`d_Xu7=Q%?K$(Txw4jduw>PbgSjuE@(d)7i+SGwjNYRhPQk zBm{{CrmhkWi`ELXAZa9sA*ljs)IMURMA>xI;76o4bd5qnVzbUvbwun4Y0BU{f<}#k z-{#u~GIbJ+@(6~k%MhYOL9~c55ER-|1Tihd1ZuG82x0`Ag$v!YP}6d;W*~^h#?q9P zb0jh_w2I0VrxZg3Jw>rXg2otIpp|~>5Q-j&5M3mQA@-W=s^V}Hg|T&Mz7tTvQdLD1 z64nUCb{a)cl1OR;Br*yk3gdF&;b<5|k)$nchZ9TK0xvae+g${lU=w72N^gscCB{-a zoU1)KiW-menV2<-h*kyI8u6H{5v?fyjG}5= zLXK#g8PTM!Mc0-T1Zjj0#gK(swGbVnEwA}OEATzJD)#n}6x#Ginm{%rm5`vwE|GI6 z+t;ko5Ds>b=DY~;m|OfKz@Rue_xQW?r)!Fh0g ze$4yt{haqd{R{yX^BLB<-}r%FM5wBYgM$O!c;gKoKmIOv@7`r+XBQC|hM|aFzZ9{4 zo#68t$h&+yNL_vnAM0BgRlml4^-Ttq`nPB!{K|7kaaHNB#vH%W+V|HvvXs`}%EkKn z1oh*@864Sby|%Q?r*n@2o;{Fop8=tunc-FJEP=n)482UJz{ z8!0V#ZA@^z=1>3RkN9u@oBxh~^3VQzUOsuj+4&`M2uQ<~JBP8MQVvqX<<#RwL$|nr z+g#C`BMw~6O?%4I$sW;p_GUHdbj9s(h^Z^`@iF%14hOF~PV!y$qT}jd!^p^uB&@G@ z#EbhJ>4r&njrZjOF0N7UwOkw?koGSaH$8f1pG`RC@Y9CXty?rt2lVL=h+)Q4shQpV zf*0!}t}o9xaBE(?c?a{y&v^FWI&VF@$sImpe&2H9DsDXgjH4ePalblZ_37t4{oj#t9cd=nAdCC{u;A`z8!{}$V$qkEJ4sx+V;?71eX+b zDvLsml%&I07FtOJ!P644A>v()O~9ls7?06I0;N1{HfSA*qEUHd5Q7dX(%Pv%3_m3Qdx*8Wr_Y5=Ke?|V{$}E z%{Z3ikREf1aUz6`!f$Z|3Q#7IltvAKOXIMqEOxRa5R1{dEQRTb$}&U+T2TiNLxrgl zUNSZgcp^GyeA{62nvsEE0q151DPipB0O z6Fcz9^a+Qj*SNuo@Wnp;wWoX#A+A;|cLvP*CHD{a`0|UygM7vNzvp@ImyQqL`EyQB z5+8s0Cim_>WuaQy$7c*5KR|x+DYx$aF3XQ6?2S*5AHw=FvY36u(+|GO>h2?&PoMGl z%@t1{-(vB6my=7&{o7w+KfYxDEzi-t!1*e3G!@SJz&kQ$_d>Ba5MG^DG`opvXqero z_~>Fp_Y-d27bbqmBuBVW;dDb^S<F1)A*VpZ5Wz4aWPO`T5it` z?bNUud-l;Rsy)0j)Qf?TM)s^>Of^<|Hlb!}R7u1bMF>!(@;+EI!P27Ll^u5KUNHYc!7HVL~r2?(WY&IRu%n@@T2kT%6I$;M#M1fo5d(A`wtEHo^I!sE; zDhPSNZ5(4VO!XzXw@m5^cb-`_S5Q~P!BaWV|L`CE!5{j11hLdPl0`#UL(b??=%=1M zWNMQbHVI=r$uz8kp$Q&eYbt?+A~g{iDkccMO6cs+CSm#tIhhkl!M?rM4ty$d> za>8{&ZX6*uOsWyan!Ft7X-Qg9J53rD>2*WF+T*3Zl3V$_=IcmoL7C%W!vy_v`j9(PYnNt<)5utwMU%fL;71Sd=hzUypR3i z1s^-d$-3gz<^wMGf5i1x==L_eeEx(-d(XMN{#z`bw_NS?)Uy#gIpj1hi60#?zjcnd zivF_&2eT)vs%wl9_W!&nwa3+Us(zrooU<^(m0L6CkeP;y4hFxXQJGpnnhbnCuDFwq zNK;MQ2)pA3Z!%%@^u1+%xMp0|?4}h#8>(4LvJ>Lku!*Ns;|`a$#Vs``!=jDks-YvI z(~>I9F;f_WN7XgTpCf*XI7f8g`w2!}qC^q2!?Pr-1|iT!19gHyNVTC>1~ovk<$zy> z3_%e^kU#8e_yqR^^D?ncptX^@L(6t@uxYd~Ensy#)&G#Fi%(mFKR z3#M?rfq>q+wUpPOFH29JM3Oh?1n7uY9-T^Ua9`#Xyr;NuRB@2i%8{~1vSt)RJtQ`j zq9THT5{q*RM9~vVk6;qCR(MLSuq2J>j$T)oXrLZZxhgFyy2Xhr>;*KL47k#~rUZJ0 zw-7J{N~}teKn!Z>h|U&!xqu`gCnKB!Q9{&Nn9z(lnzM-+hw%V#eF#_OjRPSQB>i2ZR4v| zze4P!yl#Z@^OjmgysdCDqEvZJ2^Q%?*-VPXN?}rI5rWoO5ppPSaWfWpdX$2$M-&Fn zQY=kQSXBghXYBSpz2$<~Tp;bLMe7MFXpB(=C5$>#M}s%2L?Y2h2!wi|q9WRD6R3v4@ zE{@Qz`0&Xm{PZvWg5`2e(=<${)4w$#;1}$oqoW%)V}J z-w>_TUjuRfDkJOH0NcNeP0)(z6N#wmHWQ(9L_qf-?+}(Z@2OYc5}C~J@bmbBcP`HPV0epb zpI7{w=l>7&?=?J{3Ll=VSbceq_{C?8v%uMhm%M!I8Rs8vaErj{c_PP_y`LC{lVe`? zr>w3Z+zdQ?&@jdoch0`x)4%h3?EmZk6aUDtdUb(O4|(#=$l_{6Tnhd`liiy>qbRgE6o#(>y-wK@0_UTp2K35!HTXNLboKKEWF0g4@s@iduuQQpoOpZI6 zI&-Oas8q*drqOmzwYnngUgNwm%w>a(2l$7Lm~cff4TOQHGSUg1RfL!r=9xK=yPE7YopDUJAo$uVvW-{_(SgaH-Zv~v z4{CvUfjS`(T5YhD&wQOSp$AclWQy2PP}f_b zr(BH$)kl(5_?%1hPe3V$1PwNmd|9$ugv%V6E5k5?$pbMObj(m0L<*x)NsFQaF$|Pq zL$5*QzBK(xK(fUvgC&D6>4MssQZl4HNFYlofvG8BiHKlzEVl5{oeYeFzyVHIWBZ6ljtkY2XG)0((-m{}4@ zmDcj?5>*Tgo2D>|Tt-hc+BuZ2F}^2wA+>@JBbBq*Dw0x}O9tnueV_@NF=||w2sR^Q z#&;gQXlXA5`YB9$(x6G3mUW%5{tC`mdwVMl;_yZjH@9rOxCnl zJ6r};maEYdl_4K%_EXEt{d4l?HLLk0J1-afY#z9wHEI)?9;`SGf%MrNzn^(BSu=K# zhfU4dp7q7KW2QA$@!AoyvrvW;ciuPan{gG&N$DJ-+%QXm-!)boSFFVu(-Bh{aZif z#ut{ZyX5nW?{oLwDX-2w@$L6{bL=?Vy-u~ai#|C+Hh1~LwN&T(T)T13IG?hrU$MSl zbI>{V=7uir@pe@^M5PEEV3*{LU6r;=iN8t{_|yJ}#r z66rv=++=JQ*s&9?_CU9p+69J`v8E=q9idSqnKRWT&Rh?|nXa*w!e~u9SgMIo;mA5c z)lnsf9;@QG)Bz_W)IBlISUZ?>0W|?eh1MHFJ;RP3AHdpyqz%>@@|d9!#?>W_op6>c zQ?o%*M%#{IoMVgy=ZWGObz;nhF_-tW9W_Blw8`|NLjNa!@b~{Pw3$iOGNwR^f;BV3 z*pYWKYLij9Cb@`cMe2L{rVKeE0hd}NS+I&cWK3P)%1&8)7}>ahcM35Pi5U;r;gZly z5Z|II1+66-2UTRm;<`YO0|U`UTyBUO8u2J;32}nTih&Mm_E^^=&M9=*5)@i1FNU@3RR{!k=)edrsquYj4(Mf5Dse zkNAB2fLrI+nI5kB%gqC-A9|`qd#b;GyXJr*h zsR7aeN5H}(u6Y=)#eMI2&w0+?JvL9@admp1r|U2H`ZuQh;PJOHm!7lhUvYRN@WtC( zT-`jRI=M%kR{VJSKIhY)Q%wW<-4)#7bB_FVrk7vQ@3mZNI(BzzR+Yi|*C?}3vzs|~ zp2pOeOO{R)CTP@5sKX`t>4-VYG;}oUL?;vSG%~LP}QCn{s;>yf%k=;@qfdUC8uRZomHs?Yd_a^3>gji`mC zPYzX$)Om)GFr&uQJ$1|&r!WgeOg+*nz#v;T5-hP)3_4;Y7Z->ENj=#|2J5I|X?lwk z%XWt1$_WBS7_=d25Wl@pyMXZp?CiUQl_l0H1~iJk#Kx3HjgW05NsYm5E#4Hj2IbFN zofwo*L*YzW=v1Vk-lCRbxsjF*gC%4|qqm9vp+i))Hq01(^%V0g^e}jy6`6<{Y#^ zTqI+uTmdg=NhCaxL~;e9KH`}uC!1_hhm39&9R1i#~z%6qZuZpgM*j zp`D|TpvE(BbJVK57a3cIEi?p29W^l)AgmS;Jh6P2(OUXV#MpC$hLtJpNOcB6X&x!< zK!plxRbrDBm51mABM}J+Y7N#D5w25c)8Q8xQ#szO!@RoTLhFq%zNj4Cr% z2DXf=tcuG{S%(>`0+%#`M9VlLAeCv0=#m66i%(ZLRn9b%GWB$>^)n7ao%LRY^SAWgF{#XBs|M`#pnD0FM zYid8BOvLs(i0fIi!*t^DCnv<+z+7rxy*3Pcirx9hgql^mre3U>R-S6CXom@t*@Eig zoa3uPBO7)*LCgj3?(7gYJ$J?yziXIE4`|r$^-L5Ki85+MaN+_>4Q(-*EhNpmoCWr9d10IkUXW z^2Sg2Y2L>Tk-Pm*_;+>9{lkC8X=7O(ukrE)GZ8k=4rnjm_hS!;e2@F}}p;1CG@Wix(?y-RU@fd`SNd&y61(aQdp}Z2g#Hxx)UVAL70RPmV5A zwKsWl@|v%`UJws9Jk8(a#`!b$^*%>?3V9h|uR?Y@>hp?o=c&6JTyHM8u^D;Dl;3u{ zJUMnqHppoOn}{{L=;{@h&TF);SY1;b9tv~S zJGwlfm5xSfa#y3n8GforrlHOq$^}$xkg8)9r)VXZ-k@EL2@Z*X7i_)3bOjY)wI-y1 z8&;^w61~Qanb`T_$W6Aa{ggwg5w9EYJwpX~G#Cw024oGr^Vq0MD_;bo2ef3!mM9q* z$>LzxIzBVxT&@YhY3i_GFd7k!;+zdFRVu36g>9@~Mp0f#MWR~C{9g@4s) zYF7{ygE9qIKqgTkUQpH|VhCkFjJCz)tbzv>NX8;Vz#0vCz=#1Ez#38>==CrB@Q=;pr zv|ySBs>G-^WL*(fo~iaQPPdJV6+}<4Jyq^#vPI$?uRE+8ibvmD+|V-m6_dDw45y@v z2}d(e9#*XDinz$kk}%E&R;Q<&*^Eycv>nNAB-a}zUBjm8X@_(4R5j)UrN1;@RV#<=3yV_s*g2oN#=x!%JCX zo?POKZ$DiK7rTjZmW3%%go@jmRblLa^#&!XumaZ`a@0f_aIPlOW3@x16g))Tpax49U|I_y8wNE} zTT6}xr4*x5q+XG`Or<@jSlpVXh_nm>tw)U$oU&M2bmd8`u}jBLD@<=u;&BdS3EI}A zu*TU`J{SM;zx?n1P`5oXW>OY{E*uz97K0-8BW70NLO?l3zp4tiM)%mx($}ioX!=~> zggz2_LzN;Pn8pf=C+JAE?lEaXu$eeG$QI8?Y87tCL^i0{uyLBoEz35(GvGZr4_Ial zy`gV1dJ|}ZWswIC*^pE~dB>_6i5t+974x;>$NHRhA1;hX#ekXJ1^u(M8S-=1 z`!~7#au@li;^6bA-1+?r7+0Kq|1#u(csMY9e4pm(&l#2r-c2^h^WUcHSF{iIS?g!K zym5xvjO5C)KASKZ9}=YE&D{wH&u%m9>=7@YaOcWCgI;hr?9sOyL)bO0tuqeh*L$d85KcM;zd$c zSvD;3D&s~Cp>PpQg4!q6USk|cP^7d*QcI3SXvm?sUA(IZlE5pJ&R7LGIznB_6j}{Y zE7B&T+(?I^MitL@kwn<4b;Xh7A({eDHx_*MjHtuqqTT zl_`!aQX)wz)y8S-I*OL43|!SUSX(-Sf)V}!v-ams2q_k zH#LJwk-P$vGTtoFp}`mrQY^2Aj2MOI0>~svJKrdQRvShlR#o`kV{3~9$YxtHZ2~bC zrbWn>WD_}SYL(E`B~n#EO2xD$jOB+ast(E)=97>RGAbL8jE+67s_4B#P&9f8WCqEY zwB>mz%Jy~uj3P-UYZz7OnatLZmx8MDHa{SA0#)rwEI`AE#uG>=s!_I<{~mDoQck$F z-E4o6p`5^Y)=|?aA*+C-CEnG9q)RvTZq3WD&d{OSu9g-WrrGV0BS7BuZ1Ea*!LGilne@Tv8+2<-*{I<@0Kc zqE(qLXetC{x)KMJA|QwrBBmsZO|jUEjVLCV6i`8-oF!+$YCt+dRikZ*eI});b)!Xi8;{N^nT)A@Pm(Hk@`aIn5CUj4#pWvt=w@Q^!q z?(pfSpYq$k{o8!@*=Kz8(MMdla)sG!_D@2v0`T7R=+Pto&p-K7{-;0sANbS%<4<{h z_LyWH({T!QAf8VN%HkVOyXZ-=Mh>RbX~LVcflJ9Ttvt)q8Sc`8m?!8_6VIkBZRYIu zb#m7*n3|oPJB9Fk9WDabBvOTN+ot&#IIhkGuz{P zBTa?{1?BRP6IQpL6SL-$dT-uz$DX z|M}SyR=+dwt=Ev#K9AqsC0zLl?&Or6_dej!>01sqw+V00IhE^t{btRZYZP$nsZa1(quXqxVxDx}nF5vT<4SPSDQ%PbyoKj6j(n-g7@E*JO z&KX``0~g65;F~p9XQxQDk9HOQY=`Cah)JthRr?G+F>gT0NJf#G4a!@{6ROLe+U+t) zHPJ1p&!)7xqZ=B6H7wf+Gg0Ke!%;Cu zM55-@IdoDu134)+*-*!k%~avN#wEyVjZ(U}al#sOjnWZ?8xok2AQj47~mv5cKz za2-{&^!6qmN|484Woeey`QsE|>5 z%jzntH54^@%fx~TCtwDlvAVeSJ*emzdW)$%-B29Zqq0=8CT?`$&>BPBmIM8wKqu!C zc@motESBPWj<%G|m`asGAq^pqm|PQkg;$Wg;3`FjE(J8AaX~-@5XDjyb{G&-*3c-5 zyFXb(mGGe?Q(7>?2xhwswjI_dvyk(5h%gbFuyXy;~KXa!Na+qpi&@?q2MxzB$qjx zx2VmEeIMC$J8Z@k))^M#0v5KEl9+Rx9FUJZ{V;OuPTBQ4bQ{G+1uiAe@+2^E`$#2> zwr73iCD+d0aOva&@;K*c?+3`aVT={C=8T8)6V96t_^dtU3$-9~%Ig^V;x%X)K@ z`Smv(GVc}@i))8{c4Kbfghe##8b<= zul+8r{xRz}yX3=t+<{^xU+~#@gT39`9K7yXP=mfe_V*d}ls*ph1a>DgQvVK#_i)#C zsNSt;=QTs?xiFD=+9RD>hV_(%)TDZjr)DCNORb_;LbAdp!9hLH)`n4QQWt3}K?WH6 zb1IjyZjL!#V5bd>s)xR!H3l0ko{ltTVpCJujv>_ON~4Abagm6@cLwb`Btc#oq!x^1 zl5to+u+oV-8O$<}oq#h$r-)v&sVp^#7z_Rb5TqRDS7707gM6<#U4s8N9 z)@))&5Q{!@7-tzw1~p)#MMQHho_QW&*uhr=MpuM9U{qpl9GQr98L*_@(3mA*tqHke z88dp`(N`6=2Wc*dW`=GrNX)3Kk)gLNUB+%Q-WqHpgiuOSo3)`A(0*Wg0?W;Y#t1Ga zhCIW@z&f9EC^e@`kG;Rc>6v4GAncF3q)U&PtmgO-*&JlvK7Yk((-1DEoaHB6df_-Q zk67QkNByMX`Q;13o%h%uTY@=YQBP^&Bhu@UAzfy(UK2m4*nL`2Ke@vBoo9qT<34-M z%U7^J-e;kou=mul{LfoXF9KKp{OeroJmFja>A>>rQ}*91dG+2ozkha<;BWHQ8=7o5 zY2Pqw8~&q{C7-Wh=L^sBYi}^Ou5dQqVUj=OxH%!Yo__y1s~_EE%>_H}ofYQUo6FeU zmV;eTE5Y12WiK=|dn?YS4plkaiyE6W>;0aoRJ8jRsd_|3{M(+LUC+u)xx5)bUvTL6 z@UbPu0kYxp`5Z@w=$`#7_30v>SrZp2gMVrh;mLcro`t=K~o3U+NlLq2a#-D?Ff`=SkfBs*#!(3+f|KnrLqw#8 z5xN|4I^k^vN})F32gt5Cf|NjtEBdyfmKy0Yxzc6u+7h@x(5sr@ikRVmDuCZMR00H3 zLXPY0_XZs?K~O3~Rw%Q=j}5f}ykcn+l_+2+Jf{tyMnTpotJG=s>%?6)}qvm{KlaS>?9uw!*>CgC@Hg-GS+S5m9t$9n|R;B?1w( zF$JccHA+<3!bV7@+~9-5iUw6-#1*$>P*^QnBrF(jNjhS@!x$+2K*i~&lp;vnj;NlX z94dfv3hyn}Mg&9DV`)yz8VQePM@Cf@5mr1B9NI-}QibQIAjP)0MsXySu_h5ljoX6yC4#mkuFz~n zc%wB|O1VVVi8n8f`Oy!4%uj#*LwxV4nueyX|4E1nzla<*O~d~FKDTb&;)4%9;FC{2 z;r8v@T)upn>2&(bxEJu%alfyO1OEM+5Pw~~Q2k1@uSChe+L85lfZ6{cg4UM=tA7vJ z{$-)-%Q3?*3sb*{5B@@&`sMS#9WngXSm57gVrgxts*1hcUGChy%Yz3G_~tji$?tya zclr3^k9qIC_t@Xxr)iphbdmJS5y3Y{NBr5p`wsu(AN>*k*Pr|eKl#abI9+RuzRHdg zTH~1RF1g5x)<(|i#O1hTks6xWn)q&?ev**&2#3&I5!yIX4K?9(f~|Uj4jgVSs3uE> zH!Z6eQ2mO{t#@3P_fU%ko9U9cBP=I1tI$v_p5yi=sF&~9n33W1F5%r0J>2Kz!81O2 ze!|=KDyJvAur{DJ*k#ArhF)Vt(hRTsxbiZ@lEyuH$z88CT{n`F_c* zbEx+C;i|%$XRPXu4|aC2C)e3u?(pXJgiH4?)4YW1pZt(l<14Oc_{dym@rj{%_=?jv zcTjgPxN~F9lPA}h%v;_!j-UHAN`J%^p7VqEcZnyjnJVGro@X9wZr-afp(pJP=*K$@ zb&XV(=JGkS-8t@6jo<5W!xVkBqgEQ~eNS zGxf|M0+yEA^(^L*-Bc5@Vm2|1BvjJmF)%@~b}bDR&Q&C9iJJkjhBgav$Ozy~z{FT$ zH!-8D0MTG`shu;mMY1BKSZ?~L3hE+dg0$Gw<2Mc?(8di)M@WjK72_B&3A7e$v|vCF z1!0hie1uAMsn9bKJt%scsLjZz9FQ@i#pnR^pln&L0w!yW^b8n6>@mtPs#1c)s1dy_ z-N9gESu71vqCw#g@J(1|z*+6*X6 znJ>0(Zk3@IkCue^vHZrM(Y8begN{^6mq?`vh(ydL(Ax%=a&em@47s?r9iZs&$&v-o z2E|a8f08i0LX09XV$ej&XMs_pTM7@?2!xDH1!15>&>2Q4c!G*R)};;F52d(8XCd_< zIg_#`_9MC(OH@&*;!KH#VY~cHdcaZP(P%HoX(mn#Ic!Ba-GS1?)S+`Z7n2&uz2jVO zXf_Z!&(QWbiKIBAQ=XNn*o|vCEl@c~72_CKtza_K3~E8r6Na>=@*`t2p)--GO7v^+ z7YRQJP*t!{%v@mPgh>Z!N9cT_>*u7kB83w|nloGMFtqPjUnION=wB(SdPa;rqaGkB z+?$d0DLkBy@T8_Oma}-mdc4BpO~ogN3no8Vv$9ieJ@#~$D&AYe#!hkZ30KycH8bvp zKSPes*uQj!+`7Tp(^qU>dQ5wbvn!{3_Qk-@-hR&eS1Hv?YOhE$JOhaw?C>_J~(IIA0S81n1161v-C~o$1k{;zv1qiB{$yRW89pv ze|$*u(UhD<9&B#V)`@dJMf!^6;hKI8S7(v+a)L}1yT=X6SL_+jc*C&T6J(WH-KelD z!(siB`t&+kj~vc3Czon+b;^F6F{uZ%z|ds+zQqiht3%82RHIe~af(W6dJQ|GNq&kn z9-TZ@U9;4IS@wjsW(Wh=p2Q60G>uV65304Kq!2eU^lK_-P$@HxhQ3a;Z7L4JC|K?3 zbVhGHs&YuBNJAu((O!cKWZA&b5GzOS6?*FNQIm#5b`>ilOqH-viN*?kSg@IIn2Ez~ zDtypXIgshdvjP1t{;U7y4-+lP48%@TPb+lQVSOl^hBhM!OwcSuQ{maf7K0%vOV%S5 zhEQ3gg=j_;o*WIPc60%Duy|J!#}O9;!6>5DC~?SmMpP|vVX=)N4vE~sQ8@Yr+hLN?V*h+_y6l&J8q|Ju0cF@%<-H1%5jP(VpiwLl#zZS=O9CZ+V(pKD+#chZlR;?lC{VG3Anb%+Z^VIe&ANL*8;df5z^+ zA9Iv;d6O1=`0yz|mxec!CH}WAaDVz9?b|~R`3ZS0Y@UC_`~CNLe0AW%`Xl!3&ykk{ z&)>k++wZYh9`bvW%(WM%Ol}=f4+Gb}@Z8cX4j%U`Zq~HRo}DY2=G_5unrW(^vHs$M z`TZ+A>@)58$RhRFoe8*}X1C|`V!-t^hc_l1kA_yYbWYL5iniV%>lKYYWxl?~i9TmN zzF-m!^{i&CG8+SN+M+IIT+y#k7*=*e%`Vy1uz@&n1%lW%sJKBe7zd-zs0s#M6I!9o z7vRCD#In}Z7M3U)S7XG}>x7Mlv7X>MO)U}SG|GBR&h$xWqC%%kKM2lP23s!3DhlFN z*&um^PKq%J*5q=2Yam*@a_HiPVIvhTXB2{%MARA+EkO+8K@m%3?-g;9~HDxzlVgi8n=>r~U07GrD>5RYd>`@+@|17ZS3 zE0Wg*kY2P5Y%`!S6kPs+cm;-v-8k5)C=0yiO_aK3BuxO`>o!bkdHyA8A zbr?E=b<|sqSSNt;Xxg$>9TdG;Gm#p)NVK}Vme0fyY^7mT_$uPFM`#!gw45?n!RCN+ z8^*0r>Wm;L>SVDhm0X`15it-F$|Z7V2qt5K0@s(VW**DhH5R5tR>jezB|sX;lY~tM z#IuP8qYA*4P)@srq^-NK#HypVsH8z9A`2WfsxV2B*n?H2h0zMou|ZHN6ac$uaEVbO z7L5ex6*w|U3qEhQ4L#eeKo1+cLhHKN^}Q}!FM+JP0u}{)5?of0O8n16Tijf!L|&8C zc!AnT5#3S|fV3*nf*gh9O0_wXu`+HQIEh{fRWy(UTN{*0IAd9Bp%Pu9hDs5XD$z@$ zu^FsXXsr>kL?tvPlqQ)ND7^V6cqKOL=TKsq+CGZI%%R#IIR(1 z;>St}DnM)$RvaO8JbM0|zy85@dGzE7IVS45{znC8|0b8#WHRC4;DB4VZt>v310Fnh z!2SF8xqkh60e){qxL*;rekuC=`}`{{{~w%KU(tdnU&X@G|6!eBzY-JNwkqm>K#cIK znhAeXeDD_zuBxio+uP&XwQJnJf1i&({+Q1``{FF2-~a$107*naRE*#Ht>5BnU;7%j zZr$SG;DE_w@=wNH^|v26XHHK~`R-r+HUH*+{WtvE|K*SQv%mOD`qN{g@9=V&rcu=X zEt|0=ctNzqY-Suw&rAjAX6U^GW>)b|BJ;{}c{4{D;o?*=jw|Y$J)`SbomIS7dzQDS zj8Ar1-h0R4>N?AM#TB{7$?H?j*`c0y__vwEh2g5Y%gaxeTz!`q-fPifSR6mXeZ1yk zrMY%|!o&agCI_2$^mh{W=oQhz{MubY_Y+>t--pF#eEZ5WI1CVYuDl%>nBxnKZw|*N`WW##RxYoc^FvNH6}MGdR9uKcPyI- zv&kMVXjEHMje((wcoJQ7Oh~v%X4MH7lSaOvL*(H5e2G4VpEo(!6Uk`q*UsWoQYM$ zOO25ck}j;rt^2zlG!+BbmN9B{H9*RY7n-_K#3bAKRg)GPnHzNMh=XCMGTLXXUSLB) zlx4u;RS&UnMpZUMMv_os`T{x|^18gfLZck4fQrmGBut8ITzTzEmEpu^gDD%^5~n1f zjWBG{7UIhGPN`B(lyy~jK4Oq0jGW?B5f&O6avX7^rLzG$wLl{D8iQpp8nqr7hZzn} z94DkI5<5%l2G&wx+=^^8(iyS?yQ)g`DnULDs8(3%5g8S((hPY;9t}%+(#4eA_8fcI zuRBhunWhfs5-uLGVV9uKkzVLF6STIhlrSu7X7w?h&veZN@d*5N&-m7%yd}jo3!BKH z=b2ga_GHbaaK?GRL%Y|oc^;5YBb)S$C;bk4E5()BTWo)a7?{kn^ zhJMA3G^Lvwy5mFau3%OfqvuS`hF!IXm?dL!R8q0KHt0hkICzswGA*@ZFk6UHi0dqeh)Xaiad#-FjNb!p;? ziC!z3IFLeVYO-Ty$OElZtb0QfI>Zm?Nn*7!Od3yWJ;R`}$zke%3=NG+`00pI+qAbuSs@8)F)U~;euhK6{b$G)P!_QXLs52fvl%k8Sy@F0GzrtDont2$k32w zq~iiNsc6(LDMx(h@#{HOS8V(%uAH^hlZLl@7gWaJc3a+g3+{sTt6j#~8aw%rVJDH> z6+2Ib$@DUV{R!4xCqMcb=F$NtbB7xi@#E)R2*nSow2oh^xP3}!cD7ecyh z$QK&b20~@o3pPja~xIKF0U-Q(Rc|o3_xjDDJ^Vk8s|#9tLwm3D4%gyf{R3xFug_^AqBQI zr4TY0-63A1>jA4R>mW3`SirM#MffbcEF6&XfH#zzV@iHqr$8p7Oo=OnwI(-(S>Uz7 zYEKM>gSBx9my3NVE0C!0Dq?yID_yKIs<6CK1E7i>JD1dvF_1B&SQ_SZl;Yx&63Zic zf>G$+V{~F9Z#hgB?;|-nwCNc7iq=42!6vpe*03Bj^>zTt+2SlH2Z}&)dTY`y4irLS zOa*2yIU!z1O~C1lr^Z%-XC!-#Xd%dmp@AG3MPmWu15tZad4`h=18B2lj%kHnDq_1v z>AwN8XP=Qe6@WYuB+-e(l8I5ssY6*yry?~%ih|m{J!I%&5%v;2A`PI4eTjsQ-KxYK zO@+jABcznYP@3~(Ef_bV$9ik86GkgoafJ(2slxp-5o};(9hH=2Wb%q$Yg!R1zar}i z28H-YW`>o*aw>ysVV8B70t7{aK$0GEjpP;D)J45hs%$rvCE|;lqlE6taD^s}7Hu4O z#b5-h6yr8P8dLSmC!op_VT|S6LL4#{fg&qQg(9mWAQ>`! zuLwrrMB&v)g(fK}&Z=0{$3ZfoSC~3udj%$-#IRIQrLhRU6n9nC0wUiZe>-gjyt2Wzh)|no%n%ow4E&QCp^%AgTy#^*W)nA?ZL= zmRc#4?it4#TWM5ED3eiL#yLw)w!E`GV{3=#0Af+jqehEz1<;>tqN*IqugOvd?x;-> zcy+=BM~Vrh3x^|!!x~GL3@H}@4M^G1pDlUv_z~az-gkNV;srTE(>7F9#Xr@DF@~mT z*xTFV>eZ{?9ag{bOUvKMzS8m^KHB&z z4y-Rbt@M{$48I~W_$6@rm!a!z+j9BxW!}4Wi+lI(^XVs_{!*y=+X`p zNv3_aV6nVG-Zb<{kTzo9z0bNm;r*W;v_geB(x2c%$9z7gHjtah)JLw1=As63 zQn7H6+JX+2tQAu|h3k-a%pxQ z0?8J1fmUVeN--1gIHeICaX7Rj!YC+JK#^7ns*7MXDwL^8DGI6pTRQMk!laQLh9br! zA!tQHV=_oDgep>xTO7duOWvFGR=TcfTG!it-D=!NIKt8Gh#k8>`|Oi>GAk*PDw+X^ zUs5wfff(c@{{v#gAVFfl3@S$;BveqUhI8`tx%)0!hwX5)`mcFA2Crjhl2CwV`Tg$aey*!c3|1005hJq@NDLW=5EY2vNMw$&+JN_pP(&&xXa|XjhQVk8 z0goYGpEXjtM2ZT#25OV-f*M3SAZ@}ak5M31qL&IC0z)Mbc%m%O^ayE@T4oEf&Vw&a zgw{}&5HsBZ*=m$h1nFo2D{|{ZY%&tVIjDTbO6cp01C7Y%u9QgRVILR>S>7WviXBI8 zN8^DgacMxAj(#bLK_NoQgHch@Eh8gUut;E4LTQOfkt71=gJfzw-U|k$D2jxU5?2^P z0p@B0lYrDCTIHyPAPgCOA_vE&31~K~ltxTS{Gds#L`O**S3sZ*J$unGq>eg*s}u2Z z$<_*HXv8M6=vP#$5i8X*R%dvz&8)a!@3KdR4t=~}C416YK{^7rN=Vb=ivjB+)@-dc2{ayCO ziss-kzdHUM+vOpzo}3Yn9O>Z;^ph*jE^cxD;b+`?ZgFq*v|CI5^4^cwtAB|-Tk!dV z1CCEm_}G2O`sH^Vy#05%@#&ngShFp*x%f9vdHwnm?!5k-MeO?~r<%k5iy+`VSDGi7Ui$nF}##WAHCF}n$4ABYaR zx?vOrW4+6c-Jy)IHJo6!?oif|&}a(fIGaxynMAuD7}+s;D%l{g&ZDXxyPh!BORCtQ zs~PK9(Wrsa3Fs@@QZPyjj4F_=Le+|xO3Kc&9JMI#h)EzChjRlpV5sn=rcmHoi82+U zcj&UB@L-KciOkoM1oR@%)fR0PA_n@U!Pq&))dZ&%Rs@!|!fhg22)a%Zwj9bel)7b6 zmDHOxtCgkHg0(K0c80!Oab+drwWeBYbhAPIC;#wI{&Y2zjC6;tB$5d}T~c->!VEZ> z&?4faC0I@CBvxxm(NY)0RGQfLV=kd#5`gsuYZredTcPFi|Onqrk}r%vFN zMwJ025@yigp&tqqibg6H#-dBbhDdL=s8+DiiisRp7J|x0L|riHdgeuq+Bontw#1la z^4K({93|MSP)0)IG3^#5isf9QqN5a%Gw(4;FeuHd-I`SuIeInXvUthPcY8Et#+>s?IS}`$w=bv-sIj8ETJuugV@palF|w$x7;OyhGO~yjJG$h| z2$WB3CJiP8SQ{qwB{3FMH>ULGo@5nqT`+2L5F_iv)u5>Cm>CO<7X&+^wTWr(Nj9(; zg9_J|+I36ONn+JvfO#pYE+y-UK(Bi$ThjIkV+2G?S0oxe5K@H{Ava4@j|z&u7*He> z1*%x)RjKR7PPW^6T2Zo60)auV!Blx_B|4KY^i!@o3$nsjI*pDYPno(7BQ%5-X>D#k zi5y<(>%)V-o`T8f845);K++w~X|&RaUZ9O2X@@9tPl?=0N22ivfTnw}Ju@ z*(#h7Ser95DQuPtBIq_t1`4!~Y~~tKdz4l5DIuaqS`fmcV?z1}MzA7c^_!$8QkZL| zS$}~kY6=8#1G4N9E>kFkDM&Knfi*FlrSMX*}nHXsXynQOcS88tF=U=nH= z(B6XaFc@0X_Zf{c*#1q>BZT;C2E%`OU?s%=6WgFb3iUS{TH=S$>HjRi z5>ot)km_%=s-*hgHNTWn7-J}kf~INM+1cUNty|oGaG!?{AM*bD@AJ_|AMul){DhA` z{+PGlew({@?{eeD4W`rS4?)%6_Q(BA(`r6n@VnpsCI9Vz^N;wm|LVWwXaDSf;pxj0 zL@~oEO=$C~R$Cfsd4>0yjT{&iV;FgS3r*?SHa%@SMqAIKDlqDjt5r>14!Bi=mVsFq zb2L$$FGslDOC~G07>_ZFirZqzhMIozoOvivtAVb+fOAV+-{N%gEo%#J&l26XqPr+~ zJ)hBtAH!Y)>58g;pV+?Q^{clyw^v-4-(&Ef<8RlbgC)CS&DH61wq{4D-4WmJM}Bnq zD_XAbuX|pN##|hHPV$n}FZtIyOFKGb>&1rCs~P|Ht-sIa^)L9<@7?BP-f+wQhP&Ub z*$lTidifR2-$}gqeDqrL)j`8u zIVBd)nS2U;Go^bpaMjej6*aR<&#+aZ?3|@sqJ7U*5{&wmd0nt23QXxSlQ}ytw+VVf zIjSk-4SKIAM8qq@&~LL43u>`XELS8srgS~t6qGj74uO&Ca7m)mnAjxjT4KbUpgp~> zi9r+Mz}gg4vCM{J(PP#sGarkJ~%(kt(Cu zd*{)EL>h=P;6-i|Q3XWG(T*`0Z*lGGLLw-yr9Cz(gsgEPp=?GS3?`v`L>CqYgHi@@ zEf~s{#SE5LPG9@n%tPqVR#bk@D)sncN>9rc0xt@dCJ@a)X9G!2@oGb%N?IQoydZgl7J|#J zq@QZce#yLQIY@!F9Z?UFezRb`s!-Jm-{*DEzPq6P#^CQLcDLb*lI__VSI)Sr4tR~` z;CaQ78hJA5Cx_&HBkCG`jJLZ0y9#lOqw z<^RA}qxTT2ee`#Cc=r!qaC{(`_j?S>mfv?hzo;a;FOTRCDqh=;zjyG6?$(-kvCCxi zfbFvpJ9oe5n@!E#P;q7&Za)wdt3+iBVpns7qa2Ts6NwiC^W7ViAz-gyI-OCCc4?Xg z+8So6VyiB>(2ja#G1lQ_#dO@DRf&@@@ePGc6dK~Frtbu!B=IAW`N)+d3}aY(LKP`G ziE|MtYDDxXTN7PE)QKb=dKQRfHqjebgO0Qz&~+YD8Cuqu!7?<8;u`aUQ|JPc5-du` z$iZ4TYNOD`ku>NS84S?o^OnKlOk}7mBNf=F9;-X5ZiHGJyc%dzWK&DjpZtS=@TY0l zP^yxC2Bm1ZOooQU#)H;1Q4Ofp;7mlTKr<+km2}HRhS+XKXlqb0FsLO;H3TPcLJ>QQ zZ30niw1D*nR8b;>Bbo(mC@9uFLDhtzM>hszdhh`yFDd5@y%7XWe(^S%I(kwWFoIA;g|q1C1?Nu$VedBe>?D3gwYtdqZKCz6CYHp7QPF^0+9nq+l|B!f5^V+@OgNKiatH+Gj-*S_WdFF2L?#V5h_g?a~-NPIo z^Zc3PXu8e*_KaupUB=68&JHb{t$B50Lep&V-D}0ep~D?U^w}fE<^;DKNQ)^O?O@(g z)$g)3nj@DJn(C5%tL26<6k8o>yCf`5s2hXXtVlzNwHtIf!nlBr1xi4>sgPBR+TSCs zTdWmyy{8H#vgxy7%Wbi+8@3lceW@v2pz8{%K2e$tYcnBsfmBVXj74@mR$EHDrmrks zfRU1r3`!1I5fN*J)C!~|3;~2B6cS5G-z`bLf@DZKYkotQaRM@V%r)1k5CNeCy%2=K zqit@ys5FpPJ)$rf%xz&%0v!cLYTPyZNl2BI!)c9Dik=L=^HLzwKvV@%1jI%niu{AB zf*LE35c%;dXUrK=>S~{7(&$O15vB0Q6 zG9K3`%0UxU!U{)>B}sWC1wkbGq%cxoLm>K9hKw6U#3Q7nH#LS8X|Tw$XGx7!d3_1U zlR7C72BKSmiiln_)bctE6@Vddy-_H2w(cwvCIys@^dxlDKud2cdIJSAhqD1rwP1AJ z$cj>-&a$0T>%<^DRw{^~L_#P}LeVL(Ci5gx5C~&QCI`N#gpr0ATZGg^B@iu09T|i` zP!*Gi>DUh~c*Jt{Q>qp(usCY&&61o(IjWzFmuYb`-YWE>cx z%xsE6GiZmgFoOHCc)4>E*o<&}t( z+dkT4+mnt1*oam(n<7QT+Y+-<#2T!$#Hdj^WAaV(C>v0HfifN`HOWd`5EQjW3yCQb zNosT#NkZmEw9IWtw92hSs}aO}u@W^wdkSUg$+pBOG$uHFDOfD7`1bSf_}Q=if>$q} z<6Xd7`?qe*@c&M*_1D9#$z;Ob-X4dChupt^pU00M^Zxtq|Ipxi{P-~s9z5Xg-Mbte z9dYBv4R&^R*xK4+G#XQ12YN;uq{?vP|HJS~{FSv({I$?22U*vDC$57iA^$H|50%O* zeN|O49*^1HnzFmM%Z>dT+`4^>yLa#M@ZrNBxM3fC^btS$(MQ*R{)l(pd58P=?{j!~ z$ll%_lgZ?N6H@(u=`nr7v^qaO=U2b}4S)WR{+$2xKl?NO`+xRNnSJpEixgM^YP}(* z8h37CQiHib^c%FOiOnwCgiy5>x`9Hu3)G|&xHBiJ7| z42zds3@!V^KFb~0dQxI<%)rm+D~;`^>>O%b5g2tHzQ4ik_g-?|f572p#zaTH5Rsj< z%X@?7>q$r5&qIdvG+TE6zz*dobMOy$>zVj$hNQ=E$9vY6Zt-&y#eUH2NN1bbO+B(7TGS zmSb)lY{Tk|x2J+`cAv@kYX-f~mp@K~r`vq6{T=<~yPWT9-myR7^ydG>)%y4Nv>1RZ5NNLTG z5`J(<6^UnatSp($7o`2j5LWbYPS{kaxF(hbZM&i>I&5*t(->&d9nRN|Vt&Q;{Xo66 zJUP8$I4s$nT~aVYE|yf*5qZJ=^ZOiMb}SbwZlAu#u=S4_*Z24){&W1V9IG35C|+Ih zdiyS`JU`k$Nt_-YaD1`P{(F&TU7+JRX1dRl&mwPa-$M-pqw0v&>lJ(Vk2pK~g12uS z@$&PYdbP)VdxH&^n5`3l zqPB>|=2g<7V%>tEqf(M(QP4Pz@PWA<*y&5U*wIWZ3oo#ufb|+vm-rAepjan1u0)y* z1vNbzQg2Z@VS0xsG)@^{z_$kGcM6Ds=0ZxsGY6 zxClLUKS7k9b;=iHL9S^}9ffGACk1_*NX3eEFz8vNbCRN7(9SCQtt<4opbaDHW`$d? zc~;cu_L4$MW^N08agK}yXSJg`?O3Q&wq}Xby)pIL;jRYyw&Icac{63 zuX|o@ppZ|fi#s&4b3QxM_`Q}#=jVK`BcDtnKVL+S_8;(Mwcz*U`~2+UE7I(MCT%!+ zaKd*NTeOD*pS-GA92icY{e~OwBzD6V=Vv<{yqfTp_%-f>59vNT=AB7JS_{7XQDR@; zn?yEzde|&-bon}jZ$?5~ikIrw?sf2j@5yw~GbI&f&>1{5w;bwP4>z?wsTJd^% zhm}pdy`^XhLpquB?XBA!=`A{Sj+_d6!*GL~C8LG1%=txybkzR_u9Upc!Jlc0YsC-mXI_`B-$vc zWRD+;+9nK_9-=17m@lrbm-q13e=0ykVkQ_}6EjT) zvFCFWJ_dB9*t7v#DU@#!+OR=W4+&=@J}8U=9UTdUcL8C@;Seet4rPX04g|C_Im{A0 zq=H@~N(Byq4fz})ydz>5@}Lswq0if95IsUFj1#OCG&0bW@{BTWkaG9>ehm;6t%Q=l z3i94;0Ww6qz2+Xh0fy4ztt7QYW}KC8Zk)gm^g43_hN=T4D6#Yi3J=K#T$$}eTo=({ zAYf5+xClm;^mG*7;(Lj1pm$K1>qp1EspxsoIn+`J=yQ)f7*HvZ!~(&D6ayhiw375V zGzmqvDRw|J0M@a=Py@ssWI;%vL?AkaG}mfv2d#EQsc8Il?Jo+FbPT~TC>X7wZz5%k zMA@>SqCvmGrO^|yw8*Z4GB@H#0|99>xJqM&OmH8%Y(mu9 z1BQ+cxz<>v2&KSxAWBc)DMm&7VM+HIZ%<7{I}a31530(J#2%!|p`-!UQBsTils75! zvApZiNwN%zkzSEp4I0*>rAm>(m4vjy$O<=)#8Dz{5^5Dm+ljc0Y*eJMi4X@|l*kx~ zA<_*IEh8biyzUSKE_#H^=AjTA(Is415h+N~(RYrJB%zB)6NsBga4kMSta^qJ2wsyy z#DxLT2T&e2M3U5WKA?!ixcbpub@c9>C^0R;OFL?gN_iX&Y zX*00pYDyb$#~b2yiAoY{&xuSCT}jW3@#qGtjX`d8=;Sb};B`N6b1CuBpm!CGU9xyO zX1KYe4HHH;pV3|HFdh;ox@2l6Oi#b0t`3-u6XD#Vwmois!PO)Z%0S^C&|aRfeXtEH z!$CZwV+VKAuuh*cKYE03PuTa{%(tFW?2VaU-h*d}`=cx7)eCMv+huWd&i6jS)xQCK z#e?))zB`<7zx{$I;gDwe3G2hpc<N*b!Domo*gM(d(I0qzr33rGoGLPF^~PXv>!+M*(tB>6fQquJf73P`W?P45kJ-3|3%AvBY5tA%p+-$kk`!saeJ^lk-d*U?FhYgi0nTs)7BvLEk|ox`293Q6I3JIO^A1l!tQ~AyAubd=VLqB<-f8 zCNYdg+|=jHhnuuIFsVIZJ|$K?MU42yV0D48Ybp$Vry1Hg&DIDrlt>j3A(3iHOlx#I z0RtPm!J{bJ0;gL>Iues&kQHjVW+o#b2dFjDH6-7mB=m#CHi|wtoGa1ZF;tRr*dQqAy+i%O|L8ydQxPM2kR($g z`Wm;06vm)YG($p!f?nqrmu4N1!V*V4awBNv2E865jU$GL5*2FgNd@>MQ6Zr!SPO~j z1U9zJb;2fawnX=e*nv(O;ab+Zpz0*iMwGD(OF>ymy3SFM)t)9+m{CjL87iYl?Tl6E zsVj@LV>)NBv>DddW=&^f8m?qXh@R9nlxCopfw^l~S;gL~7ud-z-O{3$#|Y(F5jY4l zjO>WIW_wyOqXpN|#zdRuaMU8Y2zr-E*TAz2Hq}0Qd(Gin+kA61!-qrmRxh~q2M-Y6 ze2mz8!ST`i{PD>iv*Rzh>i0RhxZ>VBubK4%aqmm|Z$=#Kjd}l@FZu0<8y6OV09!8^RySDf9`mk##p~0%)VySQbjr=Sgoh8g{Z+wv z`;wbuLHBh_X?ymo_t_af=liW4?v+nDuV?h-fE({%&Zm5{cg6j7kK@L1^m5ErJ!5$> zhN5S^N{nw8MDMYogSH`IKuW%FiTzq(RwcF$L~qez%#N>6`U;Ok;*fHLQl2hUjC_r* zCg@n9iW$*JO5YPhff5}PD;Syq(_5_9#7bgfg-dHXS3^|TLJf7ZRkZn6^0-bo`??vQE99X1SN64$jaP85|bwRCB_#76A@L+z(kX+ ze8M|IG(-bR_JrV&N+W{650b*b5CNUTA!V<@>>}}I-zvxg6Fg!N1TFA*N};YH+IjUZ ziOk8${BZ%^(Q1X-Tp&%I1Dakz9Ka|B?@?Cb)OB;mNc8Z=HfS;^UI&8HlnI=G)G0dK z;Df}qd{ zBy9>bBCDVk9?_QwQ|BZqDUxuAO~Tlg6_(0@SJw)=A&{)jA(aRuArU@av!_hHFs%ei zI9e3a1qPEXdM1F@16ov&1X{o#L3a|V2ZX3tbrPGhYEdGBh0GR|%IF!y7Kp_HN$lN9(!$keHfwI_KHwcAC;xWBK81jEwg=~;i89?v) zY$%dNAhj|FNNGS~u~A$<&H+f-+7mT}2dcdF*C~aG1xd&p*QsT0k)_-yL4qJZ20<7G zuGbQrM#}+~29iSPk|AbWkTL_VlNc)j$DkF3PPqja1ckIjD^WT}u4?EAQczo!e@H~U zPD;T9!$71|3Sl%!2yigygp~>v93cpbK_cu7MP7ApMN275l2nuc$|BlCR|+aLLRh>K z6tP86=76&gm?|L}#UQ|$HI?xQzsZN;4aic{O0u~n38cyg?ywP zB}u~?Q`LaNmJum6q<|_5QlX(0*s>(Xgh>$@Eh=i(W}woVAfZqisRo8rP~(uYKzN1K zDqlbdNiq>B4M7dqki`fIjV?sq=L{Cgh?No%6@`N66Z4_x^x1QM`{{4__3wVm^6H8h zBSl$ajQRh4sPflCrZ)^Jtu@wK%Ce-cYnrBEG#W7;j~S20OePa1lL^zwgz0qp!~2_$ zPbQNeZaW%{Xqtw)t|`kBYwZsK)?epg{i_gOrIc7Mmwf%r*Zj}_<3Hv<|Fi#sKmV`) zJAU!qZ&#t?32`8^OM`oF2>> zNllon>6Qg$y&{bZ#;rlkryR&RC&QFGa$tMrpg&@{J);RTmW$gI%TxB7d)!QJ$jpi;R&)j;pJw*JLAN+xAx&?;-ML^FJJKF(GG7V$*XGM^w~o=I%m3gpQ|*Z zJ3r;%?#JACcZz5gv3bea?qmMwvq-gLIbLpfe!AuZ;LAHZ$jK>-@rudhInQ6T{Qhmh zS5FH*iUId(!kPb`%XAyve8-`Noi8jmr;(j!-!L6N=1|_GxVeItxB2ejIeULlbNRDf z&VS;$NReCTb7VPZd2@#*-D9i!lJ)wCnP|9qe2ecN9nh4H%3SjDv|(>=iX^h^&iT07 zV=8y>wxKmIXp*5nOtfXgfmtHWDdup3IuC5Rf{<2JWsPVeV{eeXz>X@SkStS2?Ip4= zFhQXUiz^aEJ> zV?b6KqD6F$x*R|h#7-i$gVrOx15@Fy1k{iOxab*tyl&iQYgZ@@C4p5?6gHocWRP%; zvta3=F)&DqBB0kUPXx(Z2#UM{*UN;odBt7@NvAb(vqBpSF$-sskJvJQU3YB&76xPl zoF=Mlq6a~*b08B`B*_Je5`0Eav@-v$*D(-vA_j@n3gIljdYSu=c@w%p(GjyP9p;}Dv_ej!{q>-l&IJvW#(h) z)*y61c9Kx$;f0ifnUz#H#HAvPGL}Mzd~Oh{9!!BBKn{Ucd2G};yP)n{=<1A|kOH}a zW$7toV!d1<*JA=pMCCEc;rtj^GzcN7Y+$`v;;bS_jWH#yY$=OtVUsrOb_MG=aAquK z;Th@;Vy#i>65l1Jbo4=^)rQr|v(^*VoKXxKyJ=Bzg%~{HMZ)cAf`Zma=CNbvNzZH| zSg*cEZQbGd_89%`ibB8Qs=7_zK0&OH;dNw~2_`I=47d1sh)Ch6UT@>Sd5L^{gnscI zCnHJon^RgVefQ8SH7efenkD3UvpCJ@bL5|=iA>RJ{L%TpVud^c$Xh@d0S&H zBJ*8nLZs{VnZ_ONzbkmMs5o7%c-%O@)?KjP-op)&un8R08s9k@U9mBOrpSz&+6}C4Pna*RDE$q56%p3Z%MH^A zvT)R?BuIrw17)Z2F`$MLv(uy63ZoQ#atJ-pMul8O7)xTxhVnuMHb&8`1$_!A=@DMz znuOAV7XWT7rlOE9nP?Oo`A&j0Qx9l-oG9%$Bdz(Zq_NTa;{xe!;41 zP>rQXo=#NA`9K;u>ejRB3`@JF=q+YclU!sdG%0SlP!*!z&^kr(1?97XG?J+K!1-0; zU@swt6&GVmd$3^dyr3VAIaywDv)`ewJf|k{nudcPY4(2gEl(D|$JWk2<>l-FH$Q+o zuL9lTUGBN(j85L=#k=2dV>Y1Q+oAnMVv+VaK7B&EEIEGu1^?P)hga(hx{E+}_bnc5 zF4%7@tIauU6FK# zmR;$6d!OdsYmN8ON4zdyo5^gLWUt`>d`8^fptFvn{lr=fckWKahqvHx7w4L*;I z91~YP!wf_gw7F%97QI$vG11tDF)7h@_*G`LeJXOeG z3;27Rp|+N|oeJnP8;tDsYMQ|YlFJAN9TaB@eA|v0YlPN;6^D$!hUA0U0`r8Zh1}yM z6DdQT_Pe!NE<3$!6xjxHRhnytFqGJUD80Z`

    Bm!VXz5BBgb*D@}4knL>+OW9Og~ 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

    HdE$I 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 u%Q6L0YOp_i9;$39ivDKh?Mk5 z3P=k>^PKN{KhH1k-*BI`V9lCg&faIobzPs>#OUj)Q&X@}002O(sev#A0J1{p_0|wAk)z?&2!gLiJf0D*D~oNH(FZx^-^c9BRhC^Z>o&&bHk;Bej{K1>X;CZ{Pr{Uppt#03s;_cg z`bq6Zp^3&w@JzSz(uvWMVGjz%*R3G^UghaIK60nI{;`kmS1pRpXIsqO$1JdKmhVji zv$yTKU2=ghPWVS&r!s7~?*eNFbxevxC-u+bHtLH0!qVk&_!Qo(&$mcju6DwAA|B4C zl9PEpn?qH3RrqBq0jBF?KdHUFuf)F<3>{dVRm=%LtuGpD=RVi;4bs)cPC?T`_C!k^ z0Ym|K;C;hz0x9&)Rc{SbKL8Nr`|k%9^ilaK^d`B#rj8o+fLC6X@da%%iTUqi_6-h8X~O08NAnGHB}WY;cA>Dp+}EJJj=F zPI6>KawK4=VkJ2&jE}8P96|*F zQ%O~OO6IuHR1Y>g*%cAM(~FCSz*?2J?<&n_>%sQC)wS+bSn2X;qf_`$C;wib! ze@Ec|Hv*63qt)&s5QtQTiGZxB>FI%7#n1{&*8h9G@KcAL6^uN7|HUc=l{^a?; zcUZVu8XJ@=u(`QO?cw1;t*WZ(@V00Ft+Ab(TbYZS+em&sFVhuz`mu`f@o_F7k`KNK z{aHIZ8(XGLDc%3ve%QT>!7!~CFyVy@h?v!4vOt(UJ9D#v7xhe>3T9J^3H#xbohFjJDpK|l3~9vtlcOPQVK5~Tx6Nux zIB~ncTOwI9Ts|i!=if8T|6I6063F-8)|9wKY2^_KV2T97}}4=)(x1+M}Jh&{2hh7vr@8d3g26Cm!AH* zaFk*pIzfUD1H?$h({Db2ZuH%312Cb*zt_AxvIpEu<)ER4E~F|Otc4C2JU$gHLi6ZB zl-lbnqJj>0LZ^NSbLG+ zSkMD1bpM9_Ir&)DkFktUyhow3)Cvty?2CsT-|~!MsjyUpy*4Tu6~Kby>h_7+KMqs8 z(EYQ%?)u&Sj)%`=Ek?u0LYmrV^6%_FvF=C)_?>G}zs1qK^pgxEUl3+(NgGYK;lBC` z_!4zqbOfMBqM~0D@Y8IXsXkKjI*`9>%~HPseF7@}hwmOt8y)3L zEkr0$`{DEveW01)n1S7Q4VEZX_-D7G^}3CwM2rae52=9z6IklvUItyV0g4k=El<@k z+xg_vOH+~ber$4%2aJrYoh0i|dAwYJpo&uq9BiqjzjAdp-|pJAi4KV2+6IXU?$a2uRrBN*tF zR;6_B`*2IaZ0xiqtUgg_|_R|-^CE-p+H;X8l} zKQgxUr}U;J;66-*sG0+J4P{A%1J{WVl)9T3Y0*2oHr`ioTqw?X<;#ck!6H;0)Z

    5_AfiZA%|k4sGPb=t^Br3XQ3fE+rA&~A{RQ-a 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

    9g0)u= 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%0AO0>LYOMLw-YmdVwrOv5z4bHOJkcS@O* zOViPhBEOR=*mIL_ow|ZM`HK*Y&5Jb{@P|lN18ocU{0Col5$T>@73{DQ<1F)z;NL-P zV3OboW`iLmorAXSu1eh2N}0YNBUesB)#Dw;9?KR#umP31*QE)9M}?SUu9-A`-;{+D zsb8t027WDJeN2Ch8scG|EX`|@*MRp}eMP|-S)&MBf9gXaojoWgFJGRn^At1*Cg6&_ zolr=d(EDG%=Bg~yvB=!S8y<3HK!uFNj&eG*MLWPmnzrWn0PYE5O?U&H;!(Cb_kKLW zN2+RT7)bVg!glfU@KlqldpDvYl{@*>bfq0C5e(lPV$L%p?3VU>8ed#z2jgHnWIrFh zftH9CqdyzCy7zTyX^DI_xbAfNM(u>h)34}fkbO`ViWI~XIlXUqzmxhomNcD1H2p^Z z$x}5PaPjU;C4AZ1*}>8Vb5oN?c4nGj7EA&>7d}p6{SR18$oiDAB(nd?cP<~FN#?_h56GYh0NlF)~s1|=}O-zQvc6A*eJ%*JG?qGdRl_d zTr(nMw4|uQLpCN$GC(SA#+oF>nW={A6c!t?a&ovO^D*T4^|~&+S#�(XwRh^e2cI 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 z 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%0AX3An!l^^laeMgw>9gZ~ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/center.svg b/static/img/logo/center.svg new file mode 100755 index 0000000..dc28bac --- /dev/null +++ b/static/img/logo/center.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/circle.svg b/static/img/logo/circle.svg new file mode 100755 index 0000000..fb67f48 --- /dev/null +++ b/static/img/logo/circle.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/comment.svg b/static/img/logo/comment.svg new file mode 100755 index 0000000..8c3051a --- /dev/null +++ b/static/img/logo/comment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logo/debug.svg b/static/img/logo/debug.svg new file mode 100755 index 0000000..9ea55ea --- /dev/null +++ b/static/img/logo/debug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logo/delete.svg b/static/img/logo/delete.svg new file mode 100755 index 0000000..b3f6f96 --- /dev/null +++ b/static/img/logo/delete.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/logo/dollar.svg b/static/img/logo/dollar.svg new file mode 100755 index 0000000..80c776e --- /dev/null +++ b/static/img/logo/dollar.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/edit.svg b/static/img/logo/edit.svg new file mode 100755 index 0000000..23f0650 --- /dev/null +++ b/static/img/logo/edit.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/hide.svg b/static/img/logo/hide.svg new file mode 100755 index 0000000..7dda0aa --- /dev/null +++ b/static/img/logo/hide.svg @@ -0,0 +1,75 @@ + + + + + + image/svg+xml + + + + + + + eye-hide-line + + + + + diff --git a/static/img/logo/info.svg b/static/img/logo/info.svg new file mode 100755 index 0000000..7cc245a --- /dev/null +++ b/static/img/logo/info.svg @@ -0,0 +1,180 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/label.svg b/static/img/logo/label.svg new file mode 100755 index 0000000..45a2b42 --- /dev/null +++ b/static/img/logo/label.svg @@ -0,0 +1,91 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/img/logo/photo.svg b/static/img/logo/photo.svg new file mode 100755 index 0000000..ebc0e4e --- /dev/null +++ b/static/img/logo/photo.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/logo/precision.svg b/static/img/logo/precision.svg new file mode 100755 index 0000000..1114125 --- /dev/null +++ b/static/img/logo/precision.svg @@ -0,0 +1 @@ +meter \ No newline at end of file diff --git a/static/img/logo/star.svg b/static/img/logo/star.svg new file mode 100755 index 0000000..bdca924 --- /dev/null +++ b/static/img/logo/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/img/marker/cluster-icon-blue.png b/static/img/marker/cluster-icon-blue.png new file mode 100755 index 0000000000000000000000000000000000000000..06a9a60f2ba6ad987b8dfd3cc0e1be021d030711 GIT binary patch literal 25884 zcmeFYbx@<-vOXHz-95OwySohT3-~~i9sn;A|s^aL9d+%CT( z-1p~K77959rizXm{nXUaSa?r96A!o$^7TJ;Z=UPjueWtuMOot|dS}hvucN~Ed=Ep< zhhHvV$$b6a0^a7H{g|Ks9M<}GUnY@Jca=^V*Z6O~?H+C)!iX5dZl;MEjx5}V{W-*Y zy#MjjzhnAdMxHX-x3L@VcoV7Q;S;$pE8Eb$T6?poNT1M`y3MJ8(xA7T*Nl~pyQ!Gx z*ZZ~1??w-x=*!|np|=n8{;-KR#%|z?xXZW1SYFr-Hude2UQbb(zR>4+p_k_}&cdpK zgKpp1FWUQup4~MIFSTEv{F+^!yQp7yMsE)nyPw;T_Um-^m0!qy=bSwmJzr0Kh`r@3 z+_W@)TkkmQvO1ubsa0}+5t&Pn_1(Pe8fA8~bw#du90~|iY`QPI9*#U7thDcb-kU-c zmP$VfC-%VK4!`cI{fciIKRh_Z%U+wgfyUgtw5y=sT`jsjl2zT-8mMjbElU#jkm76P8G(X^R;b(p)-W{6g&w06sCUcO18=U~?m zAmJLJR(s82qED;Y9x(3_H@oO_Zc^&0QG_t*HC=f-@&nIC)kvM|~F zT;?A0*3Ed>?LyM?GMWk~oQ^@%&?`IC8Zmx&HVt&-eFPLTyjZG8gi`iuGQ@B(k#x!tKbr+&7p!7-0SpyIU5?E9mJl)z0yH8J9{Kmf-*5iC0WA`sMg}%%5d8KJE zcrwW-1YI7YV{G4fFqo}Y-?A{l^@r|f>Kj|iNLl0fp2ubAQhZ1~?Q!3Rm@4{W?G1OK zsw_%TG)NUn%Q-&4(jCU{!zY5dsJ)cnEmx>8H1Q1)quw+8>MG~^pLOAOt3S9NpYOwJ zYsn6?BFIxmuAVrf{7QQFF@E?s2=1?YLLf;k#^e##^_`v${^}=GAf%4LJUJ>#6ohE~ zO%n9EceH!mdgtyV)UH7q z@%4~nD4}h_Dz<{xtAfkH+At|!&gWyR0po6}f!nHWeV&)kx3+xlN(WL^SaU9RRw-y0 zz3TYHCMb2K9je4=tsTfEFVuk#1_CDc5M#pAf@8P35h#(*`$wLU-6ZGW4cj zhYeEl!n~E5zPyo|U50v{gd;GZbzv!5Op<3*;ad)Ky$i?V#M0puHxof9k`lnvwNREH zh`h`u3BEEXIi}{0g73G?D#VWnGlddn(ZyC2zhQ^%;7)ujRx&E~$4Tm)Y{Au+;>3nS zt?lOoB7995J^n`A@Eh|_OwK{U>ON=O2%g19FP2uyGWdudm0R&-ExEX5*vbRAXBpAq zOTX2yeMgwWjZ862T>opNPMF;~Yr<0@k@1|C&%*<9D+6N`r?}C36KztmM!})BARko} zo>5D4&SM$O^@#Ms_HSU9M+| z*?_Pc{G^wh&UGoDvl<2&K9AV>1fXrg< z&P*1kb?hgUK;3Bxd`L~qWZ$&;CLdF={Efg_e0yp2(ORfWl(RO1@UYD1He;b92t<4o ztpTXQ{VZh54D>cHSiYzdd?mvXN-JXI%t-@5aAMy=XCtBj1WBbQ)(7r^Ep` zj6e!8Oue;R?N_Mz{3MBd6L>XQWT2Q78(hMN=%jDDS5IG5) z7oa4MtT_S_hrGW8Q}pK%RWBu*?a2U)DE{CLJ8aaeW>S4aCGg`OO#WaEOV+aQ;?f1h z=a?Z2D5Bxg1=*zv5a#jk%7&_&&YNTT{=zd3i`3`8G`}L2@BjgWEm$m|YFS+4 z{~NgCd$Nos*MG0xC$>RvG zzzjGHJ>CH=_4Pz_>yy1)vAtLz9l@v@TvW`y?Ds#=OwGgfp(@e`=xZhzbP(q7128XT z46cZTm>oi~z+qB6L-wc$h0*+d`qvT9dK0?PbTw&&S@qd@n*wTsnXL}?@o{<%@<0hw zOO3)4i z;Mckdrbs>bK0qvmye4`Orq*slyQ*?Nj9fembnlvUog5(zE*imP^jKxS?OxP@)TQJP z%mgnqztFV-Qg~g}#d&C_uEr5m`7na>R^kfLJfo_DD+YMIP$}0Pci_`HuoEGNvOq#t z3fr-{*6ZvOYXtVix9}F~pL%4H8DbN$KCzPFG;Z`;oAPpVRchU`;YM5i7?nk9N2Mo8q z!ei^hW*FCCGUJt$`AI8)n6R*Wp#^b!sQe@bhUl}2!~u;3umySO2kP!K#fIo75J8$h zf?BG<9SAf$d01bapd?|vyoDeP2l`Sr%oBg}{WK7hqa}jCvfc{*0~Hv7Yo8ELNcEgm z9be_?RXB|`WPx`L9<*FYmHVosimLTzmOnA574%YB;B;GaQ z7B}$HWHS?$5hf%00n06y>aJr>7x{XG=K|Ex3Jh`B5O|a{;ao}#I_v^#@CEvs!$DYT z>vBU8D)I;j&)zekRE*^-$aj6VSW&F`5FvqIE2ev$=z3C#h5{4EY`0;jIJszCO+49m zD{5VgUM>lX${Qe)Yzp&Qe%6-?hZ18T^1V{5CTltkdi7!qGHd0GlIPvl z;B{?4Ggv4lkS7Mtq_@SZVkUYYU@S+Cz|Nbu%Qyl;Bugn#KDrb7K?_N-9gb{}i;8Jh z^_+iFF!RxxwU@NTBUbR)dPe+!9f%fDb6-iVs5}3XjziFgSf&ta`j!k58R62?@A9=9 z`^XSYKQfwIzLOd`gzsva5Ebwx(Nm_fE`g|1#8 z=A<$TBm=FVsmM!F=zc3G`OQ|^4Dzvu3a1fS`PO|r2ahJ`D2pKYnR9YVViXr{elkwW!y-9K`xgSa~coeL`mE6)`z>==}77Q4-BB9D81H5u$J(Vsxbi zf0e7eM(_wRG{j*DblqNkYhXwRK>`49VFW?l_{NZ^s+-HrtrNb1VU!Wmf68B4K9+@= zIv5yKe4t8gD!aVTOQbfT!309#LtVw_Mm_@(%X(6_X0oFuGx9E@>#by)LD+tjjl)Ypd?uKqN;LTv#r9TNXX6s!A5VLk+lKgyW7$O;IVO zm3eYr2ZbK)Do8J=2m7H~zX6!u>T3IxKInqZ-UzgK(3zEBydrBXyGZP1+0&@aFHwty zB)0g#p`^$|uEQ&9`+7Nb}jD#uA?#mXn_Saf8vHiT}qO%I2!h0zX(oBnA& zaoYB5OPIePIQKbw0lTs*6H`%yz*DKGNZ>ta{2JO)Q+D@iGUqO1?tpZ-9x(wNuRw>4 zbnYh=*298s4>;HhNye)=TK_Z({>+$Qtna*N;>Ij(7%f-S6HpI1tW^hKPDBnx`oV;M z;a!8TQzRyvNc%uv?glH=EBqVtg-I)3%$aGNhrCF6MW-xY&%INXTMGAv1JA^QVP#KB zfJ4|3r}z6&B?I1yK6qi2s>i|7zT!@VEh%Nqp|WOcWe0=;&l6#Qh4FKWayOxLI6GrjYPA2M5ST6f;Zmq32a?mH3(x zI{E_H0CuP%-w<{NNz|f;?FVATMkyl$;$eKz$i;AH^|jJ3JaRk-9A@p$iM9}KHA$vI z3|?qXy4D?)K;SFHw_wxWOWS)}+p0)-==7pQaw7lAWV=aD7$l7?F*Bk&WrDZv^Qjgf$Ac(zE9;9W zi=o;CM6k{`zBv96`hu8EC3Usk5dZqS^(gG~-ZftK*vAGr_tv9`yB^2PnOjFEKSthe z5CjRk&o4v=?(wYWaZzuIzUyOp<2wyiTR)Yt+#VE!iF$06 z&t$Kul+#dDIihKN!HIqhWeTnxAv4QMcF8i#ai4r9`~%6$Bc&3AHm4&sh7w@_EADg2 zD&0Iau-Wv}j{d6Yd1GsdHqf~)ijPIifY^2K57ZQ1w(rY$SC&`+ZU}73KiA6 zgK^D}Us}45q+rK2ViM8#S*W4i+_GDXfuKd*DmA5 zEtf5u&Mg*~5y&&~(1I%W`O(c_(vaW;ZNA)EPRMI05)^<=L{$DA%J*pR>fFcwOcYR& zGSRopz9}zHtSNcQfP`kR8HCC31a|GHu+A=Vx;|eOF|#deRcQN+ z9UoL!_&aGc`^j2JMd@EMALku@VTrD8ri3J?GuSVuRfi-4fGj>zLVRS6^)NYH)`&Af z7&z}CHwnhxVufcGznV@-d>rwBf3&j~D6e%zpv`h>%OK)xtJi${D2Ww@%TQH53+>cj z`$bqYW{@Ddv-w;Y@tGH0U>0d{l>H2cZLU(8#|3q=g3#-ydR1r9N-7dGBVDp{OKH0_ z-h%CS6QH&z1E3NF#UW5wH0*x3lq3GxJ;N8JCi?#A@-VL!N2@FE4FVP;;!Li zB{jr;sGK#N?X%4hvzZ@Jwqv%&Q&M7TP?S8|2f6Gp{qm6yLK~SjFcjf&z{|=j$}uc> z*ES^n&&ur>`(#>55DtoQ^OBOIq9mbK%O0xNzS>`a-bfnlJF8xg*tbr*@IUN17JBKu zRTo{m=K$veP*Hyf=zdhJPq54<=t41bn!+vT6=*!KQHOKOC?LO_^<6<0TlP%g zOyobwwY+#ZCvthMRw>~9z+I^o7c4*iHC;P8=}?)A9mgT?Tf(eUE+D_9DsF5XDm3`i z&cE_&J>~+kFdQ+?ZMfSR)K;RROAPdRuM)}yRCkLI6^s)ljAk;lYm&DU)=Zcjpzb+U zeIFx8IDZ~?OD2&IB*rSPOsSEJ=%uLT-~g#1#1_Pbq}}Ws1<=^Hrlg8RvUW6>tZBf9 z*B|y{L|Pv0S8EQdidzmf)R@8^*Aw`_@23;7E>0$eqc`m)Z9!1$?c&cY67SA^u_tM3 zg70lev^4_*MAp8pA#nKmhpo-M%K&m}9QNFS4()UPxXYH64(}H^2oc(dDv04?fA4i@Q06j=YNFnzrp$I_a_LlY%@u5{(NU%A z2$|fb|IPM7cF98=!4@tKuXb}q6LKcX@&vwUgo45w3D!W`Evy+M*02Ai(ouBae8s|# zWE*c|YDMqCEn=!<2Tb0qn{#(}qgksRb|{BoY3lbWLs{6Drl1uQ4dtWQ>0Xh7kt7U` zAsa(6cH3io{cc@#sC+UK64gYH0_`uH$NH6BIqh3^0VitSd94A{u#Fbhqv4x`z=DC~ zGzGE}V_(0n49!C~}19$T`VJKwom z`Hojw_AFp9Z&IfnO(29`)yIWFjQ=nvq9?swC1g0{+yM*OUccv*t6&v1I3f-sa+dCL z0$WiaJs*dXaBTj0EacKU0YfF4p}6jV3NBW*PH%gq0HatP>Pz}aizXdgY`J!1o5D6B z%y@jH_S<5DIqg=2!R4ay*=^2mH_R2OvkX>xFDf@8rMp^V3i78=mSytmxT1pyn<==o z2lf%^8?5LG@O8Mn*d+JJ*KjhO@T)W=I-s^#_ z#kK6!s;E8^B}?%8H*c101Py`aY5Z|3G@HV{H{k?2iC4%C0zT4o?h`1dU9<$cm1DpE z<^;nx-lBZKA_!xw0XzDX_)U3TdO9GZRn2(9#!w25$t@IW(Z=d3FqgQtQfHe+{s29< zoW9n>fypT^)srZT*c3;I$X0%16wV}fo#hcTa$U_ z{OL&BWky=%j`H{^7=J>KhXtE^Y^vyYxJ9c-V3S77`fPWFaWlN7XQ$pjvVDIPGWc1K zD-;oM;r4ch`GxUYfD?jyU~q0Vxuw)+R%vSK8=qKO!5;dN4H+u3QfZXZy3wlOpcOUR z;U^3liCu9c<0&|fVcB)MxeaJ(~NQD|wp?%kZykQb^45x^`*H3gv@SuHxpqd6h*)HfEG5?_W_W z5)!x~4VvvGK1?8|aIpiL7x{$y+{#VMUnUr+e2w^30gvg$S`f3)MtUg8p9WgThoP`4 zq2%)^+8^mrN$na#W%o~li~<4fLyj#aYtBD4@2GZxsKzC>r3}^|CynrldXlNF1waP- zzC1UXP&z@t=J6RV66jBGY^K0CS+O7G%DIK8$wSzcAzu1+cAl$auKRN5{S_= zj%w>fy&3Mhs#`yNGElwPa?^S+O3M9fbG53&re<(CgXH7{oIHj6p5ke-{k`_Vz36kZ z86_exuMlM}sHVhiQOz3UmaNYO`M+(dZcTrPxKo2d@ z1PP4y$TYQ0QQ@!jUW!mC<%Xyu%VqB=E7O?>{e1JLL8u)>p9}3J3oacoGa-g*&kQJt z6tFh;}pSeD8qX-#NvH?zrU`PUMG`w!VX?D%O*CSU&fkRcnf zQ-RBH4LX76Kz{~hT6hG9vu^;@U%Yme8ZpO1r6>EP3$|13Yz5V1S7Rf8gvbeYq_Zvh zFU(1=@w7_9H!oC_%{)R3EA{*q5`Qk?6csX7Y`}jyD#n+|<>z%r+I820pV=E#{jEYL z#9`S$4!AuHA_d}H_^8=l3@#h2tCX9oer-mveGTjCJP7bT@dvALH3UR3xdS3X)w?kf zjVJ9^AhivysL-TkLoq$AVErL#pMbxO0S@9N;ywA=#K#0v>2}dh@qIoD@rqcL_Fu&@ zeqa$suauN>y9e{Q%Sjw!ES`!R;CoI)qSK5etf+hw$ktvRS0u{BQ14ATnWpcF8V-o6 z-N9|aRhSpS%Id`l62iw^6I0uhd@efO6d^({W5G(fu0WlDvJRBTX%oU#kv=N@QCNk= zfo`XJefEML9_M4y()^ZBgLvz9f}HM_M`=hS;1FhmXmr*o_Dg&(VL)Kbv^=D9(#pK4 zTOhHUkB$EqfXJ?ynfX+}hN7Zs0xb=1fA2voW~N%cW+gu*6dp1|TH??k?KW96B?rYq z+@OH=)>`?C3M?tevB|Hp7`IQ`Ct6@P>3-E@mBB-_SF33eZ$58KKY~ze`s+zPevjud zAn(Xk(y2~lT#(@dse2<^vKz8y@?#aqtP@{m7;`B%I2K{r9!>ys{Lk*p5 zsi{1pX4+=?zEM3Az(JJ&VPQt>pzM^ck!g*aFGGa$!O3f#y!*{Y5FduB>GEkyD{mpm zpMsUo$CGld-aA^L$>NiNk#B9ar#L76z9$@w)nmxai^Kbmcad_Em){;GsT`p zbEk0p8l{q_`gAUE$cR^g#VsaYdCWd&4Vwc{GH{=kaW`+X)1BH~$X-#VqREodu$`x1 zbF=5@szd;g3QiEv^i&;5+q;~U2)7L}QQ9S)bsTFh)&M~frQ~u;BQ7Hd@;S zRfW6+I|Jpvtotf7NU6Ys=>ir>r3yME7r~K@M0L=uC1--ZWL!zp04KgwW5bAwX#%HD zQI7(Fm!^`kuL|Emm4+Hmxeu@G#*1YM2Dca%()0Z7`pxp6=TxC|j;c{Sa-w?vF`hlgWeT0yeh_QHaW ztq6+w1j2D&66@8ss3*XV!P8IX&cCu0Niu>_-Hsn=D$bN-K!NN;mfCfZQ|t`-K^J1j zx-aqpGVLUPU6Mzl^w%lgu|SHVMAg_@B}4uOct@)S85~uJo}fi&OrJwulW%19lAT`X zGSPaK?_^l7L&Z`z@V!a24@zvRmKD9z+G+uLz46a56rXIFFFKT*nSBk`SUJSYD661;P;Xn?z{ll?cKB|~>T38uccs`Wk$oHBqvgd5?T4zrD0I39q;3ZqYhi=6! zO91*#e@wo$^C(s8+QFgRucZ-`Pn3yWKDU?^tFSH!&g++) zi132V<&DL1dx4X@;P3aq*ILfpS)G<7z57rucT-hT9V@9#I5e?w-bA|i+u>Wcl`S7( zmQ*+Go0qPTr&`)i-&^A!4qiw}<)o`PFn)D}J@Ad>lBX-B`C2o09*xjtL--YM?&Oa} z#gi9SxIvdiDFuJi>sVs<`o5T0?J{_Lyx@qBiI0I3)JEwMlkzgYQUnVi_irlb3~gDt z3*g{A8g~2E{TWSL|FBr_=(U!<_rdeJD5gWy5If`T`_8@hBaYZ6qsXs^FD!>5i%$ux z_w=^UgF5%Ttcmj9o?KC2Xs-ouUCO9&>=-sYs|I}vhZY#aBpFrgEnz4?om3n7uERTF<7RVhvWz5(N)`KC zuj09n721b}8IPM-#bFGzWf-Kr?rAx^SKY^UUoce5WJpS`R&q4=^_iO?J~8kLw)4Fx zOQtY2A`m`nhzuz}oU`JH@k8v^tu#oPLUfDkTzQftyys?uGaCfZ-T62{;S zOGC#U(lU3n+B54qq8kg&Q|dmBQH&e>LnBt+ZiHO0ZTm}ay{V77){{#0l1%4wyO#D) zwH`{3KA}tcMJf+LxC#jgj--)Y*+Ye~N}tU~5&{j9r?fr{Klmy}>gSV;{^xa_`|j`C z0ngFJlI83hh(d{@5KJq_1EUP3$q&-aJSWGrVGm#XrSFJ9Rd)m%bJFfkaFs5c z%N8Hq{jo*__}sFy8Go+wU;x{5P(zq^xH4%!-XOs_`DxLTepq7b63YJ-c{62Wu%t5| zOr9<=r))Q_9PO?F)fk`EPukjwJ3mpp$*3kz?e2u?Ea)HC@l+D$MWS4jsAgvqnpAin z_Ed#bbx{bl<2BS5i^dk7s*OX zX=%m2Bl`0>ay7qXX29q;Sa99}-J7f&O|qCw>-okmSQ06yKB17){<-LM#p2bSuQY54z-JJ`>A7+DB}bHk4jfgWg1JWH(>&cZl%JrJ5xW; z&b1u03FaZAZV1GLc)oP+6UNT32S8=1?H=3B7?%P75Mf|RNmY4C$^Y6;{Jx1e$1h1( zu3wCJ&{$)T0Y_XglFz(c1y`zsPXQ;!q@W2$-<_@P1}U41ik>At*tWMfVX!hJrm+^a zHW>H-vGZ%M_!kBBD=U3dkju#GoPxahjW}Uk{L*)-UzCz%?cpU{0Y&;Aj>3lAkp6eTr$+uc%)T{(}_q z$)0-BJ-aB<3;}_PTtWuLLeoUe*uuIvQ|_n#M8D|HL&{$As1_{cFl41FIlupf=)-!A zUS^(4N-%r=(_o9}P+*=>zFzCux!I~i9^ln#OTqT33dQ6u<;L3pi3|d2wP(=XAmu)A zoW$foJ_C6)>6t4`0>VqQ$Z-rpvQ=y|d)2^}tPD*oyj{Nw0u?prlER|Sr&Dlxd9~Y0 z|K$a+zTh%rSqmI|-}mhSe&64%tE?no=4j6XGIun!VDYkddf)#I00@bCIf2Yn z7FJ*fVT$vPZVDjST$nwVRuh04uAfrzeXiCyS$t6)QVGKR+uQ2P+2$^ScJK>n8^{kQcLq zE9GAh|G<#4a5ZxQJGp@!9e{sff=nIV-GnJ9-p7Ie<)6Kivhu&+9bEs(!aEZ4~ZuT#GCwCXS zzr!&%W3{leuzy!|eV>*6zfCDCudMnni@zwa0^2+NZS_v}f75gWTmGA@|K{6YBY%hU zpN_nn{|ooOY5!O3e=EOhDJu&|Ihwiu<(|BhFvVZ<3z$2afz1W}erd*T&cVgbXU=S9 zVF_a9;<998<_GbcF@v~4AX9#ROI|KB&i{atcW`wBIha}e1@#Wj0)EHg1ij~zlN-cr z!O!^)!N(6`HnrsDVCLttFy$}>@tN`R^85$H2N&>rRf6pP)2qLr%-^B7xy(8FxVU+l z&Dc22nYq|4Et&cFxlEZk`OUd4EzS6O%-Bu;hB7x3ka2Xe2fe2gY!9-sV0Ch^`g`Cn z!Ue=t<%KCYSlIq8QMCiPS-u;*_W; zya)1cC2b2A*Y{fd3zeOXg_Gm&k-rin@E*=PwV=N$^&Q}E`Fk`1k}eh?H%AvuM@Kth ziocu!{$=^EVdeLRG6%VVq(E*K@1SfP90F{70_=R6?3@DJ90HtNjBM|c|Il|d2U~vn z|I+@eeSkv$NV*)@^?m+Ne~bRnQyLb||2X@{sU7(5WLZVLgB**`*X1$kJQ|Lx~H z)<1^KtU(S|7VqoFKMVH19naq@98^P6$;GlM{8Y~~z1 z+?H%y|A^{e=&p{IZk`|)3vsJ=9^bioFVMfa0@D36RrLSe8&7MCzw+=-88aIn^S>$M zreOVNu&jTr82=Tm5bOVo523#m{$q)GxBG|eed&5%30eQO6#kR1cVGW+-u{_~|C>_) zf&V+n|A^oJrR#s``X4dyKT`hR>iS>0{znY_kCgwny8eHo3-R9IpMX5yFO`a{ zN%G$>vtUgXWu*Xbf8F!Hm!-T*5S--nTmb+itiK)*fb1OncOjgcys|Xh0X!xW7v*gI zN&NdibOG{G;+kG7XWu_1S}nS7-nWe#_#2!zPMP4E0MN1TVW@Dk;x*mm8*mNcE#&2? zhLhmc8**H*4WiAkJ{Hr_Q!}Ihz_S$%seFj$vzR!TK={Zl)IcBr5(*t!%&zgq?)zIy z>$=Z}SFdh|z#g{`Q;>mXyDID1*%iMxI}ZKN`44^4pZqU|yv#b;H}D-}d58X>xYvvP z`rhqY79IR6e;QI>ie3yGx<>N?@y~(iBjdLETJfTK3liks%I1r2VW*p_jiE^bu1B;f zZ68Yzf~p@(V~=x?o>`wAybVH9+SA)*!r|f5ntyk9g?sC&ecPP5pp}@zw?8bqX`eA_ zSfD;}USx>Bz<)&&V+@-?EWw6{Mvz075p0BB3mL%+l2vtC%2x^4C42iOC<~aI{UBOX zNT;rU@~9UWi7wH@PYZ`eiY@j7CVx?~xQ#uYt-r z^e15r_X>WKwp=;yh|dT3phA~atuWV(5Mrp`xDRhqecwsDAEspkWELPKgzwi}1(Y@3 zrwQp5GqBatOV_upXj`TX0Pp0BKEMB&ItgNIPSHC-3#nXoH=4Y#mu)~8MX@0wL zmD$pV5sllaV<@RpNLk{V4dqjj+sWjsz+;{>9Y2n!dOSxDZK$M+NiJlP^NX8p{GM!E$(MS`@Z_ndPFIV1>5+oDy@0JksItdddUU9Wye;P%_kNmj$Yx9kN!& z39UxH9VKACG0aIcLwXZ6$__8ckprh-O8ifHKL=ceDMMX#eSWiJ$afTfupP>D z8@@Z^%0_`6857fn2_AuQb*Lh5&Q`IDMES)r%sTnAzSrLIaw&a4^kD=X&_4^+5wLu6 z^MqTAJ%nF4f+>v)qnS4RDWYnPaba;r-DufGcB3t=jz#A#I|b@CzE-22a1&BKL_Oaa zI$WzK3@JmIQLefahbT3eVmwRO8S~sIYDZ;vzx3(#&r}W{BaqksW)@6-SJYEyK-7GH zx*?4{913(pl09Pat*=7j3Dla7!k$Hu9EK%Kmb~YpePj`uX{^L-ZW*#H>ecO#?pUX4 z@aUhq-0vZytN5vJU=*FsP zY7N#e>s2;P1O|j4z5NQ>d^vf^cc@i+Z4Bw(ug}@&_vDe>6m%VwHlgt+ z21%y4prpV)G~PuiGk8NG<4J`-Z#)(;IGSR7Aq(tbx8Aq+fDg{jZ~pkiBz|!tdUNgcArDnEFhw)1Rgf8yufMxf-a38MBXFK2KfLe!K>DmT1cj0 zUpB!H+qy3zIQ`SZN-S`fwz|g1^}gD^YG5IgiCsPoWwuUD*cHqYP{K1=p$4EEQgi?f!g%YzceeRz1 z`E$R|8wpG|IJD#Z2`^xMkx+=RcLaCKk#25vNWiQ~-#%EZ_2P3w#ljpBNK^T(sWR-c zpfrZt9=mBS`{x`RD3pHJIvgT_^!&1qZktU+M*LIOpQ~L`Kdd)^JZ+rf|t0-9O#rI92L6>1kLG;HnYQM(1PK3wPN4 zq|3#G3~eM%2PR6vnju^0m5-$f!nj)>qP^8veek{gAW=ikphW(>sQ=k$Qu{NV0^OLH zT5UIig1DWVvQdqMFOUrRqP9;9N5rd%V`&6)m>ry)JcLVxtt^C9O5qIE)xjLp+35UvGu4brx=9tyYY7|j#z$P)I?!8!bPsQZO%9VNvXPEL;9 ztESu#NQ7EmsWWC-lu0EImcgyU{)9v4tLwQL&43P;CLDZEYqZejcE}qwhP$Yfgwc~| zfPMr}lwu^nu6ZT*h523CbxaOj?@HwO-RY1F2H^Wzl2)BVsYr8n{ai5QA+c-%NfCo$Y0X9d z6D@rqdpfmcy{Nf^bJWK?jkb3$W69%9hiFQzxmLX@&}P40S()2JKLS0~C7p1PTxkiA zy`fa!O0Qs8E9Iqu2VX*S+z8!+Lt)X(gBsn@%&K~mdcBe>Y9)bfZ$Ewl)XB?eewRc#nG| zTYmQM>N;mr_^E;nF4oh_w)zAnJtygYcxC*vkJcF_W6G{?)>NCDi^g~O?WN$b?a<&u zeNBPx1k|QsHLu_B4F%N9w`@zoTydVMFQN~`t!poQEIkhcR4KEo<(<>3f#@aLvnnVSJSML<2xAQoq!%iU zCqvzrDxm?H#VA9xR!%`lP(qFE?^=;4(mdv$oKepiUbnj2gStPxq%|k75!T=+%wx}4 zhjC|Dd8jy<7(|riecrDsvn3Mb{vH-}i2%^Px<(SHsU>kNwzYJt^$Jg#{ZK;_ZJIh` z-VagcvTY)GF&l8i{5@Z`%i4n^P1gf@DZtAyyio#i2BQ5IOHi9)iPJGNar1ToiFb37tt?9qdiYMh&auAT-nJbp~zm2 zXQ4^wFDS8^6yjq;^O;DSCqTw>yCdA-giU2g_0EYWx#FZ%eY>oL;+lP^UfIqu<0HO0 zawLVp$e!ehlR?7xb?{n!8Kyoh&lFb<+r_}xzD^x2L_5{kTy9{ioLx!<4tZ|@KKUc6 z^d;!_Kg;xPy!T4H+~Aes`BOH0w?Al`+544#tMaqhX2=Tj+zA<$XbaC0n3t4}%aggA z{Nb)Rk#n?PIM0u4{G^FAtgwPlTOv;@!s^}U2y`=!ZEDaF9xA1RcaM#*29lOl1ts9$ z-|V+{k=8_YWCJ)2TFJ$>ZGQOku$5-389hThu2UZzs9=7)@=;(%oDk~Y4%~L?xtbBu zm^H}C%pq^dK1w%r{>4Lul2(_cMhGr#wXh_`s?gCOj;ZAjw1*t)+Ky?gV>e%`UIc7njKt@mVkfB=Lj>xgrwst{9 zyc~%;B2N&7qBxF*M}en?#H>P^G3-A6PfFv>lQ4kg^U;NwH4^^^Wjq`IC%p$cG$DlT%+MosKUI%^G}|& z;8B?f+9+nMxKM}vi;V(zLtd#I(1#FQDtH9~Y{cLRU5uls5p(o}boXW?P^zptVhOhh zw6~r#e1iw#k7DYo*WHt;8X)|n2OPQr*#&tHx0j-Q?wFw84qb>iS;^L6T}QO>)0TnU z$I@KKP2T?1`^k%#MdLyHd*MlDV?L>LG=7mMNT0ipLG#(#)dZ>jA*a=<-XH9^YVPp= zp8#4KrRBq6pZi|u^3$WB*IK)-h5!T~7#1ZePC#jVcx9#W<#9=nk$*z^8szy9Jic;u z#fvjLJsBm_lrk6-Ap%dISfX_Ptp4M~+%ivg9SF4Ae!kqoVy8S%Ivw z0zsPyqb(0Vf10v#>w+=rk>cs23m`(0q*xPyKvv3zo6?L78ijKe^QTXM2>;EES8?sZ z?VFA<_HP~IH-GY-Aj0zEJb5+%c@gOKW>(f4XiP+!rXa#oM;6XXe~ZfT?dMO|%?~C5 zrAL6Q!&*nD$GHj#0VTYkL7o>0xUyVx+^n-uAHaFAaf*!-?)lD99)9M;8SUdsP1f8> z1_)7-BGlB{kGeP3o7U8AH{HcKLU8Qc(&1Ns^eyKcIR3;t_wmDT+6f3t3#Y#Cv)7wm zgmTmX7bOiqIJJ^(NPR_w7fvnn$KQAg8ztB{#rqf2@@JZ6R{(;xF)|8>Hp0W`x-2Iml*JGb-n?h}yz^C8?VLg>Ap}QR z79%a$IEr6gqqY$soE%hmAHGjRM1)~c@$B&h{=px8i6@RNlD5WZbf%~ThLx`m-#RHD zYZPUk;i?i~F^bhUtoJrY#p9(SSv*vO;r>uEG%-gSBz}3T{C?f(OomjOI1Zq@E)xdZ`wU|-hi~zh+UIy zjxF>k@?mXKM$cHc!skb3#aIyGShwWJ$ptb8QIdebAS-zEh12}um!4pLSkh>X)0)@@ zIwC7a5;RS4V|N2HFvINX3fZwM)rcT zx)aTWWAi=2$T4f!a1CLk2};$emw^-h;{NZl6k^0i%=L4gpX)KKJW<@BGqr=}*bK_X zWL02Tu3x?|s@9GWJVidl`$`b*MyRYd&O4_cK-6rJ4|Y{WhK*}2aqFIBpKqYtW+ovAD&A3glNt2{Gh8M_k zPv!z{otlnPwFQWbqRfYsSsw}ED2n@tthW#S?>EWYf8$ffAly;qgI_7L9?hglY&E6d zIDi@yp2`Ipu^~-6M2!vvhYFsC@op6V*rFPfSY>D=0TF}O29!lmiBt^t9zfE1rg#X0d4A& z?>8nEt6E%*0BKo66*P{RV4HZIkULE`t7Y$Ip1cZmE^vcA)6^vlR~8h*6@qt*g505C zWz}5s=)b(lN#F^DZxn+rRgqy#tyXNJp5R6;H-j?J%RMVuU}fOwWuBshMr;A0%Cp*0 z>iUFiwD8K+{Jqhc0EF8gdWHv|J$cSx%r5r%S6}!xAT&CYYo8r9cs9bC)33@phH6BH zqO3~=-JxT7=;`L3epxq8RA*t1t4b5un(kJ`kYdmUk*|ipcOU-vulhAW0HR7ARw8$K zSNLMMf_D{3q()ueo0~zT&IP%;%dvEU!b7K#A|e#SF2UEekI3i^0U4CFNl9CiG~1Je zApFzYzD`zd{z8%n+D802N0il5wGJLq!bv`u7c2O=R*47-R3tu&zsiqZ*%3zW`} z`m#2^KSEuZ^uDAREE9ZL2=WENA9*RE0pQ_({h>lM4*`er{!(qWv|h8No1K1C-Kv66 zcqqK4k+x`#?oQ;xI$N8ZCCDpX-S`YJvF$RnwH#aM@u5%N$@8a{&kDw3Kj%09@E#s~ z=4741-@YG|rto#s-G)icQQajQ)LCv)BLU9|8xHB7Z0)6f92iEK~Zu0gU|4@zxSuybLa&SVSHvcHf|C`SRPhq zeQs<`A{^*MR7B)KQ3_O2%jjhDdjfUoS%PQerz_y=+NdWs?0$diuYdCAfZvN7 zWBbOoAH+ln^L}fh&|0MSuSwKe#J1>7501JcatSvvW)l4_* z7{rwsODCSE$X;w1-#OLhEqk|;#+Jtq&++`Jl9 zgiw`yV9z9RXD3I8meYlz>xEKk^0DbYut+o2v?Cdw#utMpQSv_?`uIma_k9uk8R{P2 zP^fQ~S$9`4T#lM!TWKeTrD0&R&zI5ZDMZKvWL`7fZllyZzRJmmeUe6-G%^%!W1mn| zfu*5itYI-xgPF_TM1S!F-NoYs@0nffF}v7%Sq!0Rjc;LW%bro;4f=&=Q24X1y&2WM zEzf%Rsz56k?~JkNHF>CIdZ}h?w%fmz)Ftw~w}dYS1#mB-zWIuj%FF-b*w*>kJ*T&P z7I=TQeB!dCIZ13{5~I)B=lfz0Ypr`#fXuCOmKhk zB#3bJSc2#VgF=zHS|)$4+F>=3Qn)fFTR91E6j7f!bn8uXXUbB1-&p!5|3sAV1>gZ! z46D314+zazucZ_=JF6fR0frR}y_I; z-?o?WZTo4CZ^0x@7-g$_xo5t=`R2P;Qp@P8lDxM72>WIx892kBg3Q-4oy#6*1&vrE z2*d6vyvqyV>srZI&m54RVVwHb?Za*F{i_x5U$}DEPFmAwWAQ;YeQ9Sk8rLJAk{ZQy z(=xZT#J~rXiHI9x7^P~8yU9^{pNUdrH)y?V{;anQ;6fn`KI~cnQ z$0>&^>`W~Ow(n%Ij94i2+Px8B^9^~;*pOO{D>DZ3&x3@MC~kiAmJdIqYCqdw;qnQ@J16iL zqU7EU5AvDDqqlr`C_(=LP!zp6e3@f)-SK`dl9nEdQ2UX7W!N$`O{@f8W#qjjM1)49 zHXmHQO0#z6Le`rn_>zW!>4_=&PSdYy8A^X{C^xLe8by^4s0IrFnNs{8kA3VT#W@24 z@Yt<4eN9kzNN{A!$Ll*GcKwRtE7Bh$^{zY&9P}%NBjHU`%{pdSI#EaC=EW|=*JDPb zfDM7cVx2Slp{X{7B=kx}<{|eryQ%`4lHF*vmPE`~jwAIohT9H({KJo()zohoQv`oA zBEu?Mq00M2Mw3RHH!-X9H}gW@Df-TG*-Tw*DhA8AG8^^l>emYoT1o9n%e+sO*D=oS zEi?3;rSEEUbuK}mjF^=*nkwt!@*W^7O3d$U%J*(G9{I$teFw!Ki7zSpb0C4lD6C@B z=D>-Nd!b*|S`x)$T-J(4T5_`PGKuSEvCW*mi#e@Uq_&PddJDC7Ts@H>rb)k2^s73S za_3{8^{yYFzY~8}ZS$Y*@L5;d(YFReJ))K3UjHb%F zxS|IlFJR3KlCn_YOsU^zhSHW89P=4GGA**-&rOnwy?WdcXSLFkBv&T z`mEg`7jwp1k&ZIE{rNiKdSxf2(VnE|4Bbkt`Hs!XX_O){8u1m?V2R*z4}6Ni>_r2_ zVk$)a2P8aM-WK2y>o)0#Pqyj;OaxPy8g4tDWhCi&8&L3ybB_Sl~hM}g^hzj|rd%~so19iD8j(SKh0B%+KCgiP8#w&nCvK991_(f`WT2F~3*_M{ zTf&t?BBM#7%~chvk#J%(1<=cL`gzXVwx^2#MQ@I(7>-WvtFI-kktP-(%CKy#yUD;fEJ+T^Vz?TDDwge&%0QVSC*=F~7(||m9%dd&i>bna0w79~# z;UdA6v|>}|h&RDLloD*D$*Yo;-V(j6taeVfzIw2umH-BeM{CL$>9aPnUC4~>=x#kQ zSgd`=+a}D3nX&Zi-K_N8{xU^bjvBf*FIzLw1XofG7ZG0;z^4&;>fudl$2kE4@bJI< z&_IIv637E?IFEN3dR0v~LouyEP!wgspub4r!^2~(#@BA#KXwm5HCV*ugZf@bVqZ09 z-dT-1hAa5Ii&k*M72|ico9S0dA08d_7s#p%QHscJPPTN^9PX4E`D56Q_}i#ha>HH$CN#~cl-D^cW)iPSA;vWsvMTXh4YfF8q6W$ z`zY=xTG8X@y1(ZP$dkAJdLdfA06Y|i3nEp9(TaAwagM7UoBAeHkx>m7qzdw_PGY~% zZl)(2jmGmg9_V}#pvsmhv%28aN$sl=cL0=wWqi@cC?(flK7Lo4riUlSS|>UU`vosN zTn*;Mm**y%lo=sg5a0n3?t1cn`#aUE4hTRK_b70;1iw=CPa?t7Ow79dR#q#Tqk3}H zKZ!_KQgHW=ziZ#2D2jS%n$8~BHF57-C(Q|fd}*X5My=JiFUCx*TD#9aT&lI>-P88) zo^9jbN|NM+F=lY%o3=k(%NEXCHsJ20)Q_Lf-kujA-~9M*R3h?cz!N@S3Mf83=Kuf+ zJ4r-ARKDn=P;1QP6_;;DX%S!a@WoQ_B9B|6K6Ba5sUnW!+*-Ssrs)eeTt0p`fXlm7 zS>0JOmKrYB=%jX(Lt7-210s!FcX0g9BuNg(al9BsQTEn@yKRI{&5Jt=J=y4 zW3j1|Y!V!Pa2${lrT*>A^!!?0XH`qI)`KKTPVCt>{;hXU+ZO=x|yD)o;3)(W33AU+3ps^QH4^Tm&T^ri1$7i+DLq9}{wxYm+`<99|{NvMW(rA_Ml z>gR)o0>+Y>C6&E7#O0(~`}dEuBT14arBpE(4Ax#helcWwT>t@i_z(VWHz9*Lr8NhwvnTstn7Y_A(2a`VkWDQ-qw z9`YrEt5fO0DG&Np)K{+`6Vx+A$_g<~eYBjKb z3JDb*L-oF^rtV0RST`d#Uv ziB9voNs^qh)((v^Zr{Fr;cVZ$bD^@mE`U6G>rDa0w}9Jm17vst+yLNq1rHs%<)+PW zbLsc{q1kK}Q4}qwX?o=SS5DnNW>h7do3 ziR*U8hX7n}w!XKn)=y=ur8ATw_|+HzuHTh@d#v4jDvF}HBuNIw7`K1_e!uB24!c0v zUKcU6P8kfqw1Yp zt16!9p5ja2B2@KGAi*;esr)@xOntu5XdH>-c*$B@j9If z8siOHzrx#>xVc9_grB{l`IQ^qviph+j-_dOLE7=3 zJs|CNTMisJ5JtXam?X(utJ!?^`n}Ej0VF#`aAp0oiJ?7eTnMg2hNl6zac}d!X0!23 z9LIB7>!G#QU4HrH;RjVae&99arCJh2(MlZ0N8fq*)Lpw%-A9Blr~|%MV%9p?eSa1Z z_BM3)Z3kxVO4IaM9LFnB6qUVR?+5 zIrg>#(|7G_suft(k{XdPsMG5QT6+1d`=|dRNs?o69CxEADz|Un?k@#df8YUWx7%{X z6;}jnt=C#-X`0TZY5M$)``TXvAfG2x8KD|Nz5u`t``TYk)Aac`ju(tEnK8z%mtKDZ zknXe>Z(1HUrCZ=HciuR2%)-^wBwQjWK~Oy zF>cflF_)(4v)5nV`TXk7Tz`4{&NNM*jpKMeilWRI<1Qubxa2eh>b4>0+^Uuwy>j=| z-9I!DeeZ`RqVHX~d+P2uj*q5k+O4Xp+O=y}xYXpcm(pU}?Y8v$eE=WFan@)wPC4hE zc>m=Sp8#ky8c#Hv%~Nq4XJuLXOHDiA2RONSmgrp_J$lp>MG;q3)yngH3?NO@ZWKj> zBuUCWd-nKC4U9_`kX29)A3kgVljnIf0;B@`-o1M-NiZ&HKvqF{^2sN4mSuWmvclC@ vUmY%0FfMsORzW!f8+&8CG2R&eNsj*?LUqHjePyiP00000NkvXXu0mjfQIFo< literal 0 HcmV?d00001 diff --git a/static/img/marker/cluster-icon-green.png b/static/img/marker/cluster-icon-green.png new file mode 100755 index 0000000000000000000000000000000000000000..82f84e40d60176e31ab02da934f87b8bc5fe7492 GIT binary patch literal 25889 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 U(+;`1LjV8(07*qoM6N<$g4YR6xc~qF literal 0 HcmV?d00001 diff --git a/static/img/marker/marker-icon-green.png b/static/img/marker/marker-icon-green.png new file mode 100755 index 0000000000000000000000000000000000000000..c359abb6c2c2a1ee7272e3f85ee825583f6924f2 GIT binary patch literal 4203 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 literal 0 HcmV?d00001 diff --git a/static/img/marker/marker-icon-violet.png b/static/img/marker/marker-icon-violet.png new file mode 100755 index 0000000000000000000000000000000000000000..ea748aa32933206dee2dec724aa8d9724384a41d GIT binary patch literal 4190 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 literal 0 HcmV?d00001 diff --git a/static/img/marker/marker-icon-yellow.png b/static/img/marker/marker-icon-yellow.png new file mode 100755 index 0000000000000000000000000000000000000000..8b677d9390539f7f386176b754ec3bb2791def52 GIT binary patch literal 4159 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 JPDHLkV1j#5>~{bF literal 0 HcmV?d00001 diff --git a/static/img/marker/marker-shadow.png b/static/img/marker/marker-shadow.png new file mode 100755 index 0000000000000000000000000000000000000000..84c580847f0b20fa72d328985a08c0c176554a69 GIT binary patch literal 608 zcmV-m0-ybfP)9uxu(PDa20NtOu&LOs@Hz6GMI+Q6g1Z=qj$sxT(UW7u!XkL;lC1Sux{-k zrKG=Ll3X`pmJ#TlL7Pm#g6k<}JL*YPF{=D*Jt9ddf(0rbK-p3Q$jBIdfPIGdCL={p zPZe29%|u7Kq6UF#1O~k@qlzy)@7NJH5b5QZH0w1L>&ZF>IAnU}cyCIWV=(@k>0)}s z#u&vVyO&ex=p?gju}^>lcQj(kJsJ0NpK8Z8sR=XG6xB+HOVoRA8qCQS`s8N(9~4t_ zw-PKkoa*ao^O6^s672eiQj0-B4xiUrcGz&vi|)FMV#poEi8-3nKkDR!>3g5X98WNi zBH}N}lhCgFIR?EBbvrT#<`}O6sF8c@fZ`WtHr_)(%$^a*sAHW3!6o*hm;#OI1-8RB zNTX3GBfsk44PkjCr z@9>IwOYpNAYKBY&%*Z2;ebvG5gr4Fto(cRG^HWGEFqo0PtqHs*^9XnG5HESz!R>^Z uBWCvJpx>B^l^?4c-ODoDcJ$YtIeU<@wGnma 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 literal 0 HcmV?d00001 diff --git a/static/nls/de.json b/static/nls/de.json new file mode 100755 index 0000000..29c0ea2 --- /dev/null +++ b/static/nls/de.json @@ -0,0 +1,121 @@ +{ + "debug": { + "lat": "Latitude", + "lng": "Longitude", + "updates": "Updates", + "accuracy": "Accuracy", + "highAccuracy": "High accuracy", + "posAge": "Position max age", + "posTimeout": "Position timeout", + "zoom": "Zoom level", + "enabled": "Enabled", + "disabled": "Disabled", + "marks": "Marks", + "export": "Export data" + }, + "notif": { + "geolocationError": "Your browser doesn't implement the geolocation API", + "newMarkerOutside": "New marker out of your range", + "spotAdded": "New spot saved to map", + "storeAdded": "New store saved to map", + "barAdded": "New bar saved to map", + "spotDeleted": "Spot has been successfully deleted from map", + "storeDeleted": "Store has been successfully deleted from map", + "barDeleted": "Bar has been successfully deleted from map", + "markNameEmpty": "You didn't specified a name for the mark", + "lockFocusOn": "Centering and locking on your position", + "unlockFocusOn": "Position locking ended" + }, + "nav": { + "add": "Add", + "cancel": "Cancel", + "close": "Close", + "delete": "Delete" + }, + "map": { + "newTitle": "New marker", + "newSpot": "Add a spot", + "newStore": "Add a shop", + "newBar": "Add a bar", + "planLayerOSM": "Plan OSM", + "planLayerGeo": "Plan GeoPortail", + "satLayerEsri": "Satellite ESRI", + "satLayerGeo": "Satellite GeoPortail" + }, + "spot": { + "title": "New spot", + "subtitle": "A spot is a remarkable place to crack a beer ! Share it with the community, wether it is for the astonishing view of for whatever it is enjoyable to drink a beer!", + "nameLabel": "Name that spot", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "store": { + "title": "New store", + "subtitle": "The must have place to refill your beer stock. The more info you provide, the better you help your fellow beer crackerz!", + "nameLabel": "Store name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "bar": { + "title": "New bar", + "subtitle": "A bar is a holly place where you can get some nicely colded draft beers!", + "nameLabel": "Bar name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "modal": { + "userTitle": "User account", + "userAccuracyPref": "High precision", + "userDebugPref": "Debug interface", + "aboutTitle": "About BeerCrackerz", + "aboutDesc": "A brilliant idea from David Béché!
    BeerCrackerz is the beer lovers comunity, filled with pint slayers and cereals lovers", + "hideShowTitle": "Map options", + "hideShowLabels": "Labels", + "hideShowCircles": "Circles", + "hideShowSpots": "Spots", + "hideShowStores": "Stores", + "hideShowBars": "Bars", + "deleteMarkTitle": "Delete mark", + "deleteMarkDesc": "Are you sure you want to delete this mark?
    This action is permanent and can not be reverted.", + "spotEditTitle": "Edit spot", + "storeEditTitle": "Edit store", + "barEditTitle": "Edit bar" + }, + "popup": { + "spotFoundBy": "A spot discovered by", + "storeFoundBy": "A store added by", + "barFoundBy": "A bar added by", + "spotNoDesc": "No description available for this spot", + "storeNoDesc": "No description available for this store", + "barNoDesc": "No description available for this bar" + }, + "auth": { + "login": { + "headTitle": "Connexion | BeerCrackerz", + "subtitle": "Se connecter", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password": "Mot de passe", + "login": "Se connecter", + "notRegistered": "Pas encore inscrit?", + "register": "Créer un compte", + "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", + "usernameEmpty": "Veuillez saisir un nom d'utilisateur", + "passwordEmpty": "Veuillez saisir votre mot de passe", + "serverError": "Une erreur serveur est survenue, contactez le support" + }, + "register": { + "headTitle": "S'inscrire | BeerCrackerz", + "subtitle": "S'inscrire", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password1": "Mot de passe", + "password2": "Confirmer le mot de passe", + "register": "S'inscrire", + "notRegistered": "Déjà inscrit?", + "login": "Se connecter", + "fieldEmpty": "Veuillez remplir tous les champs du formulaire", + "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + } + } +} diff --git a/static/nls/en.json b/static/nls/en.json new file mode 100755 index 0000000..848c375 --- /dev/null +++ b/static/nls/en.json @@ -0,0 +1,121 @@ +{ + "debug": { + "lat": "Latitude", + "lng": "Longitude", + "updates": "Updates", + "accuracy": "Accuracy", + "highAccuracy": "High accuracy", + "posAge": "Position max age", + "posTimeout": "Position timeout", + "zoom": "Zoom level", + "enabled": "Enabled", + "disabled": "Disabled", + "marks": "Marks", + "export": "Export data" + }, + "notif": { + "geolocationError": "Your browser doesn't implement the geolocation API", + "newMarkerOutside": "New marker out of your range", + "spotAdded": "New spot saved to map", + "storeAdded": "New store saved to map", + "barAdded": "New bar saved to map", + "spotDeleted": "Spot has been successfully deleted from map", + "storeDeleted": "Store has been successfully deleted from map", + "barDeleted": "Bar has been successfully deleted from map", + "markNameEmpty": "You didn't specified a name for the mark", + "lockFocusOn": "Centering and locking view on your position", + "unlockFocusOn": "Position locking ended" + }, + "nav": { + "add": "Add", + "cancel": "Cancel", + "close": "Close", + "delete": "Delete" + }, + "map": { + "newTitle": "New marker", + "newSpot": "Add a spot", + "newStore": "Add a shop", + "newBar": "Add a bar", + "planLayerOSM": "Plan OSM", + "planLayerGeo": "Plan GeoPortail", + "satLayerEsri": "Satellite ESRI", + "satLayerGeo": "Satellite GeoPortail" + }, + "spot": { + "title": "New spot", + "subtitle": "A spot is a remarkable place to crack a beer ! Share it with the community, wether it is for the astonishing view of for whatever it is enjoyable to drink a beer!", + "nameLabel": "Name that spot", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "store": { + "title": "New store", + "subtitle": "The must have place to refill your beer stock. The more info you provide, the better you help your fellow beer crackerz!", + "nameLabel": "Store name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "bar": { + "title": "New bar", + "subtitle": "A bar is a holly place where you can get some nicely colded draft beers!", + "nameLabel": "Bar name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "modal": { + "userTitle": "User account", + "userAccuracyPref": "High precision", + "userDebugPref": "Debug interface", + "aboutTitle": "About BeerCrackerz", + "aboutDesc": "A brilliant idea from David Béché!
    BeerCrackerz is the beer lovers comunity, filled with pint slayers and cereals lovers", + "hideShowTitle": "Map options", + "hideShowLabels": "Labels", + "hideShowCircles": "Circles", + "hideShowSpots": "Spots", + "hideShowStores": "Stores", + "hideShowBars": "Bars", + "deleteMarkTitle": "Delete mark", + "deleteMarkDesc": "Are you sure you want to delete this mark?
    This action is permanent and can not be reverted.", + "spotEditTitle": "Edit spot", + "storeEditTitle": "Edit store", + "barEditTitle": "Edit bar" + }, + "popup": { + "spotFoundBy": "A spot discovered by", + "storeFoundBy": "A store added by", + "barFoundBy": "A bar added by", + "spotNoDesc": "No description available for this spot", + "storeNoDesc": "No description available for this store", + "barNoDesc": "No description available for this bar" + }, + "auth": { + "login": { + "headTitle": "Connexion | BeerCrackerz", + "subtitle": "Se connecter", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password": "Mot de passe", + "login": "Se connecter", + "notRegistered": "Pas encore inscrit?", + "register": "Créer un compte", + "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", + "usernameEmpty": "Veuillez saisir un nom d'utilisateur", + "passwordEmpty": "Veuillez saisir votre mot de passe", + "serverError": "Une erreur serveur est survenue, contactez le support" + }, + "register": { + "headTitle": "S'inscrire | BeerCrackerz", + "subtitle": "S'inscrire", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password1": "Mot de passe", + "password2": "Confirmer le mot de passe", + "register": "S'inscrire", + "notRegistered": "Déjà inscrit?", + "login": "Se connecter", + "fieldEmpty": "Veuillez remplir tous les champs du formulaire", + "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + } + } +} diff --git a/static/nls/es.json b/static/nls/es.json new file mode 100755 index 0000000..c7a8342 --- /dev/null +++ b/static/nls/es.json @@ -0,0 +1,121 @@ +{ + "debug": { + "lat": "Latitude", + "lng": "Longitude", + "updates": "Updates", + "accuracy": "Accuracy", + "highAccuracy": "High accuracy", + "posAge": "Position max age", + "posTimeout": "Position timeout", + "zoom": "Zoom level", + "enabled": "Enabled", + "disabled": "Disabled", + "marks": "Marks", + "export": "Export data" + }, + "notif": { + "geolocationError": "Your browser doesn't implement the geolocation API", + "newMarkerOutside": "New marker out of range", + "spotAdded": "New spot saved to map", + "storeAdded": "New store saved to map", + "barAdded": "New bar saved to map", + "spotDeleted": "Spot has been successfully deleted from map", + "storeDeleted": "Store has been successfully deleted from map", + "barDeleted": "Bar has been successfully deleted from map", + "markNameEmpty": "You didn't specified a name for the mark", + "lockFocusOn": "Centering and locking on your position", + "unlockFocusOn": "Position locking ended" + }, + "nav": { + "add": "Add", + "cancel": "Cancel", + "close": "Close", + "delete": "Delete" + }, + "map": { + "newTitle": "New marker", + "newSpot": "Add a spot", + "newStore": "Add a shop", + "newBar": "Add a bar", + "planLayerOSM": "Plan OSM", + "planLayerGeo": "Plan GeoPortail", + "satLayerEsri": "Satellite ESRI", + "satLayerGeo": "Satellite GeoPortail" + }, + "spot": { + "title": "New spot", + "subtitle": "A spot is a remarkable place to crack a beer ! Share it with the community, wether it is for the astonishing view of for whatever it is enjoyable to drink a beer!", + "nameLabel": "Name that spot", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "store": { + "title": "New store", + "subtitle": "The must have place to refill your beer stock. The more info you provide, the better you help your fellow beer crackerz!", + "nameLabel": "Store name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "bar": { + "title": "New bar", + "subtitle": "A bar is a holly place where you can get some nicely colded draft beers!", + "nameLabel": "Bar name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" + }, + "modal": { + "userTitle": "User account", + "userAccuracyPref": "High precision", + "userDebugPref": "Debug interface", + "aboutTitle": "About BeerCrackerz", + "aboutDesc": "A brilliant idea from David Béché!
    BeerCrackerz is the beer lovers comunity, filled with pint slayers and cereals lovers", + "hideShowTitle": "Map options", + "hideShowLabels": "Labels", + "hideShowCircles": "Circles", + "hideShowSpots": "Spots", + "hideShowStores": "Stores", + "hideShowBars": "Bars", + "deleteMarkTitle": "Delete mark", + "deleteMarkDesc": "Are you sure you want to delete this mark?
    This action is permanent and can not be reverted.", + "spotEditTitle": "Edit spot", + "storeEditTitle": "Edit store", + "barEditTitle": "Edit bar" + }, + "popup": { + "spotFoundBy": "A spot discovered by", + "storeFoundBy": "A store added by", + "barFoundBy": "A bar added by", + "spotNoDesc": "No description available for this spot", + "storeNoDesc": "No description available for this store", + "barNoDesc": "No description available for this bar" + }, + "auth": { + "login": { + "headTitle": "Connexion | BeerCrackerz", + "subtitle": "Se connecter", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password": "Mot de passe", + "login": "Se connecter", + "notRegistered": "Pas encore inscrit?", + "register": "Créer un compte", + "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", + "usernameEmpty": "Veuillez saisir un nom d'utilisateur", + "passwordEmpty": "Veuillez saisir votre mot de passe", + "serverError": "Une erreur serveur est survenue, contactez le support" + }, + "register": { + "headTitle": "S'inscrire | BeerCrackerz", + "subtitle": "S'inscrire", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password1": "Mot de passe", + "password2": "Confirmer le mot de passe", + "register": "S'inscrire", + "notRegistered": "Déjà inscrit?", + "login": "Se connecter", + "fieldEmpty": "Veuillez remplir tous les champs du formulaire", + "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + } + } +} diff --git a/static/nls/fr.json b/static/nls/fr.json new file mode 100755 index 0000000..571ad49 --- /dev/null +++ b/static/nls/fr.json @@ -0,0 +1,121 @@ +{ + "debug": { + "lat": "Latitude", + "lng": "Longitude", + "updates": "Mises à jour", + "accuracy": "Précision", + "highAccuracy": "Haute précision", + "posAge": "Fréquence de rafraichissement", + "posTimeout": "Validité de la position", + "zoom": "Niveau de zoom", + "enabled": "Activée", + "disabled": "Désactivée", + "marks": "Marqueurs", + "export": "Exporter les données" + }, + "notif": { + "geolocationError": "Votre navigateur ne peux utiliser votre localisation", + "newMarkerOutside": "Nouveau marqueur hors de votre portée", + "spotAdded": "Nouveau spot ajouté à la carte", + "storeAdded": "Nouveau magasin ajouté à la carte", + "barAdded": "Nouveau bar ajouté à la carte", + "spotDeleted": "Le spot a été supprimé de la carte avec succès", + "storeDeleted": "Le magasin a été supprimé de la carte avec succès", + "barDeleted": "Le bar a été supprimé de la carte avec succès", + "markNameEmpty": "Vous devez specifier un nom pour le marqueur", + "lockFocusOn": "Suivre et recentrer sur votre position", + "unlockFocusOn": "Fin du suivi de position" + }, + "nav": { + "add": "Ajouter", + "cancel": "Annuler", + "close": "Fermer", + "delete": "Supprimer" + }, + "map": { + "newTitle": "Nouveau marqueur", + "newSpot": "Ajouter un spot", + "newStore": "Ajouter un magasin", + "newBar": "Ajouter un bar", + "planLayerOSM": "Plan OSM", + "planLayerGeo": "Plan GeoPortail", + "satLayerEsri": "Satellite ESRI", + "satLayerGeo": "Satellite GeoPortail" + }, + "spot": { + "title": "Nouveau spot", + "subtitle": "Un spot est un endroit remarquable pour cracker une bière en tout quiétude! Faites en profiter la communauté, que ce soit pour le calme exceptionnel, pour la vue incroyable ou pour tout autre source de ravissement houblonné.", + "nameLabel": "Nommer ce spot", + "descLabel": "Pourquoi ne pas le décrire", + "rateLabel": "Lui attribuer une note" + }, + "store": { + "title": "Nouveau magasin", + "subtitle": "C'est un indispensable pour se ravitailler des meilleurs breuvages houblonnés. Rensigner la gamme de prix et surtout si fraicheur il y a!", + "nameLabel": "Nom du magasin", + "descLabel": "Pourquoi ne pas le décrire", + "rateLabel": "Lui attribuer une note" + }, + "bar": { + "title": "Nouveau bar", + "subtitle": "Un bar est un endroit convivial ou le houblons coule des saintes tireuses à pression.", + "nameLabel": "Nom du bar", + "descLabel": "Pourquoi ne pas le décrire", + "rateLabel": "Lui attribuer une note" + }, + "modal": { + "userTitle": "Compte utilisateur", + "userAccuracyPref": "Haute précision", + "userDebugPref": "Interface de debug", + "aboutTitle": "À propos de BeerCrackerz", + "aboutDesc": "Une idée brillante de David Béché!
    BeerCrackerz, c'est la communauté incontournable d'amoureux du houblons, de pourfendeurs de pintes, d'aficionados de céréales!", + "hideShowTitle": "Options de carte", + "hideShowLabels": "Étiquettes", + "hideShowCircles": "Cercles", + "hideShowSpots": "Spots", + "hideShowStores": "Magasins", + "hideShowBars": "Bars", + "deleteMarkTitle": "Supprimer le marqueur", + "deleteMarkDesc": "Êtes-vous sûr de vouloir supprimer ce marqueur?
    Cette action est permanente et irréversible.", + "spotEditTitle": "Éditer le spot", + "storeEditTitle": "Éditer le magasin", + "barEditTitle": "Éditer le bar" + }, + "popup": { + "spotFoundBy": "Un spot découvert par", + "storeFoundBy": "Un magasin ajouté par", + "barFoundBy": "Un bar ajouté par", + "spotNoDesc": "Pas de description disponible pour ce spot", + "storeNoDesc": "Pas de description disponible pour ce magasin", + "barNoDesc": "Pas de description disponible pour ce bar" + }, + "auth": { + "login": { + "headTitle": "Connexion | BeerCrackerz", + "subtitle": "Se connecter", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password": "Mot de passe", + "login": "Se connecter", + "notRegistered": "Pas encore inscrit?", + "register": "Créer un compte", + "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", + "usernameEmpty": "Veuillez saisir un nom d'utilisateur", + "passwordEmpty": "Veuillez saisir votre mot de passe", + "serverError": "Une erreur serveur est survenue, contactez le support" + }, + "register": { + "headTitle": "S'inscrire | BeerCrackerz", + "subtitle": "S'inscrire", + "hiddenError": "Oh! Un texte caché!", + "username": "Nom d'utilisateur ou Email", + "password1": "Mot de passe", + "password2": "Confirmer le mot de passe", + "register": "S'inscrire", + "notRegistered": "Déjà inscrit?", + "login": "Se connecter", + "fieldEmpty": "Veuillez remplir tous les champs du formulaire", + "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + } + } +} From 7457a7bf162a1966f33f28292eb08805dceafe6b Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Wed, 31 Aug 2022 15:18:42 +0200 Subject: [PATCH 006/204] feat: implement point getter on front side --- API.md | 14 ++ front/assets/dist/BeerCrackerz.bundle.css | 3 - front/assets/dist/BeerCrackerz.bundle.js | 178 +----------------- front/assets/dist/BeerCrackerzAuth.bundle.css | 3 - front/assets/dist/BeerCrackerzAuth.bundle.js | 118 +----------- front/src/BeerCrackerz.js | 54 ++++-- front/src/js/utils/Utils.js | 31 ++- 7 files changed, 85 insertions(+), 316 deletions(-) create mode 100644 API.md diff --git a/API.md b/API.md new file mode 100644 index 0000000..4b96687 --- /dev/null +++ b/API.md @@ -0,0 +1,14 @@ +## Get Spot + +```json +[{ + "type":"spot", + "lat":38.7018896, + "lng":-9.1826648, + "name":"Santo Amoro", + "description":"", + "user":"messmaker", + "userId":42, + "rate":4 +}] +``` diff --git a/front/assets/dist/BeerCrackerz.bundle.css b/front/assets/dist/BeerCrackerz.bundle.css index 355eee7..1f51ff2 100644 --- a/front/assets/dist/BeerCrackerz.bundle.css +++ b/front/assets/dist/BeerCrackerz.bundle.css @@ -1,4 +1 @@ -/*!******************************************************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerz.scss ***! - \******************************************************************************************************************************************************************************************************************/ @-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif;position:relative}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}main.beer-crakerz-map{height:100%;width:100%;z-index:10}main.beer-crakerz-map .new-poi{text-align:center}main.beer-crakerz-map .new-poi p{font-size:1.6rem;font-weight:700}main.beer-crakerz-map .new-poi button{margin:1.2rem 0}main.beer-crakerz-map .marker-tooltip{font-style:italic;text-align:center}nav{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:absolute;right:1rem;top:1rem;width:4.8rem;z-index:20}nav img{border-radius:50%;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;cursor:pointer;width:100%}nav .cmd-bar .cmd-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin:1rem 0;padding:.2rem}nav .cmd-bar .cmd-wrapper:first-child{margin-top:0}nav .cmd-bar .cmd-wrapper img{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-transition:all .2s;transition:all .2s}nav .cmd-bar .cmd-wrapper img:active,nav .cmd-bar .cmd-wrapper img:focus,nav .cmd-bar .cmd-wrapper img:hover{border:1px solid #b9b9b9;border-radius:.5rem;-webkit-filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);padding:.2rem}nav .cmd-bar .cmd-wrapper img[class$=-on]{-webkit-filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%);filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%)}nav .cmd-bar .cmd-wrapper.logo img{padding:.1rem}nav .cmd-bar .cmd-wrapper.logo img:active,nav .cmd-bar .cmd-wrapper.logo img:focus,nav .cmd-bar .cmd-wrapper.logo img:hover{-webkit-filter:inherit;filter:inherit}.notification-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:3rem;justify-content:center;left:calc(50% - 15rem);opacity:0;position:absolute;top:-4rem;-webkit-transition:top .3s,opacity .2s ease-out;transition:top .3s,opacity .2s ease-out;width:30rem;z-index:40}.notification-wrapper.opened{opacity:1;top:1rem}.notification-wrapper .notification-message{font-style:italic;margin:0}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .3s,opacity .2s ease-out;transition:right .3s,opacity .2s ease-out;width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:1rem}.zoom-slider p{cursor:pointer;font-size:1.6rem;font-weight:700;margin:.5rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider .slider-wrapper{border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:lime;bottom:0;position:absolute;-webkit-transition:height .2s;transition:height .2s;width:100%}.overlay{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:hsla(0,0%,100%,.8);display:none;height:100%;justify-content:center;opacity:0;position:absolute;top:0;-webkit-transition:opacity .3s;transition:opacity .3s;width:100%;z-index:30}.overlay [class$=-modal]{background:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;padding:3rem 4rem;position:relative;text-align:center}.overlay [class$=-modal] h1{margin-bottom:3rem}.overlay [class$=-modal] button{margin-top:3rem}.overlay [class$=-modal] .modal-close{color:#999;cursor:pointer;font-size:2.2rem;font-weight:700;line-height:1.4rem;position:absolute;right:1rem;top:1rem}.overlay [class$=-modal] .button-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center}.overlay [class$=-modal] .button-wrapper button{margin-left:1rem;margin-right:1rem}.overlay .edit-mark-modal,.overlay .new-mark-modal{width:calc(100% - 2rem)}.overlay .edit-mark-modal h1,.overlay .edit-mark-modal p,.overlay .new-mark-modal h1,.overlay .new-mark-modal p{text-align:center}.overlay .edit-mark-modal .rating,.overlay .new-mark-modal .rating{margin-bottom:1.2rem}.overlay .edit-mark-modal .rating img,.overlay .new-mark-modal .rating img{cursor:pointer;height:2.5rem;margin:0 .25rem;width:2.5rem}.overlay .edit-mark-modal .rating img.active,.overlay .new-mark-modal .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.overlay .edit-mark-modal .rating img.active.selected,.overlay .new-mark-modal .rating img.active.selected{-webkit-filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%);filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%)}.overlay .hide-show-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:15rem}.overlay .hide-show-modal .item img{height:2rem;margin-right:2rem}.overlay .hide-show-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .hide-show-modal .item input{margin:0;width:auto}.overlay .user-profile-modal{height:calc(100% - 2rem);width:calc(100% - 2rem)}.overlay .user-profile-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:25rem}.overlay .user-profile-modal .item img{height:2rem;margin-right:2rem}.overlay .user-profile-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .user-profile-modal .item input{margin:0;width:auto}.debug-container{background-color:hsla(0,0%,100%,.8);border-radius:.5rem;color:#000;left:1rem;padding:1rem;position:absolute;top:1rem;z-index:20}.debug-container p{margin-bottom:.2rem}.popup h1,.popup h2,.popup p{margin:0;text-align:center}.popup h1{font-size:2rem;margin-bottom:1.2rem}.popup .rating{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;width:100%}.popup .rating img{height:1.2rem}.popup .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.popup .rating p{font-style:inherit;margin-left:.5rem}.popup p{font-style:italic}.popup h2{font-size:1.3rem;font-weight:inherit;margin-top:1.2rem}.popup footer{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin-top:1.2rem;position:relative}.popup footer img{cursor:pointer;height:2rem;margin-left:.5rem}.cluster-icon-wrapper{position:relative}.cluster-icon-wrapper .cluster-icon{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);height:50px;line-height:50px;margin-left:-21px;margin-top:-13px;-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s;width:auto}.cluster-icon-wrapper .cluster-icon:active,.cluster-icon-wrapper .cluster-icon:focus,.cluster-icon-wrapper .cluster-icon:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8);-webkit-transform:scale(1.066);transform:scale(1.066)}.cluster-icon-wrapper .cluster-label{background-color:#fff;border:1px solid #000;border-radius:.75rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;color:#000;font-size:1.1rem;font-weight:700;left:15px;padding:.1rem .4rem;position:absolute;top:-15px}.leaflet-control-layers.leaflet-control{-webkit-transition:all .2s;transition:all .2s}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)}@media (min-width:720px){.overlay [class$=-modal]{max-width:50%}} diff --git a/front/assets/dist/BeerCrackerz.bundle.js b/front/assets/dist/BeerCrackerz.bundle.js index 6d614a2..cad234b 100644 --- a/front/assets/dist/BeerCrackerz.bundle.js +++ b/front/assets/dist/BeerCrackerz.bundle.js @@ -1,177 +1 @@ -/* - * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/BeerCrackerz.js": -/*!*****************************!*\ - !*** ./src/BeerCrackerz.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *

    \n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Boolean}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
    \n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server\n _this2._user.id = 42;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-store', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this5.nls.map('planLayerOSM'), \"

    \")] = osm; //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan; \n\n baseMaps[\"

    \".concat(_this5.nls.map('satLayerEsri'), \"

    \")] = esri; //baseMaps[`

    ${this.nls.map('satLayerGeo')}

    `] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.store, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.store, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.store, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.store, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this7._map.addLayer(_this7._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')) || [];\n\n for (var i = 0; i < marks.length; ++i) {\n iterateMarkers(marks[i]);\n }\n\n marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-store')) || [];\n\n for (var _i = 0; _i < marks.length; ++_i) {\n iterateMarkers(marks[_i]);\n }\n\n marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-bar')) || [];\n\n for (var _i2 = 0; _i2 < marks.length; ++_i2) {\n iterateMarkers(marks[_i2]);\n }\n\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
    \n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/stores/bars marks. This label is basically the\n * mark name given by its creator.\n *
    \n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.store, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/stores/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
    \n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.store, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/stores/bars must be given as an argument\n *
    \n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
    \n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
    \n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate(\"assets/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(submit, \"{{\".concat(options.type.toUpperCase(), \"_SUBMIT}}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(cancel, \"{{\".concat(options.type.toUpperCase(), \"_CANCEL}}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i3 = 0; _i3 < _this8._marks[options.type].length; ++_i3) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i3]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
    \n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{{MODAL_DESC}}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{{MODAL_CANCEL}}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{{MODAL_DELETE}}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
    \n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{{MODAL_TITLE}}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{{ACCURACY_USER_MODAL}}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{{DEBUG_USER_MODAL}}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{{BEERCRACKERZ_DESC}}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/stores/bars\n *
    \n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('assets/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{{MODAL_TITLE}}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{{LABELS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{{CIRCLES_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{{SPOTS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-stores\"), \"{{STORES_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowStores'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{{BARS_HIDESHOW_MODAL}}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{{MODAL_CLOSE}}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === 'true') {\n document.getElementById('show-stores').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-stores').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'store'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
    \n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"saved-\".concat(options.type))) || [];\n marks.push(this.formatSavedMarker(options));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(marks));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/stores/bars) and for the user marker\n *
    \n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.store);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
    \n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n type: mark.type,\n lat: mark.lat,\n lng: mark.lng,\n name: mark.name,\n description: mark.description,\n user: mark.username || this.user.username,\n userId: mark.userId || this.user.id,\n dom: null,\n rate: mark.rate,\n marker: null,\n circle: null\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will open a mark edition modal\n *
    \n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will delete a mark after prompting the user if he trully wants to\n *
    \n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i4 = 0; _i4 < _this13._marks[options.type].length; ++_i4) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i4]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The addDebugUI() method appends the debug DOM element to the document body\n *
    \n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The removeDebugUI() method remove the debug DOM element from the document body\n *
    \n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateDebugUI() method will update informations held in the debug DOM\n *
    \n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
    \n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
    \n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); - -/***/ }), - -/***/ "./src/js/MapHelper.js": -/*!*****************************!*\ - !*** ./src/js/MapHelper.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"assets/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"assets/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); - -/***/ }), - -/***/ "./src/js/ui/Notification.js": -/*!***********************************!*\ - !*** ./src/js/ui/Notification.js ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); - -/***/ }), - -/***/ "./src/js/ui/Rating.js": -/*!*****************************!*\ - !*** ./src/js/ui/Rating.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); - -/***/ }), - -/***/ "./src/js/ui/ZoomSlider.js": -/*!*********************************!*\ - !*** ./src/js/ui/ZoomSlider.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); - -/***/ }), - -/***/ "./src/js/utils/LangManager.js": -/*!*************************************!*\ - !*** ./src/js/utils/LangManager.js ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"assets/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); - -/***/ }), - -/***/ "./src/js/utils/MarkerEnum.js": -/*!************************************!*\ - !*** ./src/js/utils/MarkerEnum.js ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-blue.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-gold.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-red.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-green.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-orange.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-yellow.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-violet.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-grey.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: 'assets/img/marker/marker-icon-black.png',\n shadowUrl: 'assets/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: 'assets/img/marker/user-position.png',\n shadowUrl: 'assets/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); - -/***/ }), - -/***/ "./src/js/utils/ProviderEnum.js": -/*!**************************************!*\ - !*** ./src/js/utils/ProviderEnum.js ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); - -/***/ }), - -/***/ "./src/js/utils/Utils.js": -/*!*******************************!*\ - !*** ./src/js/utils/Utils.js ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default'\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); - -/***/ }), - -/***/ "./src/BeerCrackerz.scss": -/*!*******************************!*\ - !*** ./src/BeerCrackerz.scss ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.scss?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerz.js"); -/******/ window.BeerCrackerz = __webpack_exports__["default"]; -/******/ -/******/ })() -; \ No newline at end of file +!function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return w}});var r=Object.freeze({blue:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-blue.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),gold:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-gold.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),red:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-red.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),green:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-green.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),orange:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-orange.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),yellow:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-yellow.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),violet:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-violet.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),grey:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-grey.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),black:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-black.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),user:new window.L.Icon({iconUrl:"assets/img/marker/user-position.png",shadowUrl:"assets/img/marker/user-position-shadow.png",iconSize:[32,32],iconAnchor:[16,16],popupAnchor:[1,-34],shadowSize:[32,32]})});function n(e,t){for(var r=0;r : -"),n.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),o.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(r),t.appendChild(n),t.appendChild(a),t.appendChild(o),t.appendChild(i),t.appendChild(c),t.appendChild(s),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,r,n){if(!0===window.DEBUG){var a=window.BeerCrackerz,o=a.nls.debug.bind(a.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(o("lat")," : ").concat(r.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(o("lng")," : ").concat(r.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(o("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(o("accuracy")," : ").concat(e.precisionRound(r.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(o("highAccuracy")," : ").concat(!0===n.enableHighAccuracy?o("enabled"):o("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(o("posAge")," : ").concat(n.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(o("posTimeout")," : ").concat(n.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(o("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(o("marks")," : ").concat(c,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(r){e.getReq("http://localhost:8000/".concat(t)).then(r)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("store").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&o(t.prototype,null),r&&o(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function c(e,t){for(var r=0;ri.CIRCLE_RADIUS&&console.log("Too far"),o!==t.user.username?a.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),r(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var r=0;rOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var r=0;r".concat(e.nls.map("planLayerOSM"),"

    ")]=r,a["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=n,i.getPreference("map-plan-layer"))switch(i.getPreference("map-plan-layer")){case e.nls.map("planLayerOSM"):r.addTo(e._map);break;case e.nls.map("satLayerEsri"):n.addTo(e._map);break;default:r.addTo(e._map)}else r.addTo(e._map);window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){document.getElementById("user-profile").addEventListener("click",e.userProfileModal.bind(e)),document.getElementById("hide-show").addEventListener("click",e.hidShowModal.bind(e)),document.getElementById("center-on").addEventListener("click",e.toggleFocusLock.bind(e)),document.getElementById("overlay").addEventListener("click",e.closeModal.bind(e)),e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0))),e.updateDebugUI()})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var r={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var n=function(t){e.markPopupFactory(t).then((function(r){t.dom=r,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t=i.CIRCLE_RADIUS&&t[r].circle.visible&&(t[r].circle.visible=!1,t[r].circle.setStyle({opacity:0,fillOpacity:0}))}};"true"===i.getPreference("poi-show-circle")&&(t(this._marks.spot),t(this._marks.store),t(this._marks.bar),t([this._user]))}},{key:"formatSavedMarker",value:function(e){return{type:e.type,lat:e.lat,lng:e.lng,name:e.name,description:e.description,user:e.username||this.user.username,userId:e.userId||this.user.id,dom:null,rate:e.rate,marker:null,circle:null}}},{key:"editMarker",value:function(e){this._map.closePopup(),this.editMarkModal(e)}},{key:"deleteMarker",value:function(e){var t=this;this.deleteMarkModal((function(r){if(!0===r){for(var n=t._marks[e.type],a=0;a { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/BeerCrackerzAuth.js": -/*!*********************************!*\ - !*** ./src/BeerCrackerzAuth.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n\n var _init = function _init() {};\n\n if (document.body.className.includes('login')) {\n _init = this._handleLogin.bind(this);\n } else if (document.body.className.includes('register')) {\n _init = this._handleRegister.bind(this);\n } // The BeerCrackerz app is only initialized once nls are set up\n\n\n this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](window.navigator.language.substring(0, 2), _init.bind(this));\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_handleLogin\",\n value: function _handleLogin() {\n var _this = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_SUBTITLE}}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_HIDDEN_ERROR}}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_USERNAME_LABEL}}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_USERNAME_PASSWORD}}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_BUTTON}}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_NOT_REGISTERED}}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{LOGIN_REGISTER}}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('serverError');\n });\n }\n }, false);\n }\n }, {\n key: \"_handleRegister\",\n value: function _handleRegister() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_SUBTITLE}}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_HIDDEN_ERROR}}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_LABEL}}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_1}}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_2}}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_BUTTON}}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_ALREADY_DONE}}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(document.body, '{{REGISTER_LOGIN}}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('serverError');\n });\n }\n }, false);\n }\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); - -/***/ }), - -/***/ "./src/js/utils/LangManager.js": -/*!*************************************!*\ - !*** ./src/js/utils/LangManager.js ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"assets/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); - -/***/ }), - -/***/ "./src/js/utils/Utils.js": -/*!*******************************!*\ - !*** ./src/js/utils/Utils.js ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default'\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); - -/***/ }), - -/***/ "./src/BeerCrackerzAuth.scss": -/*!***********************************!*\ - !*** ./src/BeerCrackerzAuth.scss ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.scss?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerzAuth.js"); -/******/ window.BeerCrackerz = __webpack_exports__["default"]; -/******/ -/******/ })() -; \ No newline at end of file +!function(){"use strict";var e={d:function(n,t){for(var r in t)e.o(t,r)&&!e.o(n,r)&&Object.defineProperty(n,r,{enumerable:!0,get:t[r]})},o:function(e,n){return Object.prototype.hasOwnProperty.call(e,n)}},n={};function t(e,n){for(var t=0;t : -"),r.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),i.innerHTML="".concat(e("accuracy")," : -"),o.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),u.innerHTML="".concat(e("zoom")," : -"),l.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),n.appendChild(t),n.appendChild(r),n.appendChild(a),n.appendChild(i),n.appendChild(o),n.appendChild(c),n.appendChild(s),n.appendChild(u),n.appendChild(l),n.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),n}},{key:"updateDebugInterface",value:function(n,t,r){if(!0===window.DEBUG){var a=window.BeerCrackerz,i=a.nls.debug.bind(a.nls),o=parseInt(n.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;n.querySelector(".debug-user-lat").innerHTML="\n ".concat(i("lat")," : ").concat(t.lat,"\n "),n.querySelector(".debug-user-lng").innerHTML="\n ".concat(i("lng")," : ").concat(t.lng,"\n "),n.querySelector(".debug-updates-amount").innerHTML="\n ".concat(i("updates")," : ").concat(o,"\n "),n.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(i("accuracy")," : ").concat(e.precisionRound(t.accuracy,2),"m\n "),n.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(i("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?i("enabled"):i("disabled"),"\n "),n.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(i("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),n.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(i("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),n.querySelector(".debug-zoom-level").innerHTML="\n ".concat(i("zoom")," : ").concat(a.map.getZoom(),"\n "),n.querySelector(".debug-marks-amount").innerHTML="\n ".concat(i("marks")," : ").concat(c,"\n ")}}},{key:"getPoints",value:function(n){return new Promise((function(t){e.getReq("http://localhost:8000/".concat(n)).then(t)}))}},{key:"getSpots",value:function(){return new Promise((function(n){e.getPoints("spot").then(n)}))}},{key:"getStores",value:function(){return new Promise((function(n){e.getPoints("store").then(n)}))}},{key:"getBars",value:function(){return new Promise((function(n){e.getPoints("bar").then(n)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,n){localStorage.setItem(e,n)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&t(n.prototype,null),r&&t(n,r),Object.defineProperty(n,"prototype",{writable:!1}),e}();function a(e,n){for(var t=0;t${this.nls.map('planLayerOSM')}

    `] = osm; - //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan; + //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan; baseMaps[`

    ${this.nls.map('satLayerEsri')}

    `] = esri; //baseMaps[`

    ${this.nls.map('satLayerGeo')}

    `] = geo; // Append layer depending on user preference @@ -322,7 +322,7 @@ class BeerCrackerz extends MapHelper { break; /*case this.nls.map('satLayerGeo'): geo.addTo(this._map); - break;*/ + break;*/ default: osm.addTo(this._map); break; @@ -490,18 +490,42 @@ class BeerCrackerz extends MapHelper { this._clusters[mark.type].addLayer(mark.marker); }); }; - let marks = JSON.parse(Utils.getPreference('saved-spot')) || []; - for (let i = 0; i < marks.length; ++i) { - iterateMarkers(marks[i]); - } - marks = JSON.parse(Utils.getPreference('saved-store')) || []; - for (let i = 0; i < marks.length; ++i) { - iterateMarkers(marks[i]); - } - marks = JSON.parse(Utils.getPreference('saved-bar')) || []; - for (let i = 0; i < marks.length; ++i) { - iterateMarkers(marks[i]); - } + + Utils.getSpots().then(spots => { + for (let i = 0; i < spots.length; ++i) { + // TODO @raph + spots[i].type = 'spot'; + spots[i].user = 'messmaker'; + spots[i].userId = 42; + spots[i].lat = spots[i].latitude; + spots[i].lng = spots[i].longitude; + iterateMarkers(spots[i]); + } + }); + + Utils.getStores().then(stores => { + for (let i = 0; i < stores.length; ++i) { + // TODO @raph + stores[i].type = 'store'; + stores[i].user = 'messmaker'; + stores[i].userId = 42; + stores[i].lat = stores[i].latitude; + stores[i].lng = stores[i].longitude; + iterateMarkers(stores[i]); + } + }); + + Utils.getBars().then(bars => { + for (let i = 0; i < bars.length; ++i) { + // TODO @raph + bars[i].type = 'bar'; + bars[i].user = 'messmaker'; + bars[i].userId = 42; + bars[i].lat = bars[i].latitude; + bars[i].lng = bars[i].longitude; + iterateMarkers(bars[i]); + } + }); resolve(); }); @@ -1167,7 +1191,7 @@ class BeerCrackerz extends MapHelper { *
    * The downloadData() method will save to user disk the saved spots as a JSON file *
    - **/ + **/ downloadData() { const dataString = `data:text/json;charset=utf-8,${encodeURIComponent(Utils.getPreference('saved-spot'))}`; const link = document.createElement('A'); diff --git a/front/src/js/utils/Utils.js b/front/src/js/utils/Utils.js index 1a6b150..b800ad1 100644 --- a/front/src/js/utils/Utils.js +++ b/front/src/js/utils/Utils.js @@ -30,7 +30,8 @@ class Utils { method: 'GET', headers: new Headers(), mode: 'cors', - cache: 'default' + cache: 'default', + url: `http://localhost:8000` }; fetch(url, options).then(data => { @@ -187,6 +188,34 @@ class Utils { } + /* Point getter and setter */ + + + static getPoints(type) { + return new Promise(resolve => { + Utils.getReq(`http://localhost:8000/${type}`).then(resolve); + }); + } + + + static getSpots() { + return new Promise(resolve => { Utils.getPoints('spot').then(resolve); }); + } + + + static getStores() { + return new Promise(resolve => { Utils.getPoints('store').then(resolve); }); + } + + + static getBars() { + return new Promise(resolve => { Utils.getPoints('bar').then(resolve); }); + } + + + /* Preference get set (DEPRECATED) */ + + static getPreference(pref) { return localStorage.getItem(pref) || null; } From fb264b119be20d21ce30d1203124c955a7a7be3a Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 3 Sep 2022 14:38:46 +0200 Subject: [PATCH 007/204] feat: update login to include register in one page --- front/assets/dist/BeerCrackerzAuth.bundle.css | 2 +- front/assets/dist/BeerCrackerzAuth.bundle.js | 2 +- front/assets/html/aside/login.html | 18 + front/assets/html/aside/register.html | 20 + front/assets/img/logo/left.svg | 4 + front/assets/img/logo/right.svg | 4 + front/authindex.html | 86 ---- front/login.html | 17 +- front/package-lock.json | 238 +++++---- front/package.json | 8 +- front/src/BeerCrackerz.scss | 47 +- front/src/BeerCrackerzAuth.js | 476 +++++++++++++++++- front/src/BeerCrackerzAuth.scss | 133 ++++- front/src/scss/_leaflet.scss | 46 ++ 14 files changed, 842 insertions(+), 259 deletions(-) create mode 100644 front/assets/html/aside/login.html create mode 100644 front/assets/html/aside/register.html create mode 100644 front/assets/img/logo/left.svg create mode 100644 front/assets/img/logo/right.svg delete mode 100644 front/authindex.html create mode 100644 front/src/scss/_leaflet.scss diff --git a/front/assets/dist/BeerCrackerzAuth.bundle.css b/front/assets/dist/BeerCrackerzAuth.bundle.css index e1a088f..a9bac3a 100644 --- a/front/assets/dist/BeerCrackerzAuth.bundle.css +++ b/front/assets/dist/BeerCrackerzAuth.bundle.css @@ -1 +1 @@ -@-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}body{background:#fff;position:relative}aside,body{height:100%;width:100%}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:grey;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;justify-content:space-between;max-width:40rem;position:absolute;right:0;text-align:center}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside main{margin:0 4rem;text-align:left}aside main button{margin:2.9rem auto 1.2rem}aside main p{text-align:right}aside main .login-error{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s}aside main .login-error.visible{color:#ff5454}aside footer{margin-bottom:5rem} +@-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}:root{--aside-width:40rem}body{background:#fff;height:100%;position:relative;width:100%}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:grey;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;justify-content:space-between;max-width:40rem;max-width:var(--aside-width);right:0;text-align:center;width:100%;z-index:30}aside,aside .aside-expander{position:absolute;top:0;-webkit-transition:all .5s;transition:all .5s}aside .aside-expander{cursor:pointer;height:4.8rem;left:0}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside main{margin:0 4rem;text-align:left}aside main button{margin:2.9rem auto 1.2rem}aside main p{text-align:right}aside main .login-error{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s}aside main .login-error.visible{color:#ff5454}aside footer{margin-bottom:5rem}main.beer-crakerz-map{height:100%;-webkit-transition:width .5s;transition:width .5s;width:calc(100% - 40rem);width:calc(100% - var(--aside-width));z-index:10}main.beer-crakerz-map .new-poi{text-align:center}main.beer-crakerz-map .new-poi p{font-size:1.6rem;font-weight:700}main.beer-crakerz-map .new-poi button{margin:1.2rem 0}main.beer-crakerz-map .marker-tooltip{font-style:italic;text-align:center}.notification-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:3rem;justify-content:center;left:calc(50% - 15rem);opacity:0;position:absolute;top:-4rem;-webkit-transition:top .3s,opacity .2s ease-out;transition:top .3s,opacity .2s ease-out;width:30rem;z-index:40}.notification-wrapper.opened{opacity:1;top:1rem}.notification-wrapper .notification-message{font-style:italic;margin:0}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .3s,opacity .2s ease-out;transition:right .3s,opacity .2s ease-out;width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:41rem;right:calc(var(--aside-width) + 1rem)}.zoom-slider p{cursor:pointer;font-size:1.6rem;font-weight:700;margin:.5rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider .slider-wrapper{border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:lime;bottom:0;position:absolute;-webkit-transition:height .2s;transition:height .2s;width:100%}.leaflet-control-layers.leaflet-control{-webkit-transition:all .2s;transition:all .2s}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)} diff --git a/front/assets/dist/BeerCrackerzAuth.bundle.js b/front/assets/dist/BeerCrackerzAuth.bundle.js index a87fd3f..10db38c 100644 --- a/front/assets/dist/BeerCrackerzAuth.bundle.js +++ b/front/assets/dist/BeerCrackerzAuth.bundle.js @@ -1 +1 @@ -!function(){"use strict";var e={d:function(n,t){for(var r in t)e.o(t,r)&&!e.o(n,r)&&Object.defineProperty(n,r,{enumerable:!0,get:t[r]})},o:function(e,n){return Object.prototype.hasOwnProperty.call(e,n)}},n={};function t(e,n){for(var t=0;t : -"),r.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),i.innerHTML="".concat(e("accuracy")," : -"),o.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),u.innerHTML="".concat(e("zoom")," : -"),l.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),n.appendChild(t),n.appendChild(r),n.appendChild(a),n.appendChild(i),n.appendChild(o),n.appendChild(c),n.appendChild(s),n.appendChild(u),n.appendChild(l),n.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),n}},{key:"updateDebugInterface",value:function(n,t,r){if(!0===window.DEBUG){var a=window.BeerCrackerz,i=a.nls.debug.bind(a.nls),o=parseInt(n.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;n.querySelector(".debug-user-lat").innerHTML="\n ".concat(i("lat")," : ").concat(t.lat,"\n "),n.querySelector(".debug-user-lng").innerHTML="\n ".concat(i("lng")," : ").concat(t.lng,"\n "),n.querySelector(".debug-updates-amount").innerHTML="\n ".concat(i("updates")," : ").concat(o,"\n "),n.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(i("accuracy")," : ").concat(e.precisionRound(t.accuracy,2),"m\n "),n.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(i("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?i("enabled"):i("disabled"),"\n "),n.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(i("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),n.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(i("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),n.querySelector(".debug-zoom-level").innerHTML="\n ".concat(i("zoom")," : ").concat(a.map.getZoom(),"\n "),n.querySelector(".debug-marks-amount").innerHTML="\n ".concat(i("marks")," : ").concat(c,"\n ")}}},{key:"getPoints",value:function(n){return new Promise((function(t){e.getReq("http://localhost:8000/".concat(n)).then(t)}))}},{key:"getSpots",value:function(){return new Promise((function(n){e.getPoints("spot").then(n)}))}},{key:"getStores",value:function(){return new Promise((function(n){e.getPoints("store").then(n)}))}},{key:"getBars",value:function(){return new Promise((function(n){e.getPoints("bar").then(n)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,n){localStorage.setItem(e,n)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&t(n.prototype,null),r&&t(n,r),Object.defineProperty(n,"prototype",{writable:!1}),e}();function a(e,n){for(var t=0;t : -"),r.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),i.innerHTML="".concat(e("accuracy")," : -"),o.innerHTML="".concat(e("highAccuracy")," : -"),s.innerHTML="".concat(e("posAge")," : -"),c.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(n),t.appendChild(r),t.appendChild(a),t.appendChild(i),t.appendChild(o),t.appendChild(s),t.appendChild(c),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,n,r){if(!0===window.DEBUG){var a=window.BeerCrackerz,i=a.nls.debug.bind(a.nls),o=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,s=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(i("lat")," : ").concat(n.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(i("lng")," : ").concat(n.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(i("updates")," : ").concat(o,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(i("accuracy")," : ").concat(e.precisionRound(n.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(i("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?i("enabled"):i("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(i("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(i("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(i("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(i("marks")," : ").concat(s,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(n){e.getReq("http://localhost:8000/".concat(t)).then(n)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("store").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&i(t.prototype,null),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function s(e,t){for(var n=0;no.CIRCLE_RADIUS&&console.log("Too far"),i!==t.user.username?a.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=o["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===o.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),n(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:o.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var n=0;nOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var n=0;n".concat(e.nls.map("planLayerOSM"),"

    ")]=n,a["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=r,n.addTo(e._map),window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(o.MAP_BOUNDS,{animate:!0}),"true"===o.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===o.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===o.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===o.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0)))})),e._map.on("baselayerchange",(function(e){o.setPreference("map-plan-layer",o.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var n={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===o.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===o.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===o.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var r=function(t){e.markPopupFactory(t).then((function(n){t.dom=n,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};o.getSpots().then((function(e){for(var t=0;t +
    +

    BeerCrackerz

    +

    {{LOGIN_SUBTITLE}}

    +
    +
    + + + + + + +

    {{LOGIN_NOT_REGISTERED}} {{LOGIN_REGISTER}}

    +
    + diff --git a/front/assets/html/aside/register.html b/front/assets/html/aside/register.html new file mode 100644 index 0000000..a7cb6ec --- /dev/null +++ b/front/assets/html/aside/register.html @@ -0,0 +1,20 @@ +
    +
    +

    BeerCrackerz

    +

    {{REGISTER_SUBTITLE}}

    +
    +
    + + + + + + + + +

    {{REGISTER_ALREADY_DONE}} {{REGISTER_LOGIN}}

    +
    + diff --git a/front/assets/img/logo/left.svg b/front/assets/img/logo/left.svg new file mode 100644 index 0000000..3b09244 --- /dev/null +++ b/front/assets/img/logo/left.svg @@ -0,0 +1,4 @@ + + + + diff --git a/front/assets/img/logo/right.svg b/front/assets/img/logo/right.svg new file mode 100644 index 0000000..a2efc94 --- /dev/null +++ b/front/assets/img/logo/right.svg @@ -0,0 +1,4 @@ + + + + diff --git a/front/authindex.html b/front/authindex.html deleted file mode 100644 index 6f859be..0000000 --- a/front/authindex.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - Beer Crackerz - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    -
    - -
    -
    -

    +

    -
    -
    -
    -

    -
    -
    - - - - - - - - - diff --git a/front/login.html b/front/login.html index ebb100c..ebc581e 100644 --- a/front/login.html +++ b/front/login.html @@ -45,7 +45,16 @@ - From 739c2e11526cb0dfe11d4e3a3fbf63064c45e31d Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Mon, 12 Sep 2022 22:21:14 +0200 Subject: [PATCH 009/204] update gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5613bbb..b66f6b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ node_modules +.env .idea .DS_Store -# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] - *$py.class \ No newline at end of file + *$py.class From e455858b025b78e9fe166105f09d66422904e20e Mon Sep 17 00:00:00 2001 From: Asiberus Date: Mon, 12 Sep 2022 22:48:27 +0200 Subject: [PATCH 010/204] chore(back): change userId to integer field --- back/api/serializers/bar/bar_extended.py | 2 +- back/api/serializers/shop/shop_extended.py | 2 +- back/api/serializers/spot/spot_extended.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/back/api/serializers/bar/bar_extended.py b/back/api/serializers/bar/bar_extended.py index 44f22a4..bb5a404 100644 --- a/back/api/serializers/bar/bar_extended.py +++ b/back/api/serializers/bar/bar_extended.py @@ -7,7 +7,7 @@ class BarExtendedSerializer(serializers.ModelSerializer): type = serializers.CharField(default='bar') rate = serializers.FloatField(default=0) user = serializers.CharField(source='user.username') - userId = serializers.CharField(source='user.id') + userId = serializers.IntegerField(source='user.id') creationDate = serializers.DateField(source='creation_date') class Meta: diff --git a/back/api/serializers/shop/shop_extended.py b/back/api/serializers/shop/shop_extended.py index 88acc2e..2c8e4c3 100644 --- a/back/api/serializers/shop/shop_extended.py +++ b/back/api/serializers/shop/shop_extended.py @@ -7,7 +7,7 @@ class ShopExtendedSerializer(serializers.ModelSerializer): type = serializers.CharField(default='shop') rate = serializers.FloatField(default=0) user = serializers.CharField(source='user.username') - userId = serializers.CharField(source='user.id') + userId = serializers.IntegerField(source='user.id') creationDate = serializers.DateField(source='creation_date') class Meta: diff --git a/back/api/serializers/spot/spot_extended.py b/back/api/serializers/spot/spot_extended.py index 848e937..783a800 100644 --- a/back/api/serializers/spot/spot_extended.py +++ b/back/api/serializers/spot/spot_extended.py @@ -7,7 +7,7 @@ class SpotExtendedSerializer(serializers.ModelSerializer): type = serializers.CharField(default='spot') rate = serializers.FloatField(default=0) user = serializers.CharField(source='user.username') - userId = serializers.CharField(source='user.id') + userId = serializers.IntegerField(source='user.id') creationDate = serializers.DateField(source='creation_date') class Meta: From 1428ba5efd2565e41dba0983dd2901c04d0e68f6 Mon Sep 17 00:00:00 2001 From: Asiberus Date: Mon, 12 Sep 2022 23:00:56 +0200 Subject: [PATCH 011/204] feat(back): add welcome view --- back/api/models.py | 3 -- back/api/views.py | 3 -- back/app/templates/welcome.html | 89 +++++++++++++++++++++++++++++++++ back/app/urls.py | 7 +-- back/app/views.py | 4 ++ 5 files changed, 97 insertions(+), 9 deletions(-) delete mode 100644 back/api/models.py delete mode 100644 back/api/views.py create mode 100644 back/app/templates/welcome.html diff --git a/back/api/models.py b/back/api/models.py deleted file mode 100644 index 71a8362..0000000 --- a/back/api/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/back/api/views.py b/back/api/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/back/api/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/back/app/templates/welcome.html b/back/app/templates/welcome.html new file mode 100644 index 0000000..491465b --- /dev/null +++ b/back/app/templates/welcome.html @@ -0,0 +1,89 @@ +{% load static %} + + + + + + Login | BeerCrackerz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    +

    +
    +
    +
    +

    +
    + + + + + + + + + + diff --git a/back/app/urls.py b/back/app/urls.py index 81f905b..773e6e8 100644 --- a/back/app/urls.py +++ b/back/app/urls.py @@ -1,7 +1,8 @@ from django.urls import path -from .views import IndexView +from .views import IndexView, WelcomeView urlpatterns = [ - path('', IndexView.as_view(), name='index') -] \ No newline at end of file + path('', IndexView.as_view(), name='index'), + path('welcome/', WelcomeView.as_view(), name='index'), +] diff --git a/back/app/views.py b/back/app/views.py index cccc50e..32124c3 100644 --- a/back/app/views.py +++ b/back/app/views.py @@ -3,3 +3,7 @@ class IndexView(TemplateView): template_name = 'index.html' + + +class WelcomeView(TemplateView): + template_name = 'welcome.html' From c049458feb167c04ebc7e28090f90b213c07da85 Mon Sep 17 00:00:00 2001 From: Asiberus Date: Tue, 13 Sep 2022 20:46:22 +0200 Subject: [PATCH 012/204] chore(front): handle static url --- .conf/development/nginx/Dockerfile | 2 - docker-compose.yml | 5 +- front/assets/dist/BeerCrackerz.bundle.js | 2 +- front/assets/dist/BeerCrackerzAuth.bundle.js | 2 +- front/assets/html/aside/forgot-password.html | 2 +- front/assets/html/aside/login.html | 2 +- front/assets/html/aside/register.html | 2 +- front/assets/html/modal/editbar.html | 10 +- front/assets/html/modal/editspot.html | 10 +- front/assets/html/modal/editstore.html | 10 +- front/assets/html/modal/hideshow.html | 10 +- front/assets/html/modal/newbar.html | 6 +- front/assets/html/modal/newspot.html | 10 +- front/assets/html/modal/newstore.html | 6 +- front/assets/html/modal/user.html | 4 +- front/assets/html/popup/bar.html | 18 +- front/assets/html/popup/spot.html | 18 +- front/assets/html/popup/store.html | 18 +- front/index.html | 42 ++--- front/src/BeerCrackerz.js | 14 +- front/src/BeerCrackerzAuth.js | 14 +- front/src/js/MapHelper.js | 4 +- front/src/js/utils/LangManager.js | 2 +- front/src/js/utils/MarkerEnum.js | 40 ++--- front/src/js/utils/Utils.js | 6 +- front/webpack/webpack.common.js | 2 +- front/welcome.html | 32 ++-- static/dist/BeerCrackerz.bundle.css | 3 - static/dist/BeerCrackerz.bundle.js | 178 +------------------ static/dist/BeerCrackerzAuth.bundle.css | 5 +- static/dist/BeerCrackerzAuth.bundle.js | 118 +----------- static/html/modal/editbar.html | 10 +- static/html/modal/editspot.html | 10 +- static/html/modal/editstore.html | 10 +- static/html/modal/hideshow.html | 10 +- static/html/modal/newbar.html | 6 +- static/html/modal/newspot.html | 10 +- static/html/modal/newstore.html | 6 +- static/html/modal/user.html | 4 +- static/html/popup/bar.html | 18 +- static/html/popup/spot.html | 18 +- static/html/popup/store.html | 18 +- 42 files changed, 208 insertions(+), 509 deletions(-) mode change 100755 => 100644 static/dist/BeerCrackerz.bundle.css mode change 100755 => 100644 static/dist/BeerCrackerz.bundle.js mode change 100755 => 100644 static/dist/BeerCrackerzAuth.bundle.css mode change 100755 => 100644 static/dist/BeerCrackerzAuth.bundle.js diff --git a/.conf/development/nginx/Dockerfile b/.conf/development/nginx/Dockerfile index 011070f..b212d84 100644 --- a/.conf/development/nginx/Dockerfile +++ b/.conf/development/nginx/Dockerfile @@ -4,6 +4,4 @@ ENV NGINX_ENVSUBST_TEMPLATE_SUFFIX=.tpl COPY ./.conf/development/nginx/default.conf.tpl /etc/nginx/templates/default.conf.tpl -COPY ./static /vol/static - CMD ["nginx", "-g", "daemon off;"] diff --git a/docker-compose.yml b/docker-compose.yml index 9bfa768..d1088c1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: BACKEND_NAME: ${BACKEND_NAME} BACKEND_PORT: ${BACKEND_PORT} volumes: - - beer_crackerz_static:/vol/static + - ./static:/vol/static backend: container_name: ${BACKEND_NAME} build: @@ -31,7 +31,6 @@ services: DB_PASSWORD: ${DB_PASSWORD} volumes: - ./back:/back - - beer_crackerz_static:/static depends_on: - db db: @@ -48,5 +47,3 @@ services: volumes: beer_crakerz_db: name: beer_crakerz_db - beer_crackerz_static: - name: beer_crackerz_static diff --git a/front/assets/dist/BeerCrackerz.bundle.js b/front/assets/dist/BeerCrackerz.bundle.js index 063706d..e3f5c0f 100644 --- a/front/assets/dist/BeerCrackerz.bundle.js +++ b/front/assets/dist/BeerCrackerz.bundle.js @@ -1 +1 @@ -!function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return w}});var r=Object.freeze({blue:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-blue.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),gold:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-gold.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),red:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-red.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),green:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-green.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),orange:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-orange.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),yellow:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-yellow.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),violet:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-violet.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),grey:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-grey.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),black:new window.L.Icon({iconUrl:"assets/img/marker/marker-icon-black.png",shadowUrl:"assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),user:new window.L.Icon({iconUrl:"assets/img/marker/user-position.png",shadowUrl:"assets/img/marker/user-position-shadow.png",iconSize:[32,32],iconAnchor:[16,16],popupAnchor:[1,-34],shadowSize:[32,32]})});function n(e,t){for(var r=0;r : -"),n.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),o.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(r),t.appendChild(n),t.appendChild(a),t.appendChild(o),t.appendChild(i),t.appendChild(c),t.appendChild(s),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,r,n){if(!0===window.DEBUG){var a=window.BeerCrackerz,o=a.nls.debug.bind(a.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(o("lat")," : ").concat(r.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(o("lng")," : ").concat(r.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(o("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(o("accuracy")," : ").concat(e.precisionRound(r.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(o("highAccuracy")," : ").concat(!0===n.enableHighAccuracy?o("enabled"):o("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(o("posAge")," : ").concat(n.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(o("posTimeout")," : ").concat(n.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(o("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(o("marks")," : ").concat(c,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(r){e.getReq("http://localhost:8000/".concat(t)).then(r)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("store").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&o(t.prototype,null),r&&o(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function c(e,t){for(var r=0;ri.CIRCLE_RADIUS&&console.log("Too far"),o!==t.user.username?a.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),r(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var r=0;rOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var r=0;r".concat(e.nls.map("planLayerOSM"),"

    ")]=r,a["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=n,i.getPreference("map-plan-layer"))switch(i.getPreference("map-plan-layer")){case e.nls.map("planLayerOSM"):r.addTo(e._map);break;case e.nls.map("satLayerEsri"):n.addTo(e._map);break;default:r.addTo(e._map)}else r.addTo(e._map);window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){document.getElementById("user-profile").addEventListener("click",e.userProfileModal.bind(e)),document.getElementById("hide-show").addEventListener("click",e.hidShowModal.bind(e)),document.getElementById("center-on").addEventListener("click",e.toggleFocusLock.bind(e)),document.getElementById("overlay").addEventListener("click",e.closeModal.bind(e)),e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0))),e.updateDebugUI()})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var r={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var n=function(t){e.markPopupFactory(t).then((function(r){t.dom=r,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t=i.CIRCLE_RADIUS&&t[r].circle.visible&&(t[r].circle.visible=!1,t[r].circle.setStyle({opacity:0,fillOpacity:0}))}};"true"===i.getPreference("poi-show-circle")&&(t(this._marks.spot),t(this._marks.store),t(this._marks.bar),t([this._user]))}},{key:"formatSavedMarker",value:function(e){return{type:e.type,lat:e.lat,lng:e.lng,name:e.name,description:e.description,user:e.username||this.user.username,userId:e.userId||this.user.id,dom:null,rate:e.rate,marker:null,circle:null}}},{key:"editMarker",value:function(e){this._map.closePopup(),this.editMarkModal(e)}},{key:"deleteMarker",value:function(e){var t=this;this.deleteMarkModal((function(r){if(!0===r){for(var n=t._marks[e.type],a=0;a : -"),n.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),o.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(r),t.appendChild(n),t.appendChild(a),t.appendChild(o),t.appendChild(i),t.appendChild(c),t.appendChild(s),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,r,n){if(!0===window.DEBUG){var a=window.BeerCrackerz,o=a.nls.debug.bind(a.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(o("lat")," : ").concat(r.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(o("lng")," : ").concat(r.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(o("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(o("accuracy")," : ").concat(e.precisionRound(r.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(o("highAccuracy")," : ").concat(!0===n.enableHighAccuracy?o("enabled"):o("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(o("posAge")," : ").concat(n.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(o("posTimeout")," : ").concat(n.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(o("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(o("marks")," : ").concat(c,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(r){e.getReq("http://localhost:8000/".concat(t)).then(r)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("store").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&o(t.prototype,null),r&&o(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function c(e,t){for(var r=0;ri.CIRCLE_RADIUS&&console.log("Too far"),o!==t.user.username?a.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),r(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var r=0;rOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var r=0;r".concat(e.nls.map("planLayerOSM"),"

    ")]=r,a["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=n,i.getPreference("map-plan-layer"))switch(i.getPreference("map-plan-layer")){case e.nls.map("planLayerOSM"):r.addTo(e._map);break;case e.nls.map("satLayerEsri"):n.addTo(e._map);break;default:r.addTo(e._map)}else r.addTo(e._map);window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){document.getElementById("user-profile").addEventListener("click",e.userProfileModal.bind(e)),document.getElementById("hide-show").addEventListener("click",e.hidShowModal.bind(e)),document.getElementById("center-on").addEventListener("click",e.toggleFocusLock.bind(e)),document.getElementById("overlay").addEventListener("click",e.closeModal.bind(e)),e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0))),e.updateDebugUI()})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var r={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var n=function(t){e.markPopupFactory(t).then((function(r){t.dom=r,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t=i.CIRCLE_RADIUS&&t[r].circle.visible&&(t[r].circle.visible=!1,t[r].circle.setStyle({opacity:0,fillOpacity:0}))}};"true"===i.getPreference("poi-show-circle")&&(t(this._marks.spot),t(this._marks.store),t(this._marks.bar),t([this._user]))}},{key:"formatSavedMarker",value:function(e){return{type:e.type,lat:e.lat,lng:e.lng,name:e.name,description:e.description,user:e.username||this.user.username,userId:e.userId||this.user.id,dom:null,rate:e.rate,marker:null,circle:null}}},{key:"editMarker",value:function(e){this._map.closePopup(),this.editMarkModal(e)}},{key:"deleteMarker",value:function(e){var t=this;this.deleteMarkModal((function(r){if(!0===r){for(var n=t._marks[e.type],a=0;a : -"),r.innerHTML="".concat(e("lng")," : -"),o.innerHTML="".concat(e("updates")," : 0"),a.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),s.innerHTML="".concat(e("posAge")," : -"),c.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(n),t.appendChild(r),t.appendChild(o),t.appendChild(a),t.appendChild(i),t.appendChild(s),t.appendChild(c),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,n,r){if(!0===window.DEBUG){var o=window.BeerCrackerz,a=o.nls.debug.bind(o.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,s=o.marks.spot.length+o.marks.store.length+o.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(a("lat")," : ").concat(n.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(a("lng")," : ").concat(n.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(a("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(a("accuracy")," : ").concat(e.precisionRound(n.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(a("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?a("enabled"):a("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(a("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(a("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(a("zoom")," : ").concat(o.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(a("marks")," : ").concat(s,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(n){e.getReq("http://localhost:8000/".concat(t)).then(n)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("store").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&a(t.prototype,null),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function s(e,t){for(var n=0;ni.CIRCLE_RADIUS&&console.log("Too far"),a!==t.user.username?o.removeChild(o.querySelector("#popup-edit")):(o.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),o.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),n(o)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var n=0;nOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var n=0;n".concat(e.nls.map("planLayerOSM"),"

    ")]=n,o["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=r,n.addTo(e._map),window.L.control.layers(o,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initGeolocation",value:function(){var e=this;return new Promise((function(t){if("geolocation"in navigator){var n="true"===i.getPreference("map-high-accuracy")?i.HIGH_ACCURACY:i.OPTIMIZED_ACCURACY;e._watchId=navigator.geolocation.watchPosition((function(t){e._user.lat=t.coords.latitude,e._user.lng=t.coords.longitude,e._user.accuracy=t.coords.accuracy,e._map&&(e.drawUserMarker(),e._map.setView(e._user))}),null,n),t()}else e._notification.raise(e.nls.notif("geolocationError")),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0)))})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var n={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var r=function(t){e.markPopupFactory(t).then((function(n){t.dom=n,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t : -"),r.innerHTML="".concat(e("lng")," : -"),o.innerHTML="".concat(e("updates")," : 0"),a.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),s.innerHTML="".concat(e("posAge")," : -"),c.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(n),t.appendChild(r),t.appendChild(o),t.appendChild(a),t.appendChild(i),t.appendChild(s),t.appendChild(c),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,n,r){if(!0===window.DEBUG){var o=window.BeerCrackerz,a=o.nls.debug.bind(o.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,s=o.marks.spot.length+o.marks.store.length+o.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(a("lat")," : ").concat(n.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(a("lng")," : ").concat(n.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(a("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(a("accuracy")," : ").concat(e.precisionRound(n.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(a("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?a("enabled"):a("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(a("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(a("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(a("zoom")," : ").concat(o.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(a("marks")," : ").concat(s,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(n){e.getReq("http://localhost:8000/".concat(t)).then(n)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("store").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&a(t.prototype,null),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function s(e,t){for(var n=0;ni.CIRCLE_RADIUS&&console.log("Too far"),a!==t.user.username?o.removeChild(o.querySelector("#popup-edit")):(o.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),o.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),n(o)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var n=0;nOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var n=0;n".concat(e.nls.map("planLayerOSM"),"

    ")]=n,o["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=r,n.addTo(e._map),window.L.control.layers(o,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initGeolocation",value:function(){var e=this;return new Promise((function(t){if("geolocation"in navigator){var n="true"===i.getPreference("map-high-accuracy")?i.HIGH_ACCURACY:i.OPTIMIZED_ACCURACY;e._watchId=navigator.geolocation.watchPosition((function(t){e._user.lat=t.coords.latitude,e._user.lng=t.coords.longitude,e._user.accuracy=t.coords.accuracy,e._map&&(e.drawUserMarker(),e._map.setView(e._user))}),null,n),t()}else e._notification.raise(e.nls.notif("geolocationError")),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0)))})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var n={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var r=function(t){e.markPopupFactory(t).then((function(n){t.dom=n,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t +

    BeerCrackerz

    {{FORGOT_PASSWORD_SUBTITLE}}

    diff --git a/front/assets/html/aside/login.html b/front/assets/html/aside/login.html index 43d8c94..dd8c26f 100644 --- a/front/assets/html/aside/login.html +++ b/front/assets/html/aside/login.html @@ -1,4 +1,4 @@ -
    +

    BeerCrackerz

    {{LOGIN_SUBTITLE}}

    diff --git a/front/assets/html/aside/register.html b/front/assets/html/aside/register.html index cfbe267..0490ebf 100644 --- a/front/assets/html/aside/register.html +++ b/front/assets/html/aside/register.html @@ -1,4 +1,4 @@ -
    +

    BeerCrackerz

    {{REGISTER_SUBTITLE}}

    diff --git a/front/assets/html/modal/editbar.html b/front/assets/html/modal/editbar.html index 567b294..1c61023 100644 --- a/front/assets/html/modal/editbar.html +++ b/front/assets/html/modal/editbar.html @@ -7,11 +7,11 @@

    {{MODAL_TITLE}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    diff --git a/front/assets/html/modal/editspot.html b/front/assets/html/modal/editspot.html index b3430a8..b08d201 100644 --- a/front/assets/html/modal/editspot.html +++ b/front/assets/html/modal/editspot.html @@ -7,11 +7,11 @@

    {{MODAL_TITLE}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    diff --git a/front/assets/html/modal/editstore.html b/front/assets/html/modal/editstore.html index a734711..b9e765e 100644 --- a/front/assets/html/modal/editstore.html +++ b/front/assets/html/modal/editstore.html @@ -7,11 +7,11 @@

    {{MODAL_TITLE}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    diff --git a/front/assets/html/modal/hideshow.html b/front/assets/html/modal/hideshow.html index ac4adaa..4641c03 100644 --- a/front/assets/html/modal/hideshow.html +++ b/front/assets/html/modal/hideshow.html @@ -2,27 +2,27 @@

    {{MODAL_TITLE}}

    - label-toggle + label-toggle
    - circle-toggle + circle-toggle
    - show-spots + show-spots
    - show-stores + show-stores
    - show-bars + show-bars
    diff --git a/front/assets/html/modal/newbar.html b/front/assets/html/modal/newbar.html index 19b9f64..75d3d69 100644 --- a/front/assets/html/modal/newbar.html +++ b/front/assets/html/modal/newbar.html @@ -8,9 +8,9 @@

    {{BAR_TITLE}}

    - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star
    diff --git a/front/assets/html/modal/newspot.html b/front/assets/html/modal/newspot.html index bd47f37..65081af 100644 --- a/front/assets/html/modal/newspot.html +++ b/front/assets/html/modal/newspot.html @@ -8,11 +8,11 @@

    {{SPOT_TITLE}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    diff --git a/front/assets/html/modal/newstore.html b/front/assets/html/modal/newstore.html index df6d5d1..4adb7c9 100644 --- a/front/assets/html/modal/newstore.html +++ b/front/assets/html/modal/newstore.html @@ -8,9 +8,9 @@

    {{STORE_TITLE}}

    - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star
    diff --git a/front/assets/html/modal/user.html b/front/assets/html/modal/user.html index 5e08a14..45550f1 100644 --- a/front/assets/html/modal/user.html +++ b/front/assets/html/modal/user.html @@ -2,12 +2,12 @@

    {{MODAL_TITLE}}

    - high-accuracy-toggle + high-accuracy-toggle
    - debug-toggle + debug-toggle
    diff --git a/front/assets/html/popup/bar.html b/front/assets/html/popup/bar.html index 247c625..d0ad110 100644 --- a/front/assets/html/popup/bar.html +++ b/front/assets/html/popup/bar.html @@ -2,22 +2,22 @@

    {{BAR_NAME}}

    {{BAR_FOUND_BY}} {{BAR_FINDER}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star

    ({{BAR_RATE}}/5)

    {{BAR_DESC}}

    - comment-mark - photo-mark + comment-mark + photo-mark
    diff --git a/front/assets/html/popup/spot.html b/front/assets/html/popup/spot.html index a8bc30d..1d11502 100644 --- a/front/assets/html/popup/spot.html +++ b/front/assets/html/popup/spot.html @@ -2,22 +2,22 @@

    {{SPOT_NAME}}

    {{SPOT_FOUND_BY}} {{SPOT_FINDER}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star

    ({{SPOT_RATE}}/5)

    {{SPOT_DESC}}

    - comment-mark - photo-mark + comment-mark + photo-mark
    diff --git a/front/assets/html/popup/store.html b/front/assets/html/popup/store.html index 25791ce..ca9988c 100644 --- a/front/assets/html/popup/store.html +++ b/front/assets/html/popup/store.html @@ -2,22 +2,22 @@

    {{STORE_NAME}}

    {{STORE_FOUND_BY}} {{STORE_FINDER}}

    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star

    ({{STORE_RATE}}/5)

    {{STORE_DESC}}

    - comment-mark - photo-mark + comment-mark + photo-mark
    diff --git a/front/index.html b/front/index.html index c6dd815..005011d 100644 --- a/front/index.html +++ b/front/index.html @@ -13,28 +13,28 @@ - + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + @@ -42,7 +42,7 @@ - +
    @@ -51,13 +51,13 @@ @@ -75,7 +75,7 @@ - + - - - - - - - - -
    - -

    Class: BeerCrackerz

    - - - - - - -
    - -
    - -

    BeerCrackerz()

    - - -
    - -
    -
    - - - - - - -

    new BeerCrackerz()

    - - - -

    The BeerCrackerz main component

    - - - - -
    -
    -This component handles the whole BeerCrackerz app. It includes the map manipulation, -the geolocation API to update the user position and process any map events that are -relevant to an UX stand point. For more information, please consult the application -description page at https://about.beercrackerz.org/ -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - -
    - - -

    Extends

    - - - - -
      -
    • MapHelper
    • -
    - - - - - - - - - - - - - - - -

    Members

    - - - -

    (private) _clusters :Object

    - - - - -
    -

    The stored clusters for markers, see Leaflet.markercluster plugin

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _debugElement :Object

    - - - - -
    -

    The debug DOM object

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _isZooming :Boolean

    - - - - -
    -

    Flag to know if a zoom action is occuring on map

    -
    - - - -
    Type:
    -
      -
    • - -Boolean - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _lang :Boolean

    - - - - -
    -

    The LangManager must be instantiated to handle nls accross the app

    -
    - - - -
    Type:
    -
      -
    • - -Boolean - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _map :Object

    - - - - -
    -

    The core Leaflet.js map

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _marks :Object

    - - - - -
    -

    The stored marks for spots, stores and bars

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _newMarker :Object

    - - - - -
    -

    The temporary marker for new marks only

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _notification :Object

    - - - - -
    -

    The notification handler

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _user :Object

    - - - - -
    -

    The user object holds everything useful to ensure a proper session

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _watchId :Number

    - - - - -
    -

    ID for geolocation watch callback

    -
    - - - -
    Type:
    -
      -
    • - -Number - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _zoomSlider :Object

    - - - - -
    -

    The zoom slider handler

    -
    - - - -
    Type:
    -
      -
    • - -Object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    map

    - - - - - - - - - - -
    Properties:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    map - - -Object - - - -

    Leaflet.js map getter

    - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    marks

    - - - - - - - - - - -
    Properties:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    marks - - -Object - - - -

    Leaflet.js marks that holds spot/store/bar marks as subkeys

    - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    nls

    - - - - - - - - - - -
    Properties:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    nls - - -Object - - - -

    The LangManager getter

    - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    user

    - - - - - - - - - - -
    Properties:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    user - - -Object - - - -

    The session user object

    - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - -

    Methods

    - - - - - - - -

    (private, static) _init()

    - - - - - - -
    -
    -The _init() method is designed to properly configure the user session, according -to its saved preferences and its position. It first build the debug interface, -then loads the user preferences, then create the map and finally, events are listened. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (private, static) _initEvents() → {Promise}

    - - - - - - -
    -
    -The _initEvents() method will listen to all required events to manipulate the map. Those events -are both for commands and for map events (click, drag, zoom and layer change). -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    A Promise resolved when preferences are set

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (private, static) _initGeolocation() → {Promise}

    - - - - - - -
    -
    -The _initGeolocation() method will request from browser the location authorization. -Once granted, an event listener is set on any position update, so it can update the -map state and the markers position. This method can be called again, only if the -geolocation watch has been cleared ; for example when updating the accuracy options. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    A Promise resolved when preferences are set

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (private, static) _initMap() → {Promise}

    - - - - - - -
    -
    -The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite), -add scale control, remove zoom control and set map bounds. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    A Promise resolved when preferences are set

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (private, static) _initMarkers() → {Promise}

    - - - - - - -
    -
    -The _initEvents() method will initialize all saved marker into the map. -Markers must be retrieved from server with a specific format to ensure it works -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    A Promise resolved when preferences are set

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (private, static) _initPreferences() → {Promise}

    - - - - - - -
    -
    -The _initPreferences() will initialize user preference if they are not set yet, -it will also update the UI according to user preferences ; debug DOM visible, -update the command classList for selected ones. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    A Promise resolved when preferences are set

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (private, static) _initUser() → {Promise}

    - - - - - - -
    -
    -The _init() method initialize the user object according to its information -and statistic so the UI can be properly built. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    A Promise resolved when preferences are set

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (private, static) _markerSaved(options)

    - - - - - - -
    -
    -The _markerSaved() method is the callback used when a marker is created and added -to the map. It is the last method of a new marker proccess. -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    options - - -Object - - - -

    The new marker options

    - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) aboutModal()

    - - - - - - -
    -
    -The aboutModal() method will request the about modal, which contains -information about BeerCrackerz, cookies/tracking policies and links -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) addDebugUI()

    - - - - - - -
    -
    -The addDebugUI() method appends the debug DOM element to the document body -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) closeModal(event)

    - - - - - - -
    -
    -The closeModal() method will close any opened modal if the click event is -targeted on the modal overlay or on close buttons -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event - - -Event - - - -

    The click event

    - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) deleteMarker(options)

    - - - - - - -
    -
    -This method will delete a mark after prompting the user if he trully wants to -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    options - - -Object - - - -

    The mark options to delete

    - - - - - - -
    - - - - -
    Since:
    -
    • February 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) deleteMarkModal(cb)

    - - - - - - -
    -
    -The deleteMarkModal() method will request the mark delete modal, which prompts -the user a confirmation to actually delete the mark -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    cb - - -function - - - -

    The function to callback with true or false depending on user's choice

    - - - - - - -
    - - - - -
    Since:
    -
    • February 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) editMarker(options)

    - - - - - - -
    -
    -This method will open a mark edition modal -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    options - - -Object - - - -

    The mark options to edit

    - - - - - - -
    - - - - -
    Since:
    -
    • February 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) formatSavedMarker(mark)

    - - - - - - -
    -
    -This method formats a mark returned from MapHelper so it can be parsed -using JSON.parse (in order to store it in local storage/database) -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    mark - - -Object - - - -

    The mark options from internal this._marks[type]

    - - - - - - -
    - - - - -
    Since:
    -
    • February 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) hidShowModal()

    - - - - - - -
    -
    -The hidShowModal() method will request the hide show modal, which all -toggles for map elements ; labels/circles/spots/stores/bars -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) mapClicked(event)

    - - - - - - -
    -
    -The mapClicked() method is the callback used when the user clicked on the Leaflet.js map -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    event - - -Event - - - -

    The click event

    - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) removeDebugUI()

    - - - - - - -
    -
    -The removeDebugUI() method remove the debug DOM element from the document body -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) toggleCircle()

    - - - - - - -
    -
    -The toggleCircle() method will, depending on user preference, display or not -the circles around the spots/stores/bars marks. This circle indicates the minimal -distance which allow the user to make updates on the mark information -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) toggleDebug()

    - - - - - - -
    -
    -The toggleDebug() method will, depending on user preference, add or remove -the debug DOM element to the user interface. The debug DOM display several -useful information to identify an issue with the geolocation API -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) toggleFocusLock()

    - - - - - - -
    -
    -The toggleFocusLock() method will, depending on user preference, lock or unlock -the map centering around the user marker at each position refresh. This way the user -can roam while the map is following its position. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) toggleHighAccuracy()

    - - - - - - -
    -
    -The toggleHighAccuracy() method will, depending on user preference, update the -geolocation accuracy between optimized and high. The high settings might cause -more memory and processing consumption, but gives better results. It will clear -any previous position watch on the geolocation API so it can subscribe a new one -with the new accuracy parameters (see Utils for values) -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) toggleLabel()

    - - - - - - -
    -
    -The toggleLabel() method will, depending on user preference, display or not -the labels attached to spots/stores/bars marks. This label is basically the -mark name given by its creator. -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) toggleMarkers(type)

    - - - - - - -
    -
    -The toggleMarkers() method will, depending on user preference, display or not -a given mark type. This way, the user can fine tune what is displayed on the map. -A mark type in spots/stores/bars must be given as an argument -
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    type - - -String - - - -

    The mark type in spots/tores/bars

    - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) updateDebugUI()

    - - - - - - -
    -
    -The updateDebugUI() method will update informations held in the debug DOM -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) updateMarkerCirclesVisibility()

    - - - - - - -
    -
    -The updateMarkerCirclesVisibility() method will update the circle visibility for -all mark types (spots/stores/bars) and for the user marker -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    (static) userProfileModal()

    - - - - - - -
    -
    -The userProfileModal() method will request the user modal, which contains -the user preferences, and the user profile information -
    -
    - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.10 on Fri Feb 11 2022 16:38:03 GMT+0100 (GMT+01:00) -
    - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/BeerCrackerz.js.html b/front/doc/beercrackerz/0.0.1/BeerCrackerz.js.html deleted file mode 100644 index f1eefe0..0000000 --- a/front/doc/beercrackerz/0.0.1/BeerCrackerz.js.html +++ /dev/null @@ -1,1242 +0,0 @@ - - - - - JSDoc: Source: BeerCrackerz.js - - - - - - - - - - -
    - -

    Source: BeerCrackerz.js

    - - - - - - -
    -
    -
    import './BeerCrackerz.scss';
    -import MapHelper from './js/MapHelper.js';
    -import ZoomSlider from './js/ui/ZoomSlider.js';
    -import LangManager from './js/utils/LangManager.js';
    -import Notification from './js/ui/Notification.js';
    -import Rating from './js/ui/Rating.js';
    -import Utils from './js/utils/Utils.js';
    -
    -
    -/**
    - * @class
    - * @constructor
    - * @public
    - * @extends MapHelper
    -**/
    -class BeerCrackerz extends MapHelper {
    -
    -
    -	/**
    -	 * @summary The BeerCrackerz main component
    -	 * @author Arthur Beaulieu
    -	 * @since January 2022
    -	 * @description
    -	 * <blockquote>
    -	 * This component handles the whole BeerCrackerz app. It includes the map manipulation,
    -	 * the geolocation API to update the user position and process any map events that are
    -	 * relevant to an UX stand point. For more information, please consult the application
    -	 * description page at <a href="https://about.beercrackerz.org">https://about.beercrackerz.org/</a>
    -	 * </blockquote>
    -	 **/
    -	constructor() {
    -    super();
    -    /**
    -     * The core Leaflet.js map
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._map = null;
    -    /**
    -     * The zoom slider handler
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._zoomSlider = null;
    -    /**
    -     * The notification handler
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._notification = null;
    -    /**
    -     * The user object holds everything useful to ensure a proper session
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._user = {
    -      lat: 48.853121540141096, // Default lat to Paris Notre-Dame latitude
    -      lng: 2.3498955769881156, // Default lng to Paris Notre-Dame longitude
    -      accuracy: 0, // Accuracy in meter given by geolocation API
    -      marker: null, // The user marker on map
    -      circle: null, // The accuracy circle around the user marker
    -      range: null, // The range in which user can add a new marker
    -      color: Utils.USER_COLOR, // The color to use for circle (match the user marker color)
    -			id: -1,
    -			username: ''
    -    };
    -    /**
    -     * The stored marks for spots, stores and bars
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._marks = {
    -      spot: [],
    -      store: [],
    -      bar: [],
    -    };
    -    /**
    -     * The stored clusters for markers, see Leaflet.markercluster plugin
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._clusters = {
    -      spot: {},
    -      store: {},
    -      bar: {},
    -    };
    -    /**
    -     * The temporary marker for new marks only
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._newMarker = null;
    -    /**
    -     * The debug DOM object
    -     * @type {Object}
    -     * @private
    -     **/
    -    this._debugElement = null;
    -    /**
    -     * ID for geolocation watch callback
    -     * @type {Number}
    -     * @private
    -     **/
    -    this._watchId = null;
    -    /**
    -     * Flag to know if a zoom action is occuring on map
    -     * @type {Boolean}
    -     * @private
    -     **/
    -    this._isZooming = false;
    -    /**
    -     * The LangManager must be instantiated to handle nls accross the app
    -     * @type {Boolean}
    -     * @private
    -     **/
    -    // The BeerCrackerz app is only initialized once nls are set up
    -    this._lang = new LangManager(
    -      window.navigator.language.substring(0, 2),
    -      this._init.bind(this)
    -    );
    -  }
    -
    -
    -  // ======================================================================== //
    -  // ----------------- Application initialization sequence ------------------ //
    -  // ======================================================================== //
    -
    -
    -	/**
    -	 * @method
    -   * @name _init
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _init() method is designed to properly configure the user session, according
    -	 * to its saved preferences and its position. It first build the debug interface,
    -	 * then loads the user preferences, then create the map and finally, events are listened.
    -	 * </blockquote>
    -	 **/
    -	_init() {
    -		this._debugElement = Utils.initDebugInterface();
    -		this._notification = new Notification();
    -    this._initUser()
    -      .then(this._initPreferences.bind(this))
    -      .then(this._initGeolocation.bind(this))
    -      .then(this._initMap.bind(this))
    -      .then(this._initEvents.bind(this))
    -      .then(this._initMarkers.bind(this));
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _initUser
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _init() method initialize the user object according to its information
    -	 * and statistic so the UI can be properly built.
    -	 * </blockquote>
    -	 * @returns {Promise} A Promise resolved when preferences are set
    -	 **/
    -	_initUser() {
    -		return new Promise(resolve => {
    -			// TODO fill user information from server
    -			this._user.id = 42;
    -			this._user.username = 'messmaker';
    -			resolve();
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _initPreferences
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _initPreferences() will initialize user preference if they are not set yet,
    -	 * it will also update the UI according to user preferences ; debug DOM visible,
    -	 * update the command classList for selected ones.
    -	 * </blockquote>
    -	 * @returns {Promise} A Promise resolved when preferences are set
    -	 **/
    -	_initPreferences() {
    -		return new Promise(resolve => {
    -			if (Utils.getPreference('poi-show-spot') === null) {
    -				Utils.setPreference('poi-show-spot', true);
    -			}
    -
    -			if (Utils.getPreference('poi-show-store') === null) {
    -        Utils.setPreference('poi-show-store', true);
    -      }
    -
    -			if (Utils.getPreference('poi-show-bar') === null) {
    -        Utils.setPreference('poi-show-bar', true);
    -      }
    -
    -			if (Utils.getPreference('map-plan-layer') === null) {
    -        Utils.setPreference('map-plan-layer', true);
    -      }
    -
    -			if (window.DEBUG === true || (Utils.getPreference('app-debug') === 'true')) {
    -				window.DEBUG = true; // Ensure to set global flag if preference comes from local storage
    -				Utils.setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url
    -				this.addDebugUI();
    -      }
    -			// Update icon class if center on preference is set to true
    -			if (Utils.getPreference('map-center-on-user') === 'true') {
    -        document.getElementById('center-on').classList.add('lock-center-on');
    -      }
    -
    -			resolve();
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _initGeolocation
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _initGeolocation() method will request from browser the location authorization.
    -	 * Once granted, an event listener is set on any position update, so it can update the
    -	 * map state and the markers position. This method can be called again, only if the
    -	 * geolocation watch has been cleared ; for example when updating the accuracy options.
    -	 * </blockquote>
    -	 * @returns {Promise} A Promise resolved when preferences are set
    -	 **/
    -	_initGeolocation() {
    -		return new Promise(resolve => {
    -			if ('geolocation' in navigator) {
    -				const options = (Utils.getPreference('map-high-accuracy') === 'true') ? Utils.HIGH_ACCURACY : Utils.OPTIMIZED_ACCURACY;
    -				this._watchId = navigator.geolocation.watchPosition(position => {
    -					// Update saved user position
    -					this._user.lat = position.coords.latitude;
    -					this._user.lng = position.coords.longitude;
    -					this._user.accuracy = position.coords.accuracy;
    -					// Only draw marker if map is already created
    -					if (this._map) {
    -						this.drawUserMarker();
    -						this.updateMarkerCirclesVisibility();
    -						// Update map position if focus lock is active
    -						if (Utils.getPreference('map-center-on-user') === 'true' && !this._isZooming) {
    -							this._map.setView(this._user);
    -            }
    -						// Updating debug info
    -						this.updateDebugUI();
    -					}
    -					resolve();
    -				}, resolve, options);
    -      } else {
    -				this._notification.raise(this.nls.notif('geolocationError'));
    -				resolve();
    -			}
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _initMap
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),
    -	 * add scale control, remove zoom control and set map bounds.
    -	 * </blockquote>
    -	 * @returns {Promise} A Promise resolved when preferences are set
    -	 **/
    -	_initMap() {
    -		return new Promise(resolve => {
    -			// Use main div to inject OSM into
    -			this._map = window.L.map('beer-crakerz-map', {
    -				zoomControl: false,
    -			}).setView([this._user.lat, this._user.lng], 18);
    -			// Add meter and feet scale on map
    -			window.L.control.scale().addTo(this._map);
    -			// Place user marker on the map
    -			this.drawUserMarker();
    -			// Add OSM credits to the map next to leaflet credits
    -			const osm = window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    -				attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
    -				maxZoom: 21,
    -				maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19
    -				minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible
    -			});
    -			const esri = window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {
    -				attribution: '&copy; <a href="https://www.arcgis.com/home/item.html?id=10df2279f9684e4a9f6a7f08febac2a9">Esri Imagery</a>',
    -				maxZoom: 21,
    -				maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19
    -				minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible
    -			});
    -			// Prevent panning outside of the world's edge
    -			this._map.setMaxBounds(Utils.MAP_BOUNDS);
    -			// Add layer group to interface
    -			const baseMaps = {};
    -			baseMaps[`<p>${this.nls.map('planLayer')}</p>`] = osm;
    -			baseMaps[`<p>${this.nls.map('satLayer')}</p>`] = esri;
    -			// Append layer depending on user preference
    -			if (Utils.getPreference('map-plan-layer') === 'true') {
    -				osm.addTo(this._map);
    -      } else {
    -				esri.addTo(this._map);
    -			}
    -			// Add layer switch radio on bottom right of the map
    -			window.L.control.layers(baseMaps, {}, { position: 'bottomright' }).addTo(this._map);
    -			// Init zoom slider when map has been created
    -			this._zoomSlider = new ZoomSlider(this._map);			
    -			resolve();
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _initEvents
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _initEvents() method will listen to all required events to manipulate the map. Those events
    -	 * are both for commands and for map events (click, drag, zoom and layer change).
    -	 * </blockquote>
    -	 * @returns {Promise} A Promise resolved when preferences are set
    -	 **/
    -	_initEvents() {
    -		return new Promise(resolve => {
    -			// Command events
    -			document.getElementById('user-profile').addEventListener('click', this.userProfileModal.bind(this));
    -			document.getElementById('about').addEventListener('click', this.aboutModal.bind(this));
    -			document.getElementById('hide-show').addEventListener('click', this.hidShowModal.bind(this));
    -			document.getElementById('center-on').addEventListener('click', this.toggleFocusLock.bind(this));
    -			document.getElementById('overlay').addEventListener('click', this.closeModal.bind(this));
    -			// Subscribe to click event on map to react
    -			this._map.on('click', this.mapClicked.bind(this));
    -			// Map is dragged by user mouse/finger
    -			this._map.on('drag', () => {
    -				// Constrain pan to the map bounds
    -				this._map.panInsideBounds(Utils.MAP_BOUNDS, { animate: true });
    -				// Disable lock focus if user drags the map
    -				if (Utils.getPreference('map-center-on-user') === 'true') {
    -					this.toggleFocusLock();
    -				}
    -			});
    -			// Map events
    -			this._map.on('zoomstart', () => {
    -				this._isZooming = true;
    -				if (Utils.getPreference('poi-show-circle') === 'true') {
    -					this.setMarkerCircles(this._marks.spot, false);
    -					this.setMarkerCircles(this._marks.store, false);
    -					this.setMarkerCircles(this._marks.bar, false);
    -					this.setMarkerCircles([this._user], false);
    -					this.setMarkerCircles([{ circle: this._user.range }], false);
    -				}
    -			});
    -			this._map.on('zoomend', () => {
    -        this._isZooming = false;
    -				if (Utils.getPreference('poi-show-circle') === 'true') {
    -					if (this._map.getZoom() >= 15) {
    -						this.setMarkerCircles(this._marks.spot, true);
    -						this.setMarkerCircles(this._marks.store, true);
    -						this.setMarkerCircles(this._marks.bar, true);
    -						this.setMarkerCircles([this._user], true);
    -						this.setMarkerCircles([{ circle: this._user.range }], true);
    -					}
    -				}
    -				// Auto hide labels if zoom level is too high (and restore it when needed)
    -				if (Utils.getPreference('poi-marker-label') === 'true') {
    -					if (this._map.getZoom() < 15) {
    -						this.setMarkerLabels(this._marks.spot, false);
    -						this.setMarkerLabels(this._marks.store, false);
    -						this.setMarkerLabels(this._marks.bar, false);
    -					} else {
    -						this.setMarkerLabels(this._marks.spot, true);
    -            this.setMarkerLabels(this._marks.store, true);
    -            this.setMarkerLabels(this._marks.bar, true);
    -					}
    -				}
    -        // Updating debug info
    -        this.updateDebugUI();
    -      });
    -			this._map.on('baselayerchange', event => {
    -				const planActive = (Utils.stripDom(event.name) === this.nls.map('planLayer'));
    -				Utils.setPreference('map-plan-layer', planActive);
    -      });
    -			resolve();
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _initMarkers
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _initEvents() method will initialize all saved marker into the map. 
    -	 * Markers must be retrieved from server with a specific format to ensure it works
    -	 * </blockquote>
    -	 * @returns {Promise} A Promise resolved when preferences are set
    -	 **/	
    -	_initMarkers() {
    -		return new Promise(resolve => {
    -			// Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)
    -			const clusterOptions = {
    -				animateAddingMarkers: true,
    -				disableClusteringAtZoom: 18,
    -				spiderfyOnMaxZoom: false
    -			};
    -			this._clusters.spot = new window.L.MarkerClusterGroup(clusterOptions);
    -			this._clusters.store = new window.L.MarkerClusterGroup(clusterOptions);
    -			this._clusters.bar = new window.L.MarkerClusterGroup(clusterOptions);
    -			// Append clusters to the map depending on user preferences
    -			if (Utils.getPreference(`poi-show-spot`) === 'true') {
    -				this._map.addLayer(this._clusters.spot);
    -			}
    -			if (Utils.getPreference(`poi-show-store`) === 'true') {
    -        this._map.addLayer(this._clusters.store);
    -      }
    -			if (Utils.getPreference(`poi-show-bar`) === 'true') {
    -        this._map.addLayer(this._clusters.bar);
    -      }
    -			// Load data from local storage, later to be fetched from server
    -			const iterateMarkers = mark => {
    -        this.markPopupFactory(mark).then(dom => {
    -          mark.dom = dom;
    -          mark.marker = this.placeMarker(mark);
    -					this._marks[mark.type].push(mark);
    -					this._clusters[mark.type].addLayer(mark.marker);
    -				});
    -			};
    -			let marks = JSON.parse(Utils.getPreference('saved-spot')) || [];
    -			for (let i = 0; i < marks.length; ++i) {
    -				iterateMarkers(marks[i]);
    -			}
    -			marks = JSON.parse(Utils.getPreference('saved-store')) || [];
    -			for (let i = 0; i < marks.length; ++i) {
    -				iterateMarkers(marks[i]);
    -			}
    -			marks = JSON.parse(Utils.getPreference('saved-bar')) || [];
    -			for (let i = 0; i < marks.length; ++i) {
    -				iterateMarkers(marks[i]);
    -			}
    -
    -			resolve();
    -		});
    -	}
    -
    -
    -  // ======================================================================== //
    -  // ------------------------- Toggle for map items ------------------------- //
    -  // ======================================================================== //	
    -
    -
    -	/**
    -	 * @method
    -   * @name toggleFocusLock
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The toggleFocusLock() method will, depending on user preference, lock or unlock
    -	 * the map centering around the user marker at each position refresh. This way the user
    -	 * can roam while the map is following its position. 
    -	 * </blockquote>
    -	 **/
    -	toggleFocusLock() {
    -		if (Utils.getPreference('map-center-on-user') === 'true') {
    -      document.getElementById('center-on').classList.remove('lock-center-on');
    -      Utils.setPreference('map-center-on-user', 'false');
    -    } else {
    -      document.getElementById('center-on').classList.add('lock-center-on');
    -      this._map.flyTo([this._user.lat, this._user.lng], 18);
    -      Utils.setPreference('map-center-on-user', 'true');
    -    }
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name toggleLabel
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The toggleLabel() method will, depending on user preference, display or not
    -	 * the labels attached to spots/stores/bars marks. This label is basically the
    -	 * mark name given by its creator.
    -	 * </blockquote>
    -	 **/
    -	toggleLabel() {
    -		const visible = !(Utils.getPreference('poi-marker-label') === 'true');
    -		this.setMarkerLabels(this._marks.spot, visible);
    -		this.setMarkerLabels(this._marks.store, visible);
    -		this.setMarkerLabels(this._marks.bar, visible);
    -		Utils.setPreference('poi-marker-label', visible);
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name toggleCircle
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The toggleCircle() method will, depending on user preference, display or not
    -	 * the circles around the spots/stores/bars marks. This circle indicates the minimal
    -	 * distance which allow the user to make updates on the mark information
    -	 * </blockquote>
    -	 **/
    -	toggleCircle() {
    -		const visible = !(Utils.getPreference('poi-show-circle') === 'true');
    -		this.setMarkerCircles(this._marks.spot, visible);
    -		this.setMarkerCircles(this._marks.store, visible);
    -		this.setMarkerCircles(this._marks.bar, visible);
    -		this.setMarkerCircles([this._user], visible);
    -		this.setMarkerCircles([{ circle: this._user.range }], visible);
    -		Utils.setPreference('poi-show-circle', visible);
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name toggleMarkers
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The toggleMarkers() method will, depending on user preference, display or not
    -	 * a given mark type. This way, the user can fine tune what is displayed on the map.
    -	 * A mark type in spots/stores/bars must be given as an argument
    -	 * </blockquote>
    -	 * @param {String} type The mark type in spots/tores/bars
    -	 **/
    -	toggleMarkers(type) {
    -		const visible = !(Utils.getPreference(`poi-show-${type}`) === 'true');
    -		if (visible === true) {
    -			this._map.addLayer(this._clusters[type]);
    -		} else {
    -			this._map.removeLayer(this._clusters[type]);
    -		}
    -		Utils.setPreference(`poi-show-${type}`, visible);
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name toggleHighAccuracy
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The toggleHighAccuracy() method will, depending on user preference, update the
    -	 * geolocation accuracy between optimized and high. The high settings might cause
    -	 * more memory and processing consumption, but gives better results. It will clear
    -	 * any previous position watch on the geolocation API so it can subscribe a new one
    -	 * with the new accuracy parameters (see Utils for values)
    -	 * </blockquote>
    -	 **/
    -	toggleHighAccuracy() {
    -		const high = !(Utils.getPreference('map-high-accuracy') === 'true');
    -		Utils.setPreference('map-high-accuracy', high);
    -		navigator.geolocation.clearWatch(this._watchId);
    -		this._initGeolocation().then(this.updateDebugUI.bind(this));
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name toggleDebug
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The toggleDebug() method will, depending on user preference, add or remove
    -	 * the debug DOM element to the user interface. The debug DOM display several
    -	 * useful information to identify an issue with the geolocation API
    -	 * </blockquote>
    -	 **/
    -	toggleDebug() {
    -		const visible = !window.DEBUG;
    -		window.DEBUG = visible;
    -		Utils.setPreference('app-debug', visible);
    -		if (visible) {
    -			this.addDebugUI();
    -		} else {
    -			this.removeDebugUI();
    -		}
    -	}
    -
    -
    -  // ======================================================================== //
    -  // ----------------- App modals display and interaction ------------------- //
    -  // ======================================================================== //	
    -
    -
    -	newMarkModal(dom) {
    -		document.getElementById('overlay').appendChild(dom);
    -		document.getElementById('overlay').style.display = 'flex';
    -		setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50);
    -	}
    -
    -
    -	editMarkModal(options) {	
    -		Utils.fetchTemplate(`assets/html/modal/edit${options.type}.html`).then(dom => {
    -			const name = dom.querySelector(`#${options.type}-name`);
    -      const description = dom.querySelector(`#${options.type}-desc`);
    -			const submit = dom.querySelector(`#${options.type}-submit`);
    -			const cancel = dom.querySelector(`#${options.type}-cancel`);
    -			const rate = dom.querySelector(`#${options.type}-rating`);
    -			const rating = new Rating(rate, options.rate);
    -			// Update nls for template
    -			Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal(`${options.type}EditTitle`));
    -      Utils.replaceString(dom.querySelector(`#nls-${options.type}-name`), `{{${options.type.toUpperCase()}_NAME}}`, this.nls[options.type]('nameLabel'));
    -      Utils.replaceString(dom.querySelector(`#nls-${options.type}-desc`), `{{${options.type.toUpperCase()}_DESC}}`, this.nls[options.type]('descLabel'));
    -      Utils.replaceString(dom.querySelector(`#nls-${options.type}-rate`), `{{${options.type.toUpperCase()}_RATE}}`, this.nls[options.type]('rateLabel'));
    -      Utils.replaceString(submit, `{{${options.type.toUpperCase()}_SUBMIT}}`, this.nls.nav('add'));
    -      Utils.replaceString(cancel, `{{${options.type.toUpperCase()}_CANCEL}}`, this.nls.nav('cancel'));
    -			name.value = options.name;		
    -			description.value = options.description;
    -			submit.addEventListener('click', () => {
    -				// Iterate through marks to find matching one (by coord as marks coordinates are unique)
    -				for (let i = 0; i < this._marks[options.type].length; ++i) {
    -          // We found, remove circle, label and marker from map/clusters
    -          if (options.lat === this._marks[options.type][i].lat && options.lng === this._marks[options.type][i].lng) {
    -            this._marks[options.type][i].name = name.value;
    -            this._marks[options.type][i].description = description.value;
    -            this._marks[options.type][i].rate = rating.currentRate;
    -						options.tooltip.removeFrom(this.map);
    -						this.markPopupFactory(options).then(dom => {
    -							options.dom = dom;
    -							options.marker.setPopupContent(options.dom);
    -						});
    -            break;
    -          }
    -        }
    -				// Format marks to be saved and then update user preference with
    -				const formattedMarks = [];
    -				for (let i = 0; i < this._marks[options.type].length; ++i) {
    -					formattedMarks.push(this.formatSavedMarker(this._marks[options.type][i]));
    -				}
    -				Utils.setPreference(`saved-${options.type}`, JSON.stringify(formattedMarks));
    -				// Notify user through UI that marker has been successfully deleted
    -				this._notification.raise(this.nls.notif(`${options.type}Deleted`));
    -				this.closeModal(null, true);
    -      });
    -
    -			cancel.addEventListener('click', this.closeModal.bind(this, null, true));
    -			document.getElementById('overlay').appendChild(dom);
    -      document.getElementById('overlay').style.display = 'flex';
    -			setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50);
    -		});	
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name deleteMarkModal
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since February 2022
    -   * @description
    -	 * <blockquote>
    -	 * The deleteMarkModal() method will request the mark delete modal, which prompts
    -	 * the user a confirmation to actually delete the mark
    -	 * </blockquote>
    -	 * @param {Function} cb The function to callback with true or false depending on user's choice
    -	 **/
    -	deleteMarkModal(cb) {
    -		Utils.fetchTemplate('assets/html/modal/deletemark.html').then(dom => {
    -			// Update nls for template
    -			Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('deleteMarkTitle'));
    -      Utils.replaceString(dom.querySelector(`#nls-modal-desc`), `{{MODAL_DESC}}`, this.nls.modal('deleteMarkDesc'));
    -      Utils.replaceString(dom.querySelector(`#cancel-close`), `{{MODAL_CANCEL}}`, this.nls.nav('cancel'));
    -      Utils.replaceString(dom.querySelector(`#delete-close`), `{{MODAL_DELETE}}`, this.nls.nav('delete'));
    -			document.getElementById('overlay').appendChild(dom);
    -      document.getElementById('overlay').style.display = 'flex';
    -			// Setup callback for confirm/cancel buttons
    -			document.getElementById('cancel-close').addEventListener('click', e => {
    -				this.closeModal(e);
    -				cb(false);
    -			}, false);
    -			document.getElementById('delete-close').addEventListener('click', e => {
    -				this.closeModal(e);
    -				cb(true);
    -			}, false);			
    -			setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50);		
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name userProfileModal
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The userProfileModal() method will request the user modal, which contains
    -	 * the user preferences, and the user profile information
    -	 * </blockquote>
    -	 **/
    -	userProfileModal() {
    -		Utils.fetchTemplate('assets/html/modal/user.html').then(dom => {
    -			// Update nls for template
    -      Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('userTitle'));
    -      Utils.replaceString(dom.querySelector(`#nls-user-modal-accuracy`), `{{ACCURACY_USER_MODAL}}`, this.nls.modal('userAccuracyPref'));
    -      Utils.replaceString(dom.querySelector(`#nls-user-modal-debug`), `{{DEBUG_USER_MODAL}}`, this.nls.modal('userDebugPref'));
    -
    -			document.getElementById('overlay').appendChild(dom);
    -      document.getElementById('overlay').style.display = 'flex';
    -			// Init modal checkbox state according to local storage preferences
    -			if (Utils.getPreference('map-high-accuracy') === 'true') {
    -        document.getElementById('high-accuracy-toggle').checked = true;
    -      }
    -
    -			if (window.DEBUG === true || (Utils.getPreference('app-debug') === 'true')) {
    -        document.getElementById('debug-toggle').checked = true;
    -      }
    -
    -			document.getElementById('high-accuracy-toggle').addEventListener('change', this.toggleHighAccuracy.bind(this));
    -			document.getElementById('debug-toggle').addEventListener('change', this.toggleDebug.bind(this));
    -
    -			setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50);
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name aboutModal
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The aboutModal() method will request the about modal, which contains
    -	 * information about BeerCrackerz, cookies/tracking policies and links
    -	 * </blockquote>
    -	 **/
    -	aboutModal() {
    -		Utils.fetchTemplate('assets/html/modal/about.html').then(dom => {
    -			// Update nls for template
    -			Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('aboutTitle'));
    -      Utils.replaceString(dom.querySelector(`#nls-modal-desc`), `{{MODAL_DESC}}`, this.nls.modal('aboutDesc'));
    -			
    -			document.getElementById('overlay').appendChild(dom);
    -			document.getElementById('overlay').style.display = 'flex';
    -			setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50);
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name hidShowModal
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The hidShowModal() method will request the hide show modal, which all
    -	 * toggles for map elements ; labels/circles/spots/stores/bars
    -	 * </blockquote>
    -	 **/
    -	hidShowModal() {
    -		Utils.fetchTemplate('assets/html/modal/hideshow.html').then(dom => {
    -			// Update template nls
    -			Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('hideShowTitle'));
    -			Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-labels`), `{{LABELS_HIDESHOW_MODAL}}`, this.nls.modal('hideShowLabels'));
    -			Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-circles`), `{{CIRCLES_HIDESHOW_MODAL}}`, this.nls.modal('hideShowCircles'));
    -			Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-spots`), `{{SPOTS_HIDESHOW_MODAL}}`, this.nls.modal('hideShowSpots'));
    -			Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-stores`), `{{STORES_HIDESHOW_MODAL}}`, this.nls.modal('hideShowStores'));
    -			Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-bars`), `{{BARS_HIDESHOW_MODAL}}`, this.nls.modal('hideShowBars'));
    -			Utils.replaceString(dom.querySelector(`#modal-close-button`), `{{MODAL_CLOSE}}`, this.nls.nav('close'));
    -			document.getElementById('overlay').appendChild(dom);
    -			document.getElementById('overlay').style.display = 'flex';
    -			// Init modal checkbox state according to local storage preferences
    -			if (Utils.getPreference('poi-marker-label') === 'true') {
    -        document.getElementById('label-toggle').checked = true;
    -      }
    -
    -			if (Utils.getPreference('poi-show-circle') === 'true') {
    -        document.getElementById('circle-toggle').checked = true;
    -      }
    -
    -			if (Utils.getPreference('poi-show-spot') === 'true') {
    -        document.getElementById('show-spots').checked = true;
    -      }
    -
    -			if (Utils.getPreference('poi-show-store') === 'true') {
    -        document.getElementById('show-stores').checked = true;
    -      }
    -
    -			if (Utils.getPreference('poi-show-bar') === 'true') {
    -        document.getElementById('show-bars').checked = true;
    -      }
    -
    -			document.getElementById('label-toggle').addEventListener('change', this.toggleLabel.bind(this));
    -			document.getElementById('circle-toggle').addEventListener('change', this.toggleCircle.bind(this));
    -			document.getElementById('show-spots').addEventListener('change', this.toggleMarkers.bind(this, 'spot'));
    -			document.getElementById('show-stores').addEventListener('change', this.toggleMarkers.bind(this, 'store'));
    -			document.getElementById('show-bars').addEventListener('change', this.toggleMarkers.bind(this, 'bar'));
    -
    -			setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50);
    -		});
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name closeModal
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The closeModal() method will close any opened modal if the click event is
    -	 * targeted on the modal overlay or on close buttons 
    -	 * </blockquote>
    -	 * @param {Event} event The click event
    -	 **/
    -	closeModal(event, force) {
    -		if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {
    -      document.getElementById('overlay').style.opacity = 0;
    -      setTimeout(() => {
    -        document.getElementById('overlay').style.display = 'none';
    -        document.getElementById('overlay').innerHTML = '';
    -      }, 300);
    -    }
    -	}
    -
    -
    -  // ======================================================================== //
    -  // -------------------------- Map interaction ----------------------------- //
    -  // ======================================================================== //
    -
    -
    -	/**
    -	 * @method
    -   * @name mapClicked
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map
    -	 * </blockquote>
    -	 * @param {Event} event The click event
    -	 **/
    -	mapClicked(event) {
    -		if (this._newMarker && this._newMarker.popupClosed) {
    -			// Avoid to open new marker right after popup closing
    -			this._newMarker = null;
    -		} else if (this._newMarker === null || !this._newMarker.isBeingDefined) {
    -			// Only create new marker if none is in progress, and that click is max range to add a marker
    -			const distance = Utils.getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);
    -			if (distance < Utils.NEW_MARKER_RANGE) {
    -				this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));
    -			} else {
    -				this._notification.raise(this.nls.notif('newMarkerOutside'));
    -			}
    -		}
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name _markerSaved
    -   * @private
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The _markerSaved() method is the callback used when a marker is created and added
    -	 * to the map. It is the last method of a new marker proccess.
    -	 * </blockquote>
    -	 * @param {Object} options The new marker options
    -	 **/
    -	_markerSaved(options) {
    -		// Save marke in marks and clusters for the map
    -		this._marks[options.type].push(options);
    -		this._clusters[options.type].addLayer(options.marker);
    -		// Notify user that new marker has been saved
    -		this._notification.raise(this.nls.notif(`${options.type}Added`));
    -		// Update marker circles visibility according to user position
    -		this.updateMarkerCirclesVisibility();
    -		// Clear new marker to let user add other stuff
    -		this._newMarker = null;
    -		// Save new marker in local storage, later to be sent to the server
    -		const marks = JSON.parse(Utils.getPreference(`saved-${options.type}`)) || [];
    -		marks.push(this.formatSavedMarker(options));
    -		Utils.setPreference(`saved-${options.type}`, JSON.stringify(marks));
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name updateMarkerCirclesVisibility
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The updateMarkerCirclesVisibility() method will update the circle visibility for
    -	 * all mark types (spots/stores/bars) and for the user marker
    -	 * </blockquote>
    -	 **/
    -	updateMarkerCirclesVisibility() {
    -		const _updateByType = data => {
    -			// Check spots in user's proximity
    -			for (let i = 0; i < data.length; ++i) {
    -				// Only update circles that are in user view
    -				if (this._map.getBounds().contains(data[i].marker.getLatLng())) {
    -					const marker = data[i].marker;
    -					const distance = Utils.getDistanceBetweenCoords([this._user.lat, this._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]);
    -					// Only show if user distance to marker is under circle radius
    -					if (distance < Utils.CIRCLE_RADIUS && !data[i].circle.visible) {
    -						data[i].circle.visible = true;
    -						data[i].circle.setStyle({
    -							opacity: 1,
    -							fillOpacity: 0.1
    -						});
    -					} else if (distance >= Utils.CIRCLE_RADIUS && data[i].circle.visible) {
    -						data[i].circle.visible = false;
    -						data[i].circle.setStyle({
    -							opacity: 0,
    -							fillOpacity: 0
    -						});
    -					}
    -				}
    -			}
    -		};
    -
    -		if (Utils.getPreference('poi-show-circle') === 'true') {
    -      _updateByType(this._marks.spot);
    -      _updateByType(this._marks.store);
    -      _updateByType(this._marks.bar);
    -      _updateByType([this._user]);
    -    }
    -	}
    -
    -
    -  // ======================================================================== //
    -  // -------------------------- Marker edition ------------------------------ //
    -  // ======================================================================== //
    -
    -
    -	/**
    -	 * @method
    -   * @name formatSavedMarker
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since February 2022
    -   * @description
    -	 * <blockquote>
    -	 * This method formats a mark returned from MapHelper so it can be parsed
    -	 * using JSON.parse (in order to store it in local storage/database)
    -	 * </blockquote>
    -	 * @param {Object} mark The mark options from internal this._marks[type]
    -	 **/
    -	formatSavedMarker(mark) {
    -		return {
    -      type: mark.type,
    -      lat: mark.lat,
    -      lng: mark.lng,
    -      name: mark.name,
    -      description: mark.description,
    -      user: mark.username || this.user.username,
    -      userId: mark.userId || this.user.id,
    -      dom: null,
    -      rate: mark.rate,
    -      marker: null,
    -      circle: null,
    -    };
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name editMarker
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since February 2022
    -   * @description
    -	 * <blockquote>
    -	 * This method will open a mark edition modal
    -	 * </blockquote>
    -	 * @param {Object} options The mark options to edit
    -	 **/
    -	editMarker(options) {
    -		this._map.closePopup();
    -		this.editMarkModal(options);
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name deleteMarker
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since February 2022
    -   * @description
    -	 * <blockquote>
    -	 * This method will delete a mark after prompting the user if he trully wants to
    -	 * </blockquote>
    -	 * @param {Object} options The mark options to delete
    -	 **/	
    -	deleteMarker(options) {
    -		this.deleteMarkModal(confirm => {
    -			if (confirm === true) {
    -				// Iterate through marks to find matching one (by coord as marks coordinates are unique)
    -				const marks = this._marks[options.type];
    -				for (let i = 0; i < marks.length; ++i) {
    -					// We found, remove circle, label and marker from map/clusters
    -					if (options.lat === marks[i].lat && options.lng === marks[i].lng) {
    -						this.setMarkerCircles([ marks[i] ], false);
    -						this.setMarkerLabels([marks[i]], false);
    -						this._clusters[options.type].removeLayer(marks[i].marker);
    -						marks.splice(i, 1);
    -						break;
    -					}
    -				}
    -				// Update internal marks array
    -				this._marks[options.type] = marks;
    -				// Format marks to be saved and then update user preference with
    -				const formattedMarks = [];
    -				for (let i = 0; i < this._marks[options.type].length; ++i) {
    -					formattedMarks.push(this.formatSavedMarker(this._marks[options.type][i]));
    -				}
    -				Utils.setPreference(`saved-${options.type}`, JSON.stringify(formattedMarks));
    -				// Notify user through UI that marker has been successfully deleted
    -				this._notification.raise(this.nls.notif(`${options.type}Deleted`));				
    -			}
    -		});
    -	}
    -
    -
    -  // ======================================================================== //
    -  // ---------------------------- Debug methods ----------------------------- //
    -  // ======================================================================== //	
    -
    -
    -	/**
    -	 * @method
    -   * @name addDebugUI
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The addDebugUI() method appends the debug DOM element to the document body
    -	 * </blockquote>
    -	 **/
    -	addDebugUI() {
    -		document.body.appendChild(this._debugElement);
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name removeDebugUI
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The removeDebugUI() method remove the debug DOM element from the document body
    -	 * </blockquote>
    -	 **/
    -	removeDebugUI() {
    -		document.body.removeChild(this._debugElement);
    -	}
    -
    -
    -	/**
    -	 * @method
    -   * @name updateDebugUI
    -   * @public
    -   * @memberof BeerCrackerz
    -   * @author Arthur Beaulieu
    -	 * @since January 2022
    -   * @description
    -	 * <blockquote>
    -	 * The updateDebugUI() method will update informations held in the debug DOM
    -	 * </blockquote>
    -	 **/
    -	updateDebugUI() {
    -		const options = (Utils.getPreference('map-high-accuracy') === 'true') ? Utils.HIGH_ACCURACY : Utils.OPTIMIZED_ACCURACY;
    -		Utils.updateDebugInterface(this._debugElement, this._user, options);
    -	}
    -
    -
    -  // ======================================================================== //
    -  // ---------------------------- Class accessors --------------------------- //
    -  // ======================================================================== //	
    -
    -
    -	/**
    -	 * @public
    -	 * @property {Object} map
    -	 * Leaflet.js map getter
    -	 **/
    -	get map() {
    -		return this._map;
    -	}
    -
    -
    -	/**
    -	 * @public
    -	 * @property {Object} marks
    -	 * Leaflet.js marks that holds spot/store/bar marks as subkeys
    -	 **/	
    -	get marks() {
    -		return this._marks;
    -	}
    -
    -
    -	/**
    -	 * @public
    -	 * @property {Object} user
    -	 * The session user object
    -	 **/
    -	get user() {
    -		return this._user;
    -	}
    -
    -
    -	/**
    -	 * @public
    -	 * @property {Object} nls
    -	 * The LangManager getter
    -	 **/
    -	get nls() {
    -		return this._lang;
    -	}	
    -
    -
    -}
    -
    -
    -export default BeerCrackerz;
    -
    -
    -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.10 on Fri Feb 11 2022 16:38:03 GMT+0100 (GMT+01:00) -
    - - - - - diff --git a/front/doc/beercrackerz/0.0.1/Utils.js.html b/front/doc/beercrackerz/0.0.1/Utils.js.html deleted file mode 100644 index 1504a54..0000000 --- a/front/doc/beercrackerz/0.0.1/Utils.js.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - JSDoc: Source: Utils.js - - - - - - - - - - -
    - -

    Source: Utils.js

    - - - - - - -
    -
    -
    class Utils {
    -
    -
    -  constructor() { /* Not meant to be instantiated, all methods should be static */ }
    -
    -
    -  static fetchTemplate(url) {
    -    return new Promise((resolve, reject) => {
    -			fetch(url).then(data => {
    -        data.text().then(html => {
    -          resolve(document.createRange().createContextualFragment(html));
    -        }).catch(reject);
    -			}).catch(reject);
    -		});
    -  }
    -
    -
    -  static fetchFile(url) {
    -    return new Promise((resolve, reject) => {
    -			fetch(url).then(data => {
    -        data.text().then(string => {
    -          resolve(string);
    -        }).catch(reject);
    -			}).catch(reject);
    -		});    
    -  }
    -
    -
    -  static stripDom(html){
    -    let doc = new DOMParser().parseFromString(html, 'text/html');
    -    return doc.body.textContent || '';
    -  }
    -
    -
    -  static replaceString(element, string, value) {
    -    element.innerHTML = element.innerHTML.replace(string, value);
    -  }
    -
    -
    -  static getDistanceBetweenCoords(from, to) {
    -    // return distance in meters
    -    var lon1 = (from[1] * Math.PI) / 180,
    -      lat1 = (from[0] * Math.PI) / 180,
    -      lon2 = (to[1] * Math.PI) / 180,
    -      lat2 = (to[0] * Math.PI) / 180;
    -
    -    var deltaLat = lat2 - lat1;
    -    var deltaLon = lon2 - lon1;
    -
    -    var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);
    -    var c = 2 * Math.asin(Math.sqrt(a));
    -    var EARTH_RADIUS = 6371;
    -    return c * EARTH_RADIUS * 1000;
    -  }
    -
    -
    -  /** @method
    -   * @name precisionRound
    -   * @public
    -   * @memberof Utils
    -   * @author Arthur Beaulieu
    -   * @since September 2018
    -   * @description Do a Math.round with a given precision (ie amount of integers after the coma)
    -   * @param {nunmber} value - The value to precisely round
    -   * @param {number} precision - The number of integers after the coma
    -   * @return {number} - The rounded value */
    -  static precisionRound(value, precision) {
    -    const multiplier = Math.pow(10, precision || 0);
    -    return Math.round(value * multiplier) / multiplier;
    -  }
    -
    -
    -  static initDebugInterface() {
    -    const lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);
    -    const debugContainer = document.createElement('DIV');
    -    const userLat = document.createElement('P');
    -    const userLng = document.createElement('P');
    -    const updatesAmount = document.createElement('P');
    -    const userAccuracy = document.createElement('P');
    -    const highAccuracy = document.createElement('P');
    -    const maxAge = document.createElement('P');
    -    const posTimeout = document.createElement('P');
    -    const zoomLevel = document.createElement('P');
    -    debugContainer.classList.add('debug-container');
    -    userLat.classList.add('debug-user-lat');
    -    userLng.classList.add('debug-user-lng');
    -    updatesAmount.classList.add('debug-updates-amount');
    -    userAccuracy.classList.add('debug-user-accuracy');
    -    highAccuracy.classList.add('debug-high-accuracy');
    -    maxAge.classList.add('debug-pos-max-age');
    -    posTimeout.classList.add('debug-pos-timeout');
    -    zoomLevel.classList.add('debug-zoom-level');
    -    userLat.innerHTML = `<b>${lang('lat')}</b> : -`;
    -    userLng.innerHTML = `<b>${lang('lng')}</b> : -`;
    -    updatesAmount.innerHTML = `<b>${lang('updates')}</b> : 0`;
    -    userAccuracy.innerHTML = `<b>${lang('accuracy')}</b> : -`;
    -    highAccuracy.innerHTML = `<b>${lang('highAccuracy')}</b> : -`;
    -    maxAge.innerHTML = `<b>${lang('posAge')}</b> : -`;
    -    posTimeout.innerHTML = `<b>${lang('posTimeout')}</b> : -`;
    -    zoomLevel.innerHTML = `<b>${lang('zoom')}</b> : -`;
    -    debugContainer.appendChild(userLat);
    -    debugContainer.appendChild(userLng);
    -    debugContainer.appendChild(updatesAmount);
    -    debugContainer.appendChild(userAccuracy);
    -    debugContainer.appendChild(highAccuracy);
    -    debugContainer.appendChild(maxAge);
    -    debugContainer.appendChild(posTimeout);
    -    debugContainer.appendChild(zoomLevel);
    -    return debugContainer;
    -  }
    -
    -
    -  static updateDebugInterface(element, user, options) {
    -    if (window.DEBUG === true) {
    -      const lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);
    -      const updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;
    -      element.querySelector('.debug-user-lat').innerHTML = `
    -        <b>${lang('lat')}</b> : ${user.lat}
    -      `;
    -      element.querySelector('.debug-user-lng').innerHTML = `
    -        <b>${lang('lng')}</b> : ${user.lng}
    -      `;
    -      element.querySelector('.debug-updates-amount').innerHTML = `
    -        <b>${lang('updates')}</b> : ${updates}
    -      `;
    -      element.querySelector('.debug-user-accuracy').innerHTML = `
    -        <b>${lang('accuracy')}</b> : ${Utils.precisionRound(user.accuracy, 2)}m
    -      `;
    -      element.querySelector('.debug-high-accuracy').innerHTML = `
    -        <b>${lang('highAccuracy')}</b> : ${options.enableHighAccuracy === true ? lang('enabled') : lang('disabled')}
    -      `;
    -      element.querySelector('.debug-pos-max-age').innerHTML = `
    -        <b>${lang('posAge')}</b> : ${options.maximumAge / 1000}s
    -      `;
    -      element.querySelector('.debug-pos-timeout').innerHTML = `
    -        <b>${lang('posTimeout')}</b> : ${options.timeout / 1000}s
    -      `;
    -      element.querySelector('.debug-zoom-level').innerHTML = `
    -        <b>${lang('zoom')}</b> : ${window.BeerCrackerz.map.getZoom()}
    -      `;
    -    }
    -  }
    -
    -
    -  static getPreference(pref) {
    -    return localStorage.getItem(pref) || null;
    -  }
    -
    -
    -  static setPreference(pref, value) {
    -    localStorage.setItem(pref, value);
    -  }
    -
    -
    -  static get USER_COLOR() {
    -    return '#63fff5';
    -  }
    -
    -
    -  static get SPOT_COLOR() {
    -    return '#26ad23';
    -  }
    -
    -
    -  static get STORE_COLOR() {
    -    return '#247dc9';
    -  }
    -
    -
    -  static get BAR_COLOR() {
    -    return '#ca2a3d';
    -  }
    -
    -
    -  static get CIRCLE_RADIUS() {
    -    return 100;
    -  }
    -
    -
    -  static get NEW_MARKER_RANGE() {
    -    return 200;
    -  }
    -
    -
    -  static get MAP_BOUNDS() {
    -    return window.L.latLngBounds(
    -      window.L.latLng(-89.98155760646617, -180),
    -      window.L.latLng(89.99346179538875, 180)
    -    );
    -  }
    -
    -
    -  static get HIGH_ACCURACY() {
    -    return {
    -      enableHighAccuracy: true, // More consuption, better position
    -      maximumAge: 1000, // A position will last 1s maximum
    -      timeout: 900, // A position is updated in 0.9s maximum
    -    };
    -  }
    -
    -
    -  static get OPTIMIZED_ACCURACY() {
    -    return {
    -      enableHighAccuracy: false, // Less consuption
    -      maximumAge: 30000, // A position will last 30s maximum
    -      timeout: 29000 // A position is updated in 29s maximum
    -    };
    -  }
    -
    -}
    -
    -
    -export default Utils;
    -
    -
    -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.7 on Fri Jan 14 2022 10:17:56 GMT+0100 (GMT+01:00) -
    - - - - - diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d916338a5890a033952e2e07ba7380f5a7d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19544 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 diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4..0000000 --- a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787b0ed50db71ebd4f8a7f85d106721ff258..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22432 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 ig3W - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0628b6a0026041f5b8bba466a0471fd2e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23048 zcmZsC18^o?(C!;28{4*R+s4MWZQHh;Y;4=c#x^##ar4z*x9Z-izo(w+)6aCD(=$_Z zX6j6jo4lA900{6SnvekG|8#os|JeVv|9=q^Q;`J#fXaVZod00t3i={0A}aR74gJ`7 zKOg|Y0f34t$SePFhX4R*5dZ*{OY4X(B(AI~1OR}C|M&#_pgi9&JXc8RP9o zCqzMe3Yr->{lvnt{P_Im`yUX@tUXMBI355%Xb=E!j7Ku=7Be?7Fa`h=e|7`@^JN2q zNM$nrA%D34Y{DOqz)gX6ncFzK|8VL*d58l5AYC78bV=5BMn8Va`9JwB|6sTJe)7h~ z!2M@j)gNB~!G8cD1g^0)urc}J(tmu`e{wXneoxZ2w{vm^0Dk`f==G;RK#AwolD(tJ zPprld0P+9fUWDkv&BX90XU!iI0RA7$qZDg@G|+#<6mQ||e|p?V^1t&9m|nvC<-TsD zZ>+Ds3t|Wbj-YR-4?5r`Fa>K0Vs)C0=rl@wBnb6$3m7g`Wx>q@OwcRc|qNB1RiTqRPjk40m`>okPgoi z7dS*Y4q2`g!l>hOy06fc+9v6Eoc^Bant68A?-*ANQPSjW&McCZwRfceo&USTE3TsF zV!K(Z*^BSfvX+f9H15vBW5@3vXRW)^s}|{t5QwH~yqMk*{YrFU zo<>IWq;M^9Y2JAp2qWSXsT02we>!!h_J!7wsndeI5Sm`s_viR)r`-V&s`T zaj5gTFFZ8_Oq$<%2v&_t&yiq=QvIEAXe6SdA zWvRE^^lP+cKI-}%@;a~<;qcC7G;VZG^acTJ_Yfy!7y(Gw9^?bE9bkufhzI(F06NGX zkM716l5T($BNVX>xX2!LL?5Rn;e>0`Kg&L=U2+TRD|Ek8iX0sHwP&%i&9L8uvvQ!+#oM76!r_a=e)O7m(xw&MRA z3C&UC|JhItHxRrsT^etqCp0vGQV7>U=W*t}$JGv>uMT!NT2}bGWJBnUA27}AGDFZ8NTF9aqncC&d0JZP%Y@>QrB?5Q z_K@$PWQY2GpsQpGl+dZ1{Y|3!K5$bNAoV&((NGvxC@K&WjtRwrWyPA_Wrvt9s9X}< z5i)y^JU8iyz?tr{3Q#i-q7_;HMVY&S$&JB{*@{R#-ImjgKOjB_#yxi5MsL{u1>x=& z`eC+*V{CvhGYGZ~+b`M%I>-S0TOXxn03&*k)v^PQeV1%gb8~N_t8tMHEM!Y7f(cEP zCej@jSCzZMRpqjLU9p*870u2S!7iv(W04^&6b=>_i;Kni)NFpXFi(^}$`|ev=Z*8B z@$_WwhY;ou^X0ROt>SDr9?K;DuhHaael#~xkRnVSrUqAyqp8uFFZN-VzM$+%KCc-ZuK_eIE<7>q+f4dbi+fD&ZB( zj+r@^&>CjvoYyd9!_)P-<^n6>mCzbk9qbM^XPf_pK-nsRE*qrDiBuJR@7UCJpEleC zj@9bBE#c}>$xSnj?1e|4G44-lHrE1QV1V{54a>kY^-TXazYv#A<(J46i1%&N`Z-fW z=o-2Drm_T0+G2kC+-QFEZqkUBT6(ZH zJ7sg>s6ruvN~2TA?o`&bQVsh7<#~l{o5f+HJ72B4DD9E1MJ%hndA-oJyHKu5317d~ zva_x6kx{Kk*Qavj5m&9uh^xjE^KpQSy9mSZ+NcPl&2sj)9bhJjFCq@8KG>oTy zCYX66LJ&$2@SqmBDY!hiUnsl&de|N-2y*=MFNrsRDif1CFrW|-3-xC%{VxYo2gCKj zzKOm8uBfH-fB;22A!a>e2_r*&ef|AoeIrv714BcPzP^X;06{`5igKVKn9$h%8JI|z zu3nARzh5Pc4E7I9tP~6kGZ5qTL-n>GO21&H0R9VbSpU<%zP_oyJ|?&rIKm6aA!Fbx z4Gg@06I2jzJSnj8Ez=_7hZ&18jA@lV*NAh}zgXb3!0^E2!0f=pz|6p&z?8r!p)R3_ z0W8rH2$)`tuWyK~QRu~9KshyJO_ZRZfS`~dc*P`=C_1qM`oVYYH~u&OgWvx5z<19# z##hhh`*Hs`gg73KxBYJaHbf_$wP)R3e;|Ynd?cRw4u9!Q;v?ze5ebMG8+eK2H}Fug z5wcR#W3*JYWwsXAC%9O-8M+$VE4*CYZN47gFQ5Rye!>ESJ;VgXdB%E&Tc`*ao6DT7 zB(o{4F7xq*lF8pSy3MASZ!Xwuw%Z*h8?l#OuGd?m3dxC?9=(PJf=^KmG@-E?FvBn~ z|Bm!mjusiJR+rMVAq-EJ`6MhYb9`UM9_IBsVXYqM`A2SQ?o_Ir3bC0)c zzMzobOXZBxnar*(gh%C2m>6(sfh|D+hfpbd|6O|lu;@1!J;8JrY!HwvNNF69L4L&8 z?Oxa_v+rJ@yQuHpfE!G0bub{NWOyC-^&C|Tw*@hjlrECkq&ZS(Fc(Z_hy3}mU|I|Y z3#wsPLLD5)YEYeG8s{T!{CADsW6GwJ2V(x}=h(F1)Z7I&a`Ee#tjbpHZpRY|vw2$f}2 zv&^KAg4qK_ZNJIa3DzaLStOCve68I~}-g8XzRAkS}a_qwDwT-xMnZsKiQ% zzgHxPe7D4z{#1c6nV?Wpxxf!yUX^XMg#Rm8xOGviWKmw4b`hJm zj*At?74aBjlOsPWooNZ9Uy)I)b{(E>0m)#rrzB;b_dx=3PM653giv3q|5a?eh>vQP z7Y9O;xJIGs@#|92j-b)hjGnG^>(W^CIPT$I;CO1rw(H*h^a1OJUj4g^GQ0g$QG04y zR03aWOMWP#co8NFlkdzuyb}g-Vp>qUO#wWQXsUqv?@Sddi!Qd2UEAz$DcN($IWhd< zXXR5jB8@!`Xsl}SeQUhV8ml9|AkB)c?$rcN+zJ#2zq~xR91U`q`=<2Tx4Wrly8Ksm z0iFYhyHZN+^;Q|hLZ1y3lXWm<6?60gs>?*mQu8!fMp>_A6xMY&8Af5R8HwrdwDwuz zXU?tzLiWqfG1+%K$AzA_%_e*T_G%&9b#TW8T>)Fon9U|?F_#NS7TCWtWmJLr7RHZ* zZPit*z#6Q7A4(#|JHrXjE0J+smY1pgP`;NU=yAqMB66=9w6&4lEVf#1_Wrr*ZD}%} zg;tNS$0mo}GWfM?gfG`u0)SIkK_I0sugMWquUza;;`=*b z?sHDcE-CrsGP3y4&%SrWB_UsX@oaHS(yr)eiln*(ZKm^nXhq7nd=_<;q?{dwyBry7 zHHR`54@4E7Q%icpwzwXkld7t1NBy;Y^+vigUa=Q8pIqjJaSf)F^#~7JQK6KAZ%!_{ zKnQC^F~PH+2!hrO9cqJffw#08`d8qIfelR)>sVWZn<`^P{kY9w@xI-t)c;bCju9#Re_#nObA9moX}WoqcxA-!1}z;W9`uP zc{qW%j*xt$VY|$Zwm{x;aQ*0q2ry%WtE4AzeISmIc!|Pw;&A=Mj%+|ZBw@SMj*y0q zkVuZUAUtGYyHK2! zp2ml7!EedX(x2NzN`7_Wi}*2{=?Z@P14@1^;fs1SM2{J_C9Wh#Dg92{^Zj{O2G!<2 z4@w{a(Dye0-hI8q2g+M{c==^&lU8fN+NPt`BC)ijX|B|ULK?e6fRdZG1X~@Y01c>~ zhUiBEi5iHn%1?zK2n`+jQ9)5rJ^1kM2(Q|@%1(ukUh~^O^D?}WN}*4mzh4xw61mNe zvpL_hnFT>p2t`VvkP*X3l0Rw0KEbaOUV`zR@=!zM!LRoqyF_LkA8Z18y2X)@Hz2P2 zAAD-p3|zUVVwn<&I&ak4HPYSp{xE&{fD$NLk770`nS-kclU+>*Q8VOSp1y>5; zpbw|CXPYA1O%KUcf}EhbI~5gK7c#TL)_y#Lv~kt>9xpaPHJ*#f^qI98q3izXbyayS zwh~uby|(9WOT(~+;{2opRo(?2bpqh0-0}!@4M`UQ;O$N4lOs6OfqcWg&inU_Pf`a{ zgtT_e3=8>Dbisv$`1+#6$Ia7w7xRfTC6qzQ31d|3P@s@F0-*+6Jgb(lq&#FKK!G|) z$w|rj(qGzEF}P{AEa5&Q#)lGx3zfP4#m(*o;a8^J|HYTQdCTr9z(KC`Hryt^-?8Rp ze69i$hqY?eA00@#ho9wUye5|x@UHwIU_b7JKQxun?0O8kj@_fZV|_STb=v{rZoOHc+!qCfjV;Zkb_qA=-_6S zKAQpGcT^$5h1sRecx*c>mk+PqMA~`HO}P2a;d;@;Q9w&EnRiSgRKg@^v=neAAyAEL zHrzabSS;$g3IabN4k30G3x@MfPz@9%Ld^!uB{EPf2qEF5>KS04U5z4%q*v0OT^18D-B&>}xj)vtyT4!)G9l!j6#^TK$yv>mia47tLAiRPM2xD% zU~ryzJ=g8NooRN`)$FoF=JdI(&hzjqC?ncPQ=GqUwR)!SFw>c=WUpQy(u?P2V>P(V zE!E&YoL%8}xYo1Z=Y`+#01_$e{_F@+E}P-wX|`BLzWWmczj;sNYU>Snsj51FFlfBt zn_CNcD?;mCswU3fl?sn*fZ{Ph$)#2dzXrGxsuJuA0L2QcVo)FnMilgj2y`FT%tni! z5x4z%5Jmyly)Pa$F3$8{VX6}sZ0r;NF2EWfQID#d1yU(n41YR);}~(AQ9=BoHXh%g z{(5_?pT*-~IMWOJzANq86WBrYvEMfNZGFY zs1H4Eht{uE_sedtLE~-@{f6Uuic#1KJfS@(69V0nJZ{XkxFhNeXWx{Id<1{E3A0~j zi$U^mD!b4$JyNj=+VFtt=u;akdVx5KUkQ;RSYJIkC7rpN48a4JEvrgS=@onI&+6^Q zho9|0eOn}oQTNAeU*jG1o!4EOIz%0p>G-=Obl+b_b$~V5QhD2yn1KQE9?qEceiz!` zJFhTrpl_z@cUkT3F6Nue550W?>UwnY$=<;_o#J3U%8mrYh*?b0Y&dE+Y1_);(OjAf z6H+#Y75GDXv?h5*zy>(Jjz6??sPb z%`S2C_ya~8noV}eC85{gypkb*!JUSPLAb&1-OWrlzTqf|@i87Akkf1XJLvb`7;2Ya zVMi;pFQoixdJ55~T+Pq0gw>$vc)|s|ddKTwR3;OV0dkZr>p`4OHsr_1+hGb~qzG0E z6JzmTu;N*HBTE*GM?z(*f1yOj3Yj2+XAL7@Bc98lo{kVhjD?Ty-<3lCAu>=>1W=L0 z)FymW`MIBdk~>ULyH{&7U(Jy1)ZMzt;SGFJJwtiloYQlF_U zE?`ct>qnSj`U+bqs~ z|1p!Xb*J;8G^tYWGhNT|dk6WoO&qQIW#gk>J?~tH%WdUfmT8)roR{6l+zBOoLabeY z>%l6Yx+1@yo`?=kfL*G{fb#iNk!OBR038c(+P_E7%55x@7XN4q{Svtu1DBV&pnERw ze8!wY&|@pJdhZI3x-xzWo1K6h#~Fb^K+$P775>QQp;6loe>=o_?W@o3PR=m&VJFI3 zEW|qNAQqCspB;RBSq_vEh=G6p_Sz8=uy}$vk4P`K0$j)2V4`5eXP9d=VnJdeP#l85 z?<2+F=Hgpna+v{c$GgAAvVHvYsPlY`z7hy$FV>!9&a3`8WyU4yc{g;o1a3U_L(6Nc zXIu^;{@&_#pFkPKaMbJ}$crrg(xR<$z#NmIkrF2TGK6B23&Ko7lsgPxg~_7+mA#6v zsigG>6g;ao5LG-tFwTi&v}Cxf9T%-k+Gw)rc-SC~9i0bj!cSLpF{2xG5tVsC+3Ubz z^Z7K9x_gOv=i^VX9q&t@vfKB=?hgM5y-ss+llM(kqQlEer#okCFZq}E#VG%kyVJAY z;p|mv$)_899>+(h1?+TmkCA@d4&W_Pr`wqB)L04CjP3qdhCcK&`3B=obaw`5b3WQX zVkhX8ogNEefr2l;-#I@3ms1gK;`zjMNSy>vq*|m;#lfEqylK#N^m1S<G3?Aw%$&3zL*kWi-?brROGT&FMbs;JioU-C7UJyB{c;t>*teO^7=z5UzcS zp~2=c8neIhdga#m`2A}&i8{~guD{5JyUu6HL&<0MMbd>hRabEfDbmC7MQv`&wI%E9 z?}d&bUK%y3N;d0MpuItD+)RcNo3EOWsH)anm3=3cSu9;`yQ_%6j)gvCbBr||qJ}~j ze<R2=eQnzxh7*Pp_9EwiMQLJOh;M~#tw@s4Dt>zE(4$|$i+7b)~a1;%8I!@ z{LN7Eu)jSP_@o10^_5_BnoH)99~2f=08KKPEa1%~AhaMkv^;u=sCn1Y3{0E=j&GOK zX0RkoDE_1sjs{0lTb-?rX8OprtX-K_4kWlC^6H)gHK&hcY{q4TC?DR#o(tg=LJx)K zAJHPZLven5vWAbvzE-PubE#{M9f0#gZ*1OKh)DvsdMWQ0?-}W&@2v8daUh)ww$t8M$X4Bj<7G z=n;NC5PM}b_zq$E8(c=yJMS`hd8Z^welnP?*WV)+$R{BN^2t}X2`mGxMRy}&u8)V? zTo9`8fh;&}>S(AP%{yTTJd6`TENrTL%ku&gT`hwiw1M|w!+k%C`z)tL;YW}Mojv;c z&PJ=*6p>`Ny<28MT_QtD- zasNV79|0HKtUMS#%1qUbHnQ){Iu(*P{XrdvdM;koh117$)f-Zv4}LnPMS3k=%Vk5n zwQ9ZV>v8aU?2a9Oe}q1*i_=VS((-G}^|ksWZEa+JKM@fnA@QJaR3OqyB|!51w|-9HFGAl{3p zzK~6lbs>Ty3nstVI|YtM_me=3;lVnX=GxsF^{YkKn#o2*DK@YSUW2;+h~@)_$w z#8=Q-Cofe38R8AhB0CJ6d$S92nz+U|_qTlCGqeuHXG`x$YJA{a(|F8`_;B=ov7I&ZYbk=|c;`t0=1pFG$|K za&BUxEP|uv7ysIIM)BNw`(?UDm8N~!=UEH7IKvWx9P@-ZbzKOQQVL3o?% z7o;eYt;BX%Ism(ZY#ModCy)<8SVyHoFVIbWUfwf!!!F)ovjm4ClP*RvCs$;^SFTln zvS$y~mDs<&-ZA6TW|Zi6J_>r%_mJJdV6xKy3XJj(eLk)QGJvy+x+u%}h@4)>gXQoQ z1%&3rLHk}&)FH-{0_I%n8$iIGg&Tlis3&gCf@lJWNR%4Er7Jg8|cUkWE#{QR4-_nKH|J_ z?xS~6K2jIltSd|HY3yHD!)U%j6QkT92#h*BOut4GiWXaxFxP%DAqDKyhk~SOUAltA~h@O`$T*nTXn(z%?#p z0A~U!v2^PQ!;%sS*fUSTH$P7Ur1sPDQoj|8Zf1g=dY$&qJiOdKwZ0eunqM4QR*b8p zk)2Sa^Ezgn8Az$@g~?ZPy+2VGsDINM4`tjQtl>Tz32u8OPj>iz1w#dh1{4Wxc>TOUrO?*}98%mR z^xx5mn?D?0BZG9XsDUC=%#pZDrW0L8vt|3_EGCS$=tl!lkB{JGB9>7CNIgLv*OC}o z#lJZ0J&&;C^xT}huT(2*JO53UCV81{`Dv+2OP&{E-&`5>E*ecXBU3Yn!IgKNO`oUY zW_T?>f~yc8CwMKV;lDVTc|8n! z=}sSG3aJM_)W`0tQ}mHZYMD@ksZgsc5M*p|rPe+8Vfvn*&NKvtOCv?Fyr;FLm<=!uciogELSZrm%?FfNUpXNE^- zNN3b>>DhQ`=Co{z*a!Na0j}&UT0eqC84SX&4Ek3g5nSnZqC(=DW%JsU+MHFoL)73e z?E^4B{H9FU0Us0CTpoNkwodJBdj6!4B+(cOu@&+C_En4$RAws&(iwP~L^l!S+|IhM zZ2`Ed)5$KU*RN}2PP_NiM|S%6U}*rD`^C(dDLDSXl=lxK{<3m*7@VSPDx zAQ?EWnk9be`0RD!$vAh!H_g*dl-d4zpBV|~4VVQvJs2GVV>}d#JCr^;GiIQKg2-Y+ zO7Oy}A)^x-=@w+rD;zj(lGd1 zHM61_qgG%9S89sAz19Zv0*B3Rl=szm^pjKZ8}5~O^tMf_qI=olr#9Sy9@ZbnMFn}7 zc0Q7^zT}HUWUpJ@wV<@!Bn|Sz1@gns{g61i3nk+R7K&(gx;*8Q8qlwOr`OgbOR*x+NcSvi=3kf3{M-HV5QEUY-AlL#7bC0#nRDbx!7w_1sl7DU)=@UWWd=P^gzzjmT1^w0nIs7xG!xVhWnTFDgSwu02 z;N5US5YR2BM9d)yLL*m?9-L*fl%9cvq|msx$FP3wCwXqNItTM8zHU#^3BBD-AE}H* zQIlwK6wSDPp9s0PYL9Kr=&iM0A88x2RoHy5x%kIR%T%t*viGS(r!0p8tzq^dyhuZ) zo~Go8Ft!kOFj}=ad&;ti5Jni+vrt~SN#@7-qxbriDS~J7Dg1O?zlw%lC?L`)m=gIuG*}f+t_3S=fkJ?I?zH@uC?%*!y-Qb?mh8;EMf?aX(5Ec(ve8!3jb&;dS+`U|%|yMWMwmY4^!5hfk7>zg2U3iu7V z5AqBxrY(VHjI7aPiaHx{)7c=#x);KI_Nv4=?JoIOWYp7Z2@73NW)e62 zKSOs;C^VQX4;6O#H~6IRlw65^l}3fGaM79&cqMZxozHQC!dcXb4GvgGykc;) ziTBBL4N``*gm)=;`N=H%$WQiuTy~B+Z04H5k9!@ubsLK<6nEBc58HUPxmYftULyB= z>{8^uY!Ztt~E@3*HqNkT3%(Yk0acX-^?ICTIk@MtMRTL0jeLH5{>!z zo0leHM)!UrXEuGthl8Tq^Cn+4&Ngu;mH+eRUG<#$ycC|cYGtA5Ex$N-(W`W+Xe{YS{2AoZA*RK{9*x%LxUj| zJ;t7-HlsW7N|_Zl+nFwUh2_tSCtO?E@F zrO|wp<-QLtW0=_(Y-v>Cfo!kFjH8i3rK-h}Vbb3+Sd0}d4pEX{r{dY9GFd9WS?o7e z(JwzxL=JaMuz_44eN|boc4y(EE`)KQ`&4yN1G}(nm@x$z?UYIJJfW*4kmLxW}-0fuq?70&{BH%2f5T;75!P~6r?4+%8kV+n9?f&&kI8L zJgY!*8JTeTO8qv&%?*g;6P?dn3V#q>i^!+~PRhnI``A9zLq5{Yp;b(ym1Zm`Wv|0H zIZIjq*g=Q^j(pH?OQ2woJVku;cn}$q!nBc8a?8M~`U(1!jMejV2)N>xnIcvu1ixaQ zx%Z%8YYP~;%nOu`7z>H_$0<-sg$Ze?X$X7HP^=TYua=)I4JLsO&I^Cl6g8{SKRmPc|2c(cD2P_!cm`Dy|{-z z^d00=qpl1InE@ZwfTS0ahKE&&j_n?mNr|Jy%Q=!e^4Zpo4XJ$2rzL44~~m zH_$)lL8F6k){%h}a;?wIK^(4F%g%>AovQ0t(1s&}m{Ayy+Yp;=2+YiLs>N-$KRixg zPu};nI=p{}^X^5%&f|Y!_1LS%_EW#x-&daGOVsnc(u0USn1Aah;>_`~1C zWE_tAO*XZ@J_ysmYiwRro}9@!jBrnck5$wmSb-XQ!I&QFi>?0=o-K*b$7uX`0>i@+`naTD%f&K7w6037<<-<9QDEj;`ME#HzREV;^pb z5Lgpr2A+w}-sR0dcqClOX$@#Hm*dgU-TB zw6o9HDy{dOmhabp!<0q7?dJ;{8Tb7-`eY!Ra(%o=)4v&30;B?Wv-~Zi%f9y(zZXM9 zL{!yO6di@)(FJIqiHIVpVEGhI*bRy~I`fr?9Z0yPTbwNR?sPcEbP|uUo`1VV5s_fO zsC9q*vDi^=5KPdHzS!;MgRzn;;l$tuUqS71b_Lzc2*?|)E)0q2fU)`qpz4I*Rb z0b@Sw&71Kq{|LA|DE%#`vFQBv>DHp>vJyC8@U=eNc)R&|O~UC{i_b;SNKjaQer=ZWC7yHO7VvmsHFX(?QK zmek=hW{5o(x|9!F6l~8M&b=T6ht^DKHB2<4^hhvMsMU34SGh8JqYPXvgS=ma-irTu zcKc4gBd`LF7Oe+uwV+4DkFu75|CiWj_5*?M!s!4;8_QkB*M#-SSd!y>+rW5W_>w_y zBa#~POS*5nxgRHO99GnI5_YXhaarFsyofnKm5#{2Y>n(se_+t$y+gC8a8KH^mjlhL zbeDO>Ue7Qp7o&m51LXy5cFKkb?n;}P>@IcP<}rD0gNg58QhJ}8+YbBHp!UbY@TG{; zPLvegu5bRJQ8e867ijeuA=Y}Dz8DZ|zg@lhRPrRJI8VMjG7enV3p7vD<8SYh?8nNF zzeqQMElGq!gxCE>z~UhJWJfuGPSl4Tu9j~Cd9oV`BEj$!K=8VE%2Z$XQe=y3XyQ*wmGKaRLph%}V{R-jNOWPfAGiP(Ub&CjSAI`jmEYsvK#u&^5bV6WnoNm(IwX(U z$CL2V%9Jk4QN}spFauZ}N6Cb=3DQ?{x`>ZC-x0~kBQ<)?EKGOw>kaAcm#<3!)S&0i zuDmR=CPMgXraH}J9>~%o@N%FzBzFTP1yzhTCUHll!ZjPVsHXjae?>T2!4L*e-Wqbe z@-agyqV7c)@aPADZm}j?ZDgJj>(aAoCyQ}$G~;ishN{KVRJiHiLknW^By>IJGD|Ai zZTBUhnr0AQkON`}$!o#)6ARpU)5* z6vT2E=19pho$_bUc{$`15g(*fP_Z4zX2N_*NSj`Nbu6B}2n?!$*rME*6FpDPn#$J1 z&_r}w%_Jq*It+!w6kI+7nb4=3h6D@O)|$sawMWL zVTP8tv_jc|kjzy>sjg)I=<}6|^_~2+jU6`C<~G;#$E9d&khI6njI?bZITYs0HI&i}WM}>hg!CLjLJkIPUnEigK41yjH%zvgDU@?#hL_@+$jRJfs`-()Vl4T| zS4iVvN^y{ErlObu4-}A(LZVkVMON@8N=G3a??~tWdct+nPjoq5}$hg!pS45LCtF) zv(pMojCI4~V1~w>gLEGGn5LeW<4ph8e63k`ZjytXd+%{)Lw(Y$w~~*3@uqLj_vm!q z$4Pb36u+$~)AgZSL*|!|A5fcIewiTc$nbi#DY7hI@~MF6n-LADax5?n8JPSXQ9ILb z&m9&u-J|=Li$#c=H4Dxx<1};9cJaHHzuqkhM+GmI{SC0v*qSvK>Kz^$zF&!t(zR_J z&7R{OC1B!aG1&ZOSF4OpW8w?7>Kz6aJ$7sBCN7O;Y;+o}L+3hOw&RD#^G>F5nC$Od zs|q)5ptxg{Q38mQunToi3o$im+grR*=#isn(`c-=X@2@)b*r%z14F5uM$hDbgCCj{vJ&>Gc`%xw{}B4 z)zf9Kw9Im++;*JiwyCSRcgf?iPh1!0^_6w-7jMa02)2W-wXk6S(8VG3+pM7jvhLvb z41CciCIYAEdo_!aKLCT-vORl7p(l`bZYzVk&x$Nom(g@Us;kFyYObOF;PkKweCa~LLG*mauLL%P$?};u>>-OqG8_dgB2}y=SW!wZ6j8KN zF-64b$xG;1d!g(KQNq7-Ote@^*n*efBEvL+hqQ_``Ob)W(*s^kI;kH#`-LIen?_EV zCoE=k_)Xrg{qo;RY4#YHg48@+4{hP=WHp~(V1%f#q9e_fD3lr{o1Dml9^ag!W(IOiQ|2wR z#l&CU!+5I>6FoE`*>Ohz8D5x55Cz$&ANT5=r2U!sc)D}WJ(yV*51E;zc#p2UUHXg= zx!ebDBQ^`R7&M+Oylt|=BS*$Df)e(dFmfhFz^wI9l&2for{FzkH8g-ELdmKP&H^-Lmk5e~1Ir`yjaA@$OFcI}G&6CE#je3kV{2939#MSegRv>2Vb* zlb@U&H1Ie-4>|#FwFjy~JUpRC_%GaV`k@OI0jxgp(ot% z!9=pYP#g;Ef|Ik&VrHMZEX(Any{=viW52OgYlLD;9K|Zbih>}$70bKV+22enhc#>S ze*WTeBc?oT2zHCdMtz0g?DH=J^%6@Csmn!FbLOS2GAUl@cJ9ET`|Vk0B0`G+hgm0s zv&<-D1D?j(?XtoD6s?`qX}nfWeIJ=xy8K&yda@#eZ||ziwmXfV-@+H^TD|k*>u`02 zIuyp)3m;D*Jy*A(-2o1Dy!Iuji_)EKiu&ZcUya$5&AI?bW!FhWaP?qFFGeS7)YMPg zDVqPc*8tCM3=x{u+{bR^F8!!MR^p08!P4Jdd=}~S(D7s-GDx0)@MJ9fMhTZXyj&;6 zd68@cZ@5kDCwtb))qmd0H{=FlpY-}8Oi=}VQRc%48QV}D=L`BYo<8xsz|lIg(EUqc z=co9+GuF*>+2R!=aGe-itUH2}1u0#;z71`DpB*%r_Z&uuCw6zSEfJY7j<3SnL5*se z_6NHKqj3iZ=&jd$r;-#J^t}{n;Arqg*^Pp>C(m`vLC(F{oAy}S4paM$s~?&AiWn}e zN+}ZxGAlOa(Lkf4NfN0XA^e1o(G z9XPsKq;)N{#nBd66~-eKM>ml0Zk&=rWJe)5YoVedaZ=j8VU)l;+(hL*80k%Oic1#@ zOpuxV!H|SI(H*9IkXm(ZM$)p94)YI%^|JJy%i8H~jh~Y5!HYDPEs;3smY9D?^1$9F z2`Y9`LRGsIG~)|`2eTJ6cY_cHg=NI`xb$$7tncXa=$e}ChOA6=Ff&-c94eApg5VQ? z_=16~W0f?Z{m5NXUlW*&Kwm`XN6gWwuavp9?vmN!cNuZg7$3*aZF>&}%hIY7dvD~i zerr!(cO9*=W?j3VufQIkn9h2fiFt;GD1cob%(ykrYhLtc&r(tJy65qnuv$Y9(~eFw z>J7VE7GFBf__)L5G6_Fva_JGZ@GB!CQHQW8Q*m*lX7HR^-JuDUvNXLofqFf{reUmx zk-dzHVLfICBQuis(+Nlfkk)9_l43#9#)p>q=<6rCRIN%Xz_aZ$#>z*?7x1bp(hQd; zhy-L$wURQ;1CMr^i3jQOo> z@gtZPnDwU29-FtDj1|W2Op2FHR z^Z#uIegliC+GeadJ!dZ&Q6FrR?b}Jx@l-5fZ{#C~7 z$|spyp7Oph3CBn=CiEjHh7b{1^MrkMKi8ghk+{?IU2vi%WysV2kt9FK^R;1$4n*-I$1~r38X-l0?G~NP2G|am^2P~N~s>muuWkb^+ z7z<+k_1(Z)xa!qceVdeOI7xf^Yz{`j-f5IZkx;_5xa79SI_wu?p*KY=LFAdb8`WFp zztAG@4I`bficVsJD|R|R>RrRzj7~FR@uE1GxB8(-z#s|B!?^Jflof|$mDI_jDH1I+ zTk~z9l5|}a(&h3*)UCgY#Lqw20^g0>l#-AwE>qM797yDlA>NA~@+rEqYjf}Td1g!tP_GoXd+zFY?SK%EG`yPdAmTZLeC+Ij!Ywh7K60tA!+sXNYJK**Gznb|@)s*T7(w6b{07+ZW-B{79Ihsl59`en&e6Hd{KLlamAnw_xId{v{ zH*xno|0~!?M-QjK_(-!uD2f4~6F3*>HT+ou(It#a4AA{4qpK7Ic}h=B^EV20cX1Iy zz^isqULkj_v6IGtMRljeJpj_h?+q)v!nKL9*7qMGAjotufsqoFw05Y94SO`3_l@-S zs|kmCna@u;3nc6+P#KIAK^YLoTD#<^>IC+-C|j<0veL-mt8JE^MXQE_ezKv}IOufp zSXr)4;D4Ke`@PXB(JWKy;%Yy>VeF9>SZ1#5%sR*{zO>W}lAH3ix78v0ke^DT2%TND zfDu0SZ)l_jmLip8BiwxQp6LGpWu@mChO+#$R~@J^(Zt%&|Lp#R*8Nyu(+<}F2H)ebZno`MP} zuDWr@@h+ueFM~^s6H=tDNJq(de`k-b z58VegjfB3Hv)~nwos5Bv4F1Yw4_`2f0_Q+F;(BnWyUV3Cuw3=8<2VzqPHQd+z`e3V zAN}qLv`(Ib_1U%?*c_3Zr*R$Hv7Lr7)n8$v3&ZgK#vIKx;MC*{G(Uw7zZ@j)E$!|F z0qTYp6`zfHMz1yYhG0W6eXVj|8YAIwf|V==$2KL|Sp0`Zxa28Sa$7%<1^FKOsO&J# zDl&O_Nc*IH2V}w9jn5%J@&1G8TZ@mhDTkBJOO0kTs%{gG@8^$nF_3wCKMj;24z_UA zZh>%Z0x&%!OD8thZGOZnL<5!hw1rxEPno8rXz=}j9N5_jOnLe;{-!!MXJMF2BUm(h zw6-=z{M=s0weX9c5N7eO6MXvFo}=Z;vP1cFrYc|G@zZ+bEZguDW`6Gu-_`g)RNHoZ zw#acWc0E5ole`a5um2MZ8T96UX4T57oo^5Mc}z)u`mmykd1ci%mbk|h7LAy3!^I(o zo{v2jwTIvL`Fo5PSTBX>pn9mD?phi1rAuE!XnR|qG>BM(OfEI>!0D~ zG`b)nc|DJoG#cG_2=%+5VNlS}2hkYZefiIup@o3{}WrFodHLsi0yEqEgXgCoTb^7qk>u#vodK z=;18E1^M2b?7o?O($i9XPG4^bn!D^1-wi+N3U62N%kPdKy~;uZ+|Z59A{3+yL8OLs zN2<%XUNBJr7=oB6c;xlZrfxxR7#PFkWly*DAN~!Yoyz(Pd+ra?>9x8Ba49rcuW7gp z4nuoxOt-Or5|04|x&3K&>JoT>H2^%s!+a~m00SX{epp$%DF#e;A16qCCP!c`CGjJ7 zr>O6X!T0HfPw}C*biudk>PGIiGCd*idS1|jxNDJ?=C~q|MjN4NG#Q9q&sWh~t9al^ z9noqL(80(l$SW%t3Zo6YVCXp-8w{br=<-Alu}~B5p_U}%!OLF*f}SNqmk8rhc|I)l_oB| zj^K=Rmoq5=Vn>rMRi7&Iz(QKxW#(Lvg;1Tp#^WTC7(S;Ya^T}Mhs}N2X*2tzxqF#5 zsDnrMnD@|+2-W*1<@8D8L`^TqN}y*nbgy-@0`+?pVO~zA5RZ#4MCeq`(sKKeBE^3H`N@^1Mo3DQC4$2 zYE2X?&WtSW%%AZ|op88uJ>V?p@WaRHes?gx!}K9_cSu)IRt5^-xB!kye^)1*L-LOb zoM2vu3)YHv1w)qvUcR~>pF+>D^|Z+Uh9^_~$;#ypG_>pjz{OHvVu}(cRKT9B5Iqp3 z_NBSSq{IYziUHbRhpDFlqj|=19PEd3gPan^q$GRX$$eA$THM+6j)*jmFPa6UYB5Ep zjsm^qv35~Nq$Ra}!R=T6IO_HB{yXJgU-|gUW#4V8T9qx@rhZ#HyJYUr(ZfbuUpz)g zOwE32$e86@TV{5kE&r9*9scBl$FXT^QStGq%Qv(;=Daj*bVJMDnd2MOz2SE$eiNg` zc*So5B<~7#xdeL`BuQIEodXab185js75H#080ygyl>bL#dhZnS$Hd0;&CKw)QXMJ4 zlv%M^tYkivGh)3zVe&UY(KSyXTA%JrR^n*2_LB8-^=u8YS=?!^RJw^OyyhP87Stk? z=g&!wSK?;~|9C;|UG5#EEeJ9Qb7Bvehkj!)Gg6aS>P2R~!cBv>eZJ?z;X# zd7D0myg=K{@>gEFapor4ayFoL_BAsLmi*&p1AZ$eFb?ZpG|6R}NX84SCq?0}Idq?D zLo#q}TS@{u;85h&6>LZ8G`78Ut)yS_vF`mVew{5!kw=zUSc=f~Z3!{#Ktx%K z2aGThCGbi+C+mGVnU{OAmlfGVE4t)*4%rd9ZeLn*JUc{D7UT|s4>QiaEhppB&-GZ0 z-WH^f))`J8zT0|Qj0nvP*50V#!!34i>*#Zt2YW0eqHiCk)1xefp4PB)QP#_%(1vBn z8kN0*wG8za!Dfkq8H|>Rrub=Uj|O4Q!A2LRPJ48_*rI8_ig& zdDQR)BT6gEZx}g}Z#{nCu)J~qqqNmggXH&@Z`%3mtv`YLed~|QYHK@b#CM}n%U=*Z zX%CX8v;T+gf>1?uV=vSJjhM#h!5of_8NWFJUS}eQ| z^mO3t=VNKRx!RJSN@*(zVx1QBF{z^7j;&OuA(GU2NxZ^deY-x%ZeY@Oo+0-bLkmQF ze`btw=RA8IYSdH0$Nb=Mh}t?Y$oj*hJEagb+r9Bp@etMksN2Fy^M)P|zdVHewu< zV0wV*4n^C~%zGib_{qgDpI(i{J;$22{l+fhIN~MK=|voqUko%4zpi}5h*@`4k~?be zi_N-kmu+-e+30`1{V^V~_u+@bZsy2N=hiLy?&gLoam2e#S0_HOK#i}JGlQBQX9g{> z_zAS1k{uVYo1bZY7{@n+9~aO#z+$m5y@#=nKgl zhuwwj@F#_}Jt1zade+6E;p%nB;WbTC@XH*4oV@O?>u0ZCHD~rc5BU1@Dd^w7k54!} zbH&m*vu?R{W|r5Rm6eyrdgbsSm~WYAge}ejYZLV8L9vOj@5y@b0mXQY3SBRR+T?4VC`MwbjsPVFDPtAs!4@Hhr|alXTo z;`PZ#x_!R@>iQJ||EJIPa?g-$f9^XAa=7Xoy!V@LlyTCEKRr&$432B%-XQht4s!Kg ztzaQ$=Qk`^JwOXEiGmuIc{AFE> z&<2A)z@Go_?|6VE)V7?pf7O1J0U>n#d@Nf-1pPiB<(q(%@*+S2Gy#$#qzJu^fui3B zq#)x^evv}DuBlfB++oOlC7)GM1o(g>Z({I`y?oyggKw0KVepluI_R$=973F&q7&Hr zEeTQp{>`6I` zXN1$Zkop_3v}V=J>N(9ssk<=qv=NGMLJRIu1sTU`aMkD4`dc!tw{ly?V}T!l^X-51T^vr#*)Jaai7yUb97j+; zQpsfr`;iWr(AeiAz<;Ga3^i_c<%^U=q02WhaB71mp4sCA@M`sXy-9Ck-_Jm=u5?QD zd!g9(GZbUmkE~gka@HZ=nT$_ie$hht{(;dEgP$i~Y}xV*$qKyxZKZA0G4-Cx)8JR7 zp~?PwCq{Y~Y@Z3-D>D`azC?$?+EYzir@@@0^c~V80#?n+`fOO+Oq2+^(2<--i(6RM zIWmH^HVHgOJBK5bCS344*gwJBom0$CpSOT^CKjOJ9nZ_BJ~#k3dgQHoBhGZo-_^}n zvH9lrfNd1_uR0!SeA?NZ+lAn?{3HO*@d6w zBq}~*3ppdSvwQkt&=Qsme%^#>gLgdr4Gv_T+D4$|IeO90cu6GmJX^2R2t2h|%Kxc@ z;L+0F6rg{za$n}9o~-j*H5yHf2B-i#W1&TeCVJ<&)9i!*9(clOr;U*DtRK?nYj_?u zn`75=#j`i1u5Z>Uk9*loND{M#5C8^WD))HlFuTZ0tBp|Z)zB+9B+-jcI`2kbG z&S51co_@tjL_g4cZ1wDe$Q~c47!0IGM_g5;NEo?IrqFAHme3^{HH0lPB7z>0(^cxs zL`BM{3>L9EHnIvuM*fMBb^dgWhL;a59z1AZp>mGfCnMd%N>n=UaT|aKST1vq8~tjT zZnwHQLU(D=vZpTJJaNej-|(Hvf5(;&Ei8{PoXRLk7h(H0NZq%?-F8jrZP$!FK2UcpOCh|m%T8%< zcXCIPkVF}c#?tWJ`lB&*eh5?kXnRcmm+irh|J$D65wI!$tIc3nktsS+{UhxWuu$Gq z242Je1EyXT^8k3-V_;-pU|^J-l@}a%J)Ym@D}y`-0|=bGD#-<-|GxPr!ePx`%)rdR z!N3F(1prZ<3$%FJV_;-p;OPC^03;dyzWMu-!J5oks=Z-l#&KQ4xxAmp@@VY#FG~hky1hs z5sx7)QYaoIr_w_S(uPt(@ghBxQY6?+-|QL);^E`%{xkpV&wD%S0<%K^WE4=Ad5q~d zXu1s}&#Cvw z6S6?2$fDh^(q_k=(MKPm#&0dVo~g)Rgz^(5H%DD0DTHo??>h+jy-?M9ALN|%0HHsO z&?9aOC8=KPcdjKle+v8VYivpb4SyUBIWrrwj`uQePE^f&)fu#@t1^vIJ!$5o;9SW^ zEXfH1-KN^-msnC)CXmNwQ@$WjE0*4+Y{bug5`nGDk?k|bwuk2ix{13wjSSZcGKS~g z0?LvyyE1Nyx@tbFmbsLyb4uNfyo|gz^bS?}_J>-GeREEA2cw*A)7wW`3%2DI(oqk+ zw>5$3>b&ivk3*Ot%iQ0QALiIiVvBySJ5}?L^)>YyZ`lw34xV09(TChe-*3ZDFb`%C z1+Pm#+i?zq#5qLVw<>$|q@Tl0>_2vd zi71Ofm_?KsHOewX$sgf}cdP6t`<0AsdSZ6i(K;NOKkn^`^J+zGdboU8zD+60y%#Lyf3 z2g0oWod9^+V_;y=fx;+;CWd>AF-$^CQClgI(W z84_P4JtP-NzL1iTnjp1L+D`h2^cxv288w+hGIwOfWc_4&WFN_~$nBH+AkQUlC7&Qa zP5yxVKLrzoRfsr+ z3vj@7#(RuU89y^&GEp#bFiA3*WOBshm#Lho0}w`-7Mb<|;SDo4vrT3v%q`64SX5Zr zSb6{e;z*U&000010002*07w7@06YK%00IDd0EYl>0003y0iXZ`00DT~om0t5!%!4G zX&i9^7sX|8AtE-WtwM2E2Sh2luv8E?X*yW#AZdyyF8vDEZu|ikeu4gsAK=RK?t87) z)`b%8%X#EIU4IagUwP5fVmMqWU zaXeZDgD0?TeHc82Ol;BMX`IDQ4W1!>Hh30!d*0wz#O;c~Z}99p?4X7!C8FG-j1nA* z&$~|)poJ^kum|OJPOXC{N(vs5l!QS^tWvv2?-u>)jN@RNI3!!0zQk{#2^UAym5Cf2 zQ{O}zTeQ?A^SFktmOwm9JVRO<H%h3t#CwMB1XN_5Q#vNY1vYTJc?p(T&jM zCwlzv>|uFoa;m9DG7;5PgYOWR)U{9#?;m$YB#aQ=UN_@_I`F?xUQfEJ^#y#*z1*aRhIcz>8p3) zO3VhQlap@B(uwZB^R17Feri%##_{Q=Z~Ywgz5d*BiW$6L>;8)6O3hVT>wPiX)a3Xb zY-1OP-2ATmA1dYvtwnBF<%!JKq_wK{1F7EOvmv$=bEmP+Gl@*^Z%cmyEa0)H004N} zZO~P0({T{M@$YS2+qt{rPXGV5>xQ?i#oe93R)MjNjsn98u7Qy72Ekr{;2QJ+2yVei z;2DR9!7Ft1#~YViKDl3Vm-`)2@VhyjUcCG-zJo+bG|?D{!H5YnvBVKi0*NG%ObV%_ zkxmAgWRXn{x#W>g0fiJ%ObMm5qBU)3OFP=rfsS;dGhOIPH@ag%L&u5@J7qX1r-B~z zq!+#ELtpyg#6^E9apPeC0~y3%hA@<23}*x*8O3PEFqUzQX95$M#AK#0m1#_81~aJ= z0|!~lI-d}1+6XksbLS;j^7vyv68Vl`j*#wA{Hl2csfHSc&MaS|^Hk|;@%EGd#IX_77( zk||k|&1ueXo(tUMEa$kz298P&*SO9V$(20GXR8!Qp%h86lt`)3SKHL!*G!?hfW=~| zjOer|RqfK1R;688(V`x1RBB3HX;s>kc4e8;p)6Pao9B$EskxdK=MDHm!J6u-Mt|f< z_e8WS9X5kI6s&J4+-e_>E3!{mU1?R?%zwYF>-rx~rl?c^002w40LW5Uu>k>&S-A)R z2moUsumK}PumdA-uop!jAWOIa4pB?622)yCurwR6C|O`;Ac|F3umUAvumMG5BVw=u zBSf+b0R}3v3>5!4z)b(~ z|6^a^095~jQsFgz|AYVAZ~$4#;V(s&5ljxnc*2xDtwc4s6GDa;XMPT3|!!;Uj-vEAnuW1cvvLO z$7e!_1a-StfkUTdp!c$}k zLY}scD3DW7SdC}jKIma3c^NHw5i-v1s0)e5ubx3#?$GUzsu+QR)zw>{+TE_c`G7y) zc(eBl+=n(*hCTWB@^f^ja(+9M3Z zaQfWK!YL_=AB8@r0ehkiuv+$P#z)&OIAg|wY_8_1<^$0=KIr{1fVlv_Pg|nyj&ElH zDvcm-guj^pN+X(wMVYKLxY8A4bSLTCebS653qv0e0-{iZYw9nFX!SpU8oE1HC>t-nm;{_v%YU!F%sw8xqR1=oWZv4p6fYyi>6{;S z_FW2+4zSp4J!-s|-_GIi_;#5mDoc=@l~W>($BZ^eD&Q0Z$2E}DTB`D;8W>IpWc?c^ zg@R+ErejGHB@Zn=gD!u1?ZkU;yb6b4`}pcvO3=47<~{a1GwT_#Ken=C#WXXFr(AzB z#cbCKXO4Q_iRv&*desLodh{)%E<@^xh@)>uTEY-I23E=($bS3|-FWpDS=*3UAGz48 z`(?^%P@8J31g?X3BXOJ=I)%%%3Z3jmNr9}B&emgx`o=O!ud|#vDXUv9=oWl?d{&It zj}afoT!M|U)^cBFIavom-Q zODu)eTrhnX2Yib9;K>F~V8Sg4yESi)zSHl_Z=>T|Cc0)&(jMc*lbrsyx5?5zWB$iq z)r?-78|T_$0mIBLvkY=SH-q(pfLZZy3rLr~5Jhhv3p#g(Lv1Hx>q~t05Re6buyW=s z(%&FeWdf_B9wKs1gSJa1CXLP6% zgA{Ne-g7l?C12Lma_36ASOvs;Z+*iaeZd@;iuE?7nmWw;mkeYhy* z)}GaYLBwa&00Sh8R{3|XY=D56XirYtX^DnI0D(fo{|z3;a*>?&j5wT{T%8R*Z$hh5 zQ;y{EAg)1)7($tQqV|p0Tz3n8GdSiWDb?U_TYE5Tv!}M2@#x=mw%=jkuAHk5be%Bx zt$pOD7VPzF0S(67y~#>`|57&uv|%5WNiZYkY>LyB&XTa@QfVIrnxIMrk3Y6vOBgd+ z=!z8bRhsTY4jz~;H+9gr&z60PhR=CGqZz6MxI}_c!qs7ZmeB0MAzU=6@sm^q@b=Jt zh;;o1KT8ZX=r`vBX*_*tUwcY=op78;LACGFxf(xA z7Foo}TJ3%4I@Py`LmVs<2|46o?G>(`wY+GtsOL+Y?gGxI6bAjyu|pur7)S_DeQMO1fcpRsn)cl1kkWmkc6s$RLU~tZX@M5 zxUmKapwT(fbfOLNjFJ3^k*Ua5xkk#(e z(Ya`X4)$T=2y+@Nv}!sV{(zJLkmg7J@*(?vt}vR9A9h;T3Ul3&-$P~DwhYYTt!#r=BnBs*L4Ja7G#I-MjllIG3*kG7qU z##;!>C+M!?X^mB64Q{o>5q!mmnmWh|E!d2GI;lY5@Gpe3bSU5Pf<=uA9#p+ce0I2% zlZrvo#hdw6UmilCifx{{30h^-2@hPd^&@OAEoK-)0|QQ|x;h;+gt;V4LSaqPVLW*4 zi<3_K*;+kOj|MgK(B=g=sM~592ELY0>wvqSu1g3uLv&g!Zt@V(u0+`LL3y2Nk3Y_6 z>OoIGgK}=I=XaSBe&%GhoPy-4mN8~h59`(;{RCr5nr|w(&nn}2NLANYDY417Lmm|S z@pBY=v7M}g1UY)|3d5n1Ppl7A(E7=kVdrv7{4WH9yeq?POg2c;c^`zSsXr4TNK+Q1 zQ6vvZm(zaOO1Mo-zs1A)v%%_9tX$KZ55PmG0UnWq*Tf@71cgA$*zUPg(ff1;-|1as z*_RT$YvebO-gf+x@OfLZb!%HD2To)SLfEn`=y-vQm^mQzErF2a!(ujCI~hj6PEr<^ z-BAsD94hIM88!w@?s^V4!fBNzpT>tn zu82asn9`Q{Ln=g-9KrU`qCVErTnxt&-%fMq)VE#ZB@_E8CjB4`v2m674{;cq+;6U;{yBb! zM#l_5X$tAE{-e8;WLcIh&<97Fln2DX-hAmNLh?yrCJHy%mJQ)Ep>!paur%A`x1rqz zIu1A*D(ZdNorkn0+x&yO1A_01IcXSk8jLg^N2f7|bW9^6V1zV>Z<7956=-&4aL?|j zoszFwh|x`0rPFe4UB8sX5at%JG`|Vb*brqL(WuOR1`$b*Gwfh2t153*FGNpSFV0jj zd2t-N|BN*=PKP1FiHaL2&PCPB)7Gp{Oe_iDR*JYnmzaeVjzU{W%vlw3p{2#f#9Q3x z$$#9vas1O1HNJtjft+-!bg5cmalG?L&C#K{A5Yl2;8-o`Q>V%Si%Z>SWS$V!- z(b==6rmD))e`6%(1e~&?3=JIkvS|$3AmuIS(Cud-3{(IspMdtckE_1%wUYfP@|y&L zXj!WOWKAXLC`%?hO+R(HPA~zhyQZcBEBvkIszVN_JSJvI#G@)H` zruJbO%myhwF@KpNl*DYfxdk}-<0heIX<7L-blH-V>k8Ry0u~4MFL*Q0*k%fNYRDjx zJ#~5L?o9L6qLnuj^}lI+WftXVlSz?etp?H&nMM!J3R&|nnFQzV3qQchDM>Aibm6*= zAhoJ-wH7LrCNh)2s_-Pt^>jo($2Azp(qD>HUbm?s#+9V=Su`_D zo(d)ENtMTWpia(=kkD>~OG(3~yM)yz0U5=N^EH(*hroJ*IqyvCs`yAw+Idxp|O%w-g#VA{T?V>wl-;m&@AIo^O#cc zzel#UBw-f;ABNO(NR@}+5RlmG?h+s6zUVoTaeAzm4tbi8sS`aH=j8O^{K=g~w5%2D zt$nndke4s7-FCocaAsJoK$t;z-p2kbxLH}sWu?tcO;;n;{`1xaO%wA=DVmC%wFGPm z;#W~u2KF9~D!`Mjm3zjNMVzn?QM`=whLVD{&o=^h{OphTaFEAu_OHzMon7#IAfrUX zJeNPy48RZf#mE+(q_$C!I-{8Ur?ho@V@G5k+Vqe1apdedlP0cz zM7`sQ-s}4}+1Rj`;n*-6{B?%WE4lRerghnh#7@^3ZRs6JR|C5{{B>CGH9yN0yqCLT z*MH&lz}-V4sv-kn7)T%Uw z$hsDs#Up1ugbDUiRy}3GO_)Q~hulo^{LDIyQ6aWGhTMX(&Y`E3%IG#G2yDx4w1yQw zfk#(PU0g|rqj=cXqa2$(A_SPUm>-A zh)6h|XQ$mzd8>{WTnVZf=U2D=J{|5hGo=t)IUA@xfnJ-A=t@ZOP3qM!1o=lq%BU zqEIfo>0i*SgAfCdu}2~;VnYAWQc?%7@#OwqjH1@=6(^oXPMnfv=ngJ8o z!~;rmY!a`q!*50b#W#wGye27jN>8R5>5Q*7k_zUex53cI?RG_V)nz(|9$vg~uCzkj z)k{0PlG*(}+uLz!DDpTSB6(?7hCVq^*!g$_eMG9XZ^tE;kB4{75iP2X_@&-3x21GV zY_b<^bs3X;++D+n9)}H%OI5TfTitr#*7L=L)PRU|eD-F5LWaKzmwJQv^_6?BrQeRZ zXxOUUCn9=T(k`Z!+aElL7W5R35%G8V!Jm)%kpeAN{PQxbXn?QYwi#9Sd(ep^am3e7 zr1vR9u=R;${u+4iUIb>~m%h1lZVjQ#156>13$OTcV;6!@na_+ZaGI2v)9{w+Gq(q#D9XDO+x4lc;F>Li#W+Pveh!sZi!DR+}YTd zCz=hIC3TX94~S|RR_x~cwSHv03%xjl+b>0leVUq_X~yF;Qw*qaRg{V?KGo#3=!w_P zuMn255zV8A5BKuycyE_2J#)Dpntr=~`|+hXQ(A_{Zke_u;J3zwT5&3Yy5o3WftV2Q zzp#n2WGZ;sn@w}4TEW9aaAsqIV}tXl7lj%Yya}$-MuQW-K;D4=bFEsUI!V2@Um1q- z=$rxC1m^TRQ2?bcJ$%G!_m>G3otm5Ybmm2}>hA1vU~5Xt6e^bOiQD4RWkPHP5APp> znBZWS&IW5?>YWl$wU}J=` zK6)?*!ROt!y3X{c+VBQ}*5Q^B>J(&|X0v|NFnKQG=C7FsJZXc9VeRvhwbdOFmIe60 zc%H87CoMhb^1&R^2<*ZT4rk!+c5fuip6y@RC`}aI+V9?P6z#24>zFiHh;21M(DqOq z-5(Kf({ypr7pBv#qOrX5(C}1v6SuU}L!c$8(?M)ohaBRzeRV&8!Qnks!9pWpAqG%2 zkj|DWYo{d1{~P9B4Pc=wlmi_eq8I?MmPxj^2>Iqp7djc(h0-|ahn_J6_M)$1%&(Cl zRIrg$8Ci%m_U7#Arh4-TVOlJKG6QkHC9oJY&#wZtGoHE}ggC@?|BzE#G`IB$M(2}zZu_) zF?u+2$1(@96*ztK9Ko@P99Tn$t`<=ofgugmx32`!qHs!B14&L?mAS&!Lho{D#<}(HJ*sTOP zZRg*dF^Rlr=^llZA6sG^@!(hQNMUlQ36Fy!QdF0hs-)sT{G_6DVt{5%^_kcqqmyz8 zRP3n;_fyUgGww>NWlM!94QEBnS2}j@{su4nCi$hjj7!OMSwUsGybAEoZD}qK;i7Nw zprPb(oNA!39X-NejeK53kwInICbx?I_NnTx|#KXh*;YKru zBn5%Q-`!c=S9URy*~lsk@DqzC{xNmECXdEz&$^>WETmq~1o#=|tRR&Ia=I=fRQZVT zP>?760rF5$fQmxDd!g)Uz{j3O#mL`5oATL3a zI%*foukAIU* zKnY(`iRbPOz91a{R$>L6Xax(RcW#9eQjo4T1?Eitx?XZzcI+1P;@@}WsVoNlW zDK@f%1n>v=j^g2Hl^`ss;6ECCHq7~9DlkL0FM1CoIFxXdJX6zznIjJ73GH{z>7h7F zy#bGm+2owsk1J-E_R`M;i~~0u7ZKQlNf#y2j?XLCHh9?#e7#|BX7H{5T&A4E1Ox;8 zUGmSIOQpyT!;k+OxkFIJD?czU?LFA^%|iL)fCp)Lyt!N|9E>M^g7-mUB!_4^c zT1yzNybJQV-G`6(YH$Fkv03|5w~WWQoiC3WNz=X)HoqR>?wSde*Y}%abz8iU(jp23 zeb3bTsJgY2l_zOKw)p$kf%H>=L!!O>l=Ii!U3+ZwU%@DrrmPu`sqxEL%t?_)4D&aM z*wjspiKZkLL2XzuVavkCdx~Ob`;)0AzG@5`M~TRqXW7D5T^FI za+>CBKBYp?$=SScVy80a23Ajgz;!2)ZD(Jno=Q7GeYwj|G(65z($9oGY0=f9b~jm( z+AWf(Rzj$#)-Y$bkoSc!IT2sg5Bxl|g4kA`Cef{qlmabyEN2Vsic`;Bx?Ue6puZEegVD!FBW>hm>kuE%` z>d1w6Ti3*|UjEw62SBBf^l!FC-;|}j{2e)|L_ABb-USWGb8%l|Thsi?RT(|bq3!xzgyA%vZnz`t)o3SD`@Cjh-#F|p$DGCrCv9>CX1eyE|p#% z=wy1do6BtaU?dE?waTX;k+@N+I-*X{TJL49OTEQWuC})#4#Vd{4p7>vDm;NN%s(>X z3Gly%SPFklFs{BO@=U4)Ya#re)uAfl(@WY)?d2}KnfHj2Z#j_}43Cr)0#uRA`y(@V zY9X*c-#leRS6}9Y3hYpfkF(G~fKk-Tsj7`93yJ-i>T`K0 z`rpVEWYZjtSN#5UlDUt$0qi&&!f#So)c9m;$&Tsvx(tUzW}nx@5F0%Kk=hvKW5{o4 zq_uYB43o2jKZOhVv|!4ce6bP;_n$A z^-be7ZIt{Um0?fWs(0=FN2YtCo$52FCG9q0jwGD%)hS5o2VuNUZz0`<4Nc3n+)Je8 z1RvE9rnJ@zq)LlIHcy5gHN;|S8qM%Bk^+k@i+Lx3Qt3U4XJbf& zr96M*FLQbHP7Vr#je-cHX8WUd?icvuS5!$5L6c|T3smmv$qRnr=~h3~IS6a`U0^pg ze)EcG4Gv$Lz*sVZ!aC*ec7;cU?2hV@5`7vo}tuoGNT1=w4{9_w_ z$hX*wBE^sJt^4O>V#=(x6KIy3Oz{$L`E8+#*5pqo3u~aO=vzIEW^D)D+JQG*v2Y|c zJNDO1j-%`!4AxQ;#k8&Gd9p2Gjn3jKtcc|CSGBMu$<6%koVo=69#bJB+J*=3GbCkT zwv@bY1sr5?5I>tyZ{BB1Bz_cNi$+u!2sAG#TU|571>k8`71O<+PlP@4GvZ&zg9o#GTAa zKbn4U@DfZhybO_C92JPt1$5!}7+kn1;nHq-Mz`casPa@{&C6}E9E8&hPTeRj*w z9$?8(h9R@W&5j3Gc=c|dJR#?I;zfomA+8|HY?6rBc2y!aNrL<*M$CQQL@#{!MzY!c z!ZN*%vL0J8-llLe$iOSNBH>`WYLmDvmVn8h&-W6I#4`N+as{o6yIHuN#+S2NP5+jS ziuJ(S^|qW2E!Ju-ItzsB2j9KDnEC3~xVxD;f|n+SVS)8SZUvF@6BM_w_NLGxH58sK ziXt)(_Q)A%+3H0Ze|zesxE>en5payQ(L039u-~U!p_)Ekggu-@yQKE{p;Q#cj`!;iIoZPL{-EU#D>AEp05$Z= zEG1o~b$=4*AT&k-mg@9|*iRZk=4C0yY_t-5yJM4FMu3J&(-qauPc*0Hs)g}N^YT;M zsshq2Q;I7qJ6#of5~@CQTppTK#Xm!98GVWP`wmM6?`hgD^HRBx%kAXFB*`#f(iUj< zbeb>OO{tQ3S@5IBr0OMb7QUt%Lfqt$A_{(n*{V>yf&#xGEx%9K=JRF#iA%^H;c{B9 z(wgU2MY&f}ZwCU5S=-&8gnPAnw$Ywi5p8LM9>#4!g)1uLo}U0W<~DP$DYz#p@>` zjM67%;c!Vi>6y_-W)`6PxW53!xUgmLFY`w3rlv|h=>c>w;S?C*gQ!zUkd&w6F_9r0 zfxn|^e-+D{9-`j7Ag&?Ok*wU@%kG#=O{iU%f|WM~<=n3gLtoY;T{tFaqMh5|Pl=4C zP2Wp+G6;O5p*(;5iHSS5&eUR_qe$Zxa^K?m{KGP45mk38y<;(%iZCmyDI<9` zszvPqcAAw?Bw*f6olhnfaW+2O;rF!+xdRecB=WU(QAZKBtSLstbwkKdUGf4wS}O2B zr7tA{7v6eQH}^z!l#-Q`8=FyFU%AAxCU$&Y5-!WSn0RU(n2IdqQAC5Q>>3-k2_a|8 z1bEvL?4$a9B%~Vgm&OO7vkN0-Bo?!gLIfUjXe6Z-=tEUHgme+4eyYd*%&v9iIh$lK zh5XDqtzvT8RIc&nL}hh0>HB?7&>=M}MqS*jY*clYK^w`ZtYrB0p!44BK!I3f=JQ`X z^#4w5HAJDAYHPAL_+O7V`L70rq+@AQ|zIP8DMP*^^roWJ-Ki^foM8TbJ8AKr}bu6>*Aw)%PGy4hW(_ zpArQasCn6#7^a8SneH7^QY~9BMHEEi*lx98g(rPM!#+!Wavau|(&2Yl8I2;84S^#H z&`Y|(t@3#cYDE|8imE~tq!{V_i9l(Fow|x|utaRyJ7x7lk7E10%c8u524zR^w8crV zOoa^7VTg5q=#{}Fd^fd_b}Wv9vY%6*K(gkLQnO+hG&9$WR8gBF;m}e`_7jUYod zrQ{AP9*D7!$0>hgUi&$cq+ou(A-tG3%|={t)fY)Dphap05mSph>$D~=6ZB$t>DJmj zz{IuC4p)H`I>-~gY+uu!rQy{B7lAYJ%P;Pk;qif>Oe;#E{+!00Uh<(q`q49_fbXR6 zJCG`Dhz~7ZQIuMn-}q<(ZLf+R{;$!_*uZf4O?_fi4y$5#Tdbs@)euA>6u{%;k}xH$ z7Q4WDmbu(Wv}-~816}<{@RQ81uWD68Sk88l;ll`-fq6E*4kFXE=)bg~-NN5%ebz95 zZ(TxDuvPS)LA6|$ia^cppRvqt59AT++?jf}km?D%z|!afgKohrwCAzKnxa=o zBpy=d`8XrRJ)ZPumGL1Avufak)a?R?2Ab0ruUwipU4Pv&`Q9aNhZ#89oo`tbAUAPz zbQPLue<@(-&))z_F&+;BzAw2kSN|A;bfSewJjA827|WQew`0MS<}ZlfC3ikP<$L4D z-TUQlZ&Q5;AT5&0d4P549oM4He&_Bpa$Q3!vx1~ zBmI%K*5_p5U$7vHbokh_v9`X>LoB_;o)_|nKDYsqx}p?7e@XO_#9~j@q;l?bzEL{x z;K$uK)AVlg@b1Vmf!Ok?Z$Zw|4TjG@rX+exHHd<3pSd1n+@;@KUYB^OYz|%U@bypR z`uh+V=PZp5E9PdA9S2Ajsl3fxF(dC{QJRS zzr7vSER4L0M~F*e1HCjCf5{|GG;dm1XPFwS$(A>cRg~TSO(0Us5?pqJKb$)|Z0SYX&RLZV*>EvM0)9%>oR zgOo^eK^&Q{ESf1q0U^*F>{;u^w9_qn1R6f;WQ-8Vfw$36Vx1vi%kr{JH00Jx37n=sIeg=L(Dvcx^s^EmH%S1pz80+4 zpL2Cz>Z?&=5t=;HhV{FdG;4h_Wfg^=5hYRjE+Izh9m$!c%;<$Aj+;W&jJ%D^^D*v? zzY3%84Lda3?QY?f5EV|KnyPP{ znI=b#~7+Y`wvU%uZm{10ZHFJy!1TLPpLdI&>P*NH-*ZQ zx99h^tjY%}cG^vd5!BTy<#rdG>cqwJ^3~k@Q9XN~?UnqvJFP9hymox{RkMY$1|!pj zHcDeQPG;v0fvbC}7>8M%a34PhuDN!E>7ZzlOCy%wr>Knf7LEPETwI-qr=B&v8L6ul zm#W|16`!}vFweo)^^EUp^El;pYMs{JF0EK!U3k<@N%$Z%HtTR0Y=od7tnL28_OmKs zZa?*?*^(<5Fpqrks82W{_^SeKLna2F>yKE}fa0HS3n^UeS{S=RjM75EYy@BB=hxyL zv)2(xO#U+tabc(WyRsk#nV%WW`*u7Dt%(7TM+#}!Eb1xGYqB_e5)bHI9C+s(cg4xI zJD;=Bqsb+aQp-F`_9mBJXZif1m}cpEc5|CDcIOT#A zq0&vG=usRvO}s^I6Wazc_|cVpUsf@`SW81|V~UOZ=wUzo#i#iV2m6bq2B!=ae5qQ| z_2?~w8~jX?Uo68kmpQ`sw(05iQ{_++A^whSr5|cN;~OmWYvlt0UHC}48#YSa=b-iu zv~b}ulbFnBlGh4hC-n^QeZD7)3!b2=$3OzHZe{_PMfqhs1$tkh{sk0Ns$zt(Rdgz6 zd_|-Y7wdrYfLY#OA^PDAJ`L{FSrO5n4)R;k%^Lf6CUGUIvfwn1+>peVP20xQaoNZI zQ6tDlzLRXEO#=?;|a@lfh*AooX5~K z#VqLumOwgc=G!o{-YhmrTL(!|n&jYQ)VplnK}SmNDiM;Xi9{xJBzo#}F>Z9zn=17k zJPMf`s(fW=?ALmgXVldUKam%%m2DC`34EfxCjU>tF-S#bg>q#*FSmiGF*NO%rQOlM)z?l{$GEdb_HN05*{#8Tj?+CI(#o^qHVv zIf8gocJwUOzLP{k%}K(FfU@lGD00t4^1UDEjTk6Hhh9K`k1g1ZnKDBs=oy)iM|7eQ zK$@EO__b174bMji+Huu}dL90D!QuP*kFT}KqlN1;EB{?q(2-fGC61)^`C{+ zY(i^IG?O$*t6D`S;zf0N(lE@E5@X6RoL#KZ{XLE4U!*-imY`aW2HZQzCUJTej?I(4 z)?1yR(h`ZT%gbv|&BiECi_#iF^eMGJlS&f5U&e8$r0y{c=w%MVM9^m~<(=k%Zk5ta&s@PhKqhBdXUqC@igP9x2O4JEaSm@`Fpwq! zWPrwS2E6T@L*S}qPutLSs}uG^(@8!qEt<5|N|_%f503w|z?}3g2|Iy0;oAR*l3D$d zuFkOrz2u1j5E5aTO_(`i_et#G$+AE^TX zyA)Jh*YNa<#)e5AhRVT)+UKzNXvn58lbn95^to-IT6Mo`bshxyJ1B zahd$2-w)mzusZ3E19CX47Mi^G$(HG(!UvwsVREWFl0^13?C^c;h|&g?wBAp}yv{lo z_hXtk9Ls=l%$1vn7<$g zzv+>3Y%BaQKo|-5_z8PR3ML}7eCK=>EpE3{m&Csu7dQKJ#y?*(m#%R;K<&qF!v>uZ zqv$IHX{#8z7;S!EHI$2oDQ9BiW!!w%DD@z=Une<1G=}lD(QkUfb9OF@yRssLC+z+b zG!xg-MVj*4pyttDAM_xjm|)d&w^hP7q55|-yHes_4mU0>K;xf_g~d>QC9gwIe&UEX z>E;m!FahCy-MJ4XdDAh-Mxy=wtpfF|s_IrWN3P(0Z?Skwio%a(_*U9l;T4?l-Z9(>tvjNJc#}qV(TcX}ej=b1hqM-xq);CW5%1 z!olCTcyj?NBJWz!qWmc$9H4V}mNN8D09jf9pn!bVb(kBQK{Nk~rN4%sAt`>)8a0Hca3Utc|$}o!Jg$PGdCYreR&@q|DB*~`iXHD5kP@Vk-;8vr3R3> zL(+nHV-Ea-6n?U&I&%E7=xg3cr9}&bD4Rw_l5k!>E3aYi!()<1Jh(?$qH&@c2!Usj zA%edP#|5J?FceAkT}u%ygah)1BC!bNyl_51j0*O3xD9=Kos*AN6;pw|=*2kV1oSHn zv55g6dl6{S*9Ys=xcaqTqy<{O2N#i-dC=Qr3SEN zzfP>K_yMeDSvoUc1CU{(2ts)30^m>#c#sxr`~Vh_TE@#iSc6e#i65Hr?7kdh^Hwr? zBu>k7tdXp1NK4kotk)Lhe>Xd;1Y7NxXTC)p?pza=*9!tGwJK4i{b<|$iHQeWK}5`4X&iJ zt3#AVQOep#C2r}kG?Ru#x|}DN(ukC!Xy)pbmrwM+J!oxFSq|&tNGcWyvvvVEm@~SL z%Zr?Na#p+qjECcGmMmFZ?O3H`qSr-}BE4F0JG*`y=v}Eh`nk?r@aNP)UXfj8L(sb2 z#C7$?Z>t*Qptzqj`IWHpdXF=U<#Z27;xckJQud9WslqmJn)L&yFvsOGpUwT8t z$Q1Qo8yBFz7dUQa+PT0vSp!t~FG7Kcn5U@7Js*HK^bqfuI`~gqL^dwBP--(kHh`qE z*D4?*y@G{SNE?9fW7}0WK-$W67aXCe1dj)t2vGCUUaVU#>Ne_A9=;!VzmD<3|sk%HR56y|q92FlM{5UL+ zm)P^+{&9L2rtz9m)dZ9YRH?A?gJa`K?O@RGKIEV|>XC(e1f2-!-fh<+DYr}|w=Tu0 zgq%ru1{YJL=hbAM!}CZR{XiKN-B!njxw4OUhS;y(W>(OcBdJYSatsyzm@g@{T^{Q? zqqeAbmpGfv|X z!(6A#gL@r3JpKom#7`l#5(IB+V8ol1}~b-^7#MhXqh^u;wuJ zmt^TecM|YdY&g1%X|uasq~wD7Xty z>!{U;hUeuH>!buTY-Q7nkZU)+3Wf96ZWuz!^!0ZL_T9iFcM&q+Y0ei66P8if#XoXZ zS~UA(`AtFk)G6G1IWEk`#=*KcEa7dPrm0YW2+lqkPN7IpNzwUVAwfD&Lj6P-Wfwg* zb1gAEXv>zl$H8!%@M&Cr9*RWR-CGPZo|j~H0z|p^ zBM%J#lYCYJLx+Lzv`dLc)J?H)g>%Y$(Nx>QWrAsgCHqxK*ehft0g9{C(FW z?MjpSQL0QvSaLzrr%YCUm;(LT>VvUoMV#{9*E&^|4C$JHN6}gybr|x8>&o#`kCIId z^qv)Y(klPni1cEj0sFbajF1CeVD-on$6KjsSG{H!n4=F>PXtqWGVTkCRO8I>Vn+wv z@YUri;s5YjTqgb2RZZlAhL-j-q9w!A+#qh7x~*T$&}h?i=?FhUi4Q>{Iy(8_;jOa@ zm5?Qflnq|^1ZI0nYSB*TD2pUc1KbWFl!uVV*vMFGz8{cuT{q8|Ze1 zOC0l4VHPhz-rZk`0`7&j?bJ5_KQ{-L*FCmz_62H&^nI!tOiMjJ4Ic-8-J*ft#z8nS z5P6}OgfocBw)Zz!Bw;IT=OSxLvPEVGhW`j~*8F@qWwWKBV7l(b$HW{%_IHf*wFd8| z)i$O>{~Kf7uR~t_hOXc}9kfF5%sCD~JxZCVUkBVVTr_oM>a=>4z@tFGN9Gq}i9L0Q zMEl=d&=Bzz{aiUIwS*2w*DjDwLSqMvroTsGj^dWqP`H${`%jt?+rBd|cvG2axoY>!*`8FTx(#EwwGL!HhPkJ=b0)OR26LVgtC#l7Li5vrI~=_dOM~=4 z-frm@`{VYMI*t$L_Si$psRR0&65(|6_{JT!b@XgV-s>0ayV2@A^4 z{To=cPneX^hf+-~u5Etmx76jcCG9hfWBD5bIexZ?z|MNzsU!7IDE+f>P9N0b7&Y3L zD(Bhd--mAU^hPzZ2l=88WxQUQQ%H}1ajBbOZ&rxzB;{Mj7_`KY*fgUsv71H;c(O{y zRcW$e{@55oWr~Z{#f&@t=o@a3=`4V438Un_%<7n0cfHmOiez{b_x_?pO?tNJk>jQ7 zIS^i=1580|HuW>Wbe~tCrD>*#D@Qa?CGSdTv5zVTzHltuB(?2l3KP4poL=dJn-6ld ze{Vl+ma0DXp6PBs?iPB zQ3cRUwIx%rpl8CN`B?1 z`T{Z*dvEjox<5l4-S4FZheLZGc|U!2IsEGAC(L#0Yttedfcs2iQcYyQcWanx>nHt$j|m>Rjv$DfTrGNCQ}24ujr!M!TNo7wiLE$x?6o3#UikdvvyPbY~FDb`|+ zDLc|~ai(pCgKL!aYk&xVtBo9ACN15;-Hiy%@Ny-D+ucg8e&g70DGE@eqM)6CEMS;J+c>Lp`zk6Pk-hVEZ=`q;>%c+s(aM3zrTEw7m%P@eWWERH%K46@<|RN9Vw!CIc|wX7i=!l1ZHf z%`JppOt+8?hql`5UpXPnZ~@yi=hIFR(Qsd+%WvyWxSd$ch>k;LqTTvLD;1$r8tI%^mRoky-L@ zHZ=3qfn$MRT$mfOMPoF*PziB!t4O{^dPTI1LK7`cY=_fl|Ut8mgkuk`(NK3Kf|zXU;F zm9&OD#Vi=$=-8rzj5H)Ts``fa*v@I9Ax^5+!=U~U+*D1NrwV{z=M0h!{8AvXpyCEXT#);grV;X@ zyNgb$#pmf!NeWiuQa-ep3Li-+Yon=RZj5)31cQ8x`Fp0w)Xgf&#!c1#BQ6yfj0+I3{Vbh#}iR(9El;LO>FE z)ShM?9)bee(Xo&`sIU|xglL0JAh#9+WaKQ5Ab#Q*ef@~)MI9qJhr&!ILokR>7Fdo2 zxa{p_RBcGCzAs9;{rUWwX38q5RhEgA=#^bFQaL_RDpj})%MkMXapo4@OeWZRm@>Nk zA{=Qu52W~NI3}TzQ^j!U=EPXz&5J$_Q*)-54WCug;FQtR@JvYXvOZk~YDA-- zE*h)EaL!IySRcV^4ypZQWpn9?a)E14KouZn9oeuyHN}E&$|prDz3WXi=7(EG8sQd_ zS#W3aat82uui%Qnl?iLFL@*`T=L|*vNkwX{PL+*x2~*YsZ(O7l<}p%5(1=U9pojvb zA?PLAm@e1|yRh`55%9ae!!cexhFq}M#7A?#OAhT46cd}OGXkYO2Z<*J4Kuw8=j8^I zQiwt)0xcscH^<~KYxHmeB?2tD+0+vZ4!w?32^1mN@}G|2#&-xp`Z2~BI3${Z_%?%o zqTesLLKe6~^KD?rOVxJ^K$=#2&f;dJ;;S|f#}mpp5lT0uIkCgPwKiP<$fr|`Y04*v z(Ao~$05Bl>M1%%ng+Z;0uEA|-i-r{HOw3Q>gxv$*I6X%fD|3YsXTAYiE6_HGf`Wx~ z2m~wo5sQdW4 z@CX3mlrkoBtPD{xSR&}g_uM8uMVaNDCuP-XJoJR;co^TO5ES{4L<*W4R-%lnDbFgB zq37Y?1AwdG^&RKY&3%JbS>e4)J(CqNb+jPig#Z~Qcoy$^G5YmSf>s>u3r%_In3JG- zS$q7>ECo|bkD)GEW0VBQxRDU$V|NRm3*~i-HWgxuaQth-;ih@d02E-yDD1J z4y8uc?3F*P0}zz1@HW8uu@v~I^)G7F#yl^d;3dEwan+m!lj4B%2pPd0kpW*OPStB4 zYb}B_Q$U~SEL_U8k$EHVB$YgmK_>_h(@I`A(wCb=foTS7CBTJv<_Ihsrz@}l27RPi&#by#n8F6IX98x1G` z3KlIh?wb~j;f3AJ)^Iq?f}u=k2(0}P9T`Lss)%tQBZTY%79=J_`loHNJKPzJ+R3Ut zD2|sR!;>T5w_OnpxSH*o)^MCK*`ZaG*sX-pwH?m9Tdy|l%6N$tj@aqlx=EB`3~P-Q zYYO0-s)xgv$8_yk&XgGz8pX*`kw{imP34RFMHOl7uLzN*$jKzRqF~mbF$qEPxp`5< zXF5PHWWY3Yjh>bLA9CIO^mffo9Y>wU4TkWu7krUNWN`so<}K7Xd2NY3Tj1D|%r|%7 ztHKJM4EW~hj%K~9e%leyeLX|x-C#ThKB4TiSV$QbA-yEbgYWKT zbz>@J6&hd-s}l^oCzqb@vvDw*cu$IiI)NNdL>F%fShy3Xfs#60MSveLDUv)Q1hMi+ zR(8RHV+c?_9#MX?a*-`E$%s%*E+mWy3~{F}N--dP&;pyIP#>W?sdjkDr6VCy9S~=k zKECdBGu&Dfb5C_(ML2}#R5&dKc^x%u4hkf{4_V~hk8i7+r4!rJHg&jU8J;p|B1>GEhu0A0dV@l~q$zWA zG#@`VFT!889tn6%>dg5Xn|j6>r|zm{nM3zPj2~ql2LrfVOsr{=lvP-NO2AODBPSI! zgVo$bm=g)!HOm&-dS*wJ8oqvBr_rlztm1H0vL*^Os&PQwMF?^_56apEQ;l0N3n`ja zLzUnPPMc>sAg=<5$5!H|JDIK|QbKfquxD~b4gkRb3Ewn{5%Cs8l)l0jxSd1>P`?2m zZPSXD(7;GoMBKD@E$x_msh&<4_lW8gdCYW0Yfig*I zub1hP25d|CL{)&$eM`sMrdn{o9-OvhNg~`1dqw(lEs8G8CC=;RuwVR?i#y+SE7g!F zfs`Pk+Je=uTx1`SlbntW*DMz9;wM^&V*)WUO)hZCIw>h)wx`Un+*^PiH>_$kp2P?S z+9i7=AAK{i6cb;-ML7*lwGqb(IF;=+ffDb1u_0FUSZl_K^-NYwTwQrD+qTNXFfvW% zssXgH4SA(<4HSq$BHkd5XsLg02fqV9L-!ddu*0K@l1e-040xa_FCyDIodPrx61eEt z6qr(pP|QDrpZhT2nFg2!Eu4NY^d`zR9fKjD8)vdv8+qRe#LEdjoJ{?HOzYz)>JO-m~$|RyfK*(8& z8M;XWQ5PVk(SsEVMJkdmYBgbWV@DW}HP&Qc^iiFW43W@-#@TWMstz8t-FDe-LwJrV zi>@(|ig-ru(POv=QIoyk3u3Sj?V1VVCLx!A{JWA6f${oIDN3{w8+i7FH;2 zwpCcT1#1VWTnY!v3N}ys%{JhtuH0p9Va8*ct4YsV-l5VV66Mp;w&_LTZ|{O(6ATJ= zopS{ud;B=}=H@taMsHi9j-xQhs^)L12+MkW(5W53_G~9QaVm|o)PkO#@cGn`Rl=)? zWjyAr*d18;gJY`QywtwUS+t5Nvh2Z+J{m}#V4)4;pSm)@s}0#=7RHxri)?4%T+ory zh(JhEqt8^$Bp!s3G4r#@FuF3V2@OI>j8-eUgZi|?_2~>%Q(9o0nSe>5b0R|bKxR!o z*n+Z8o~eY9`5?WgKIp$Vn54>jYF+0iA$D=txuXYKW))Mr=Q6WcHZLoxl~V)83gDSz zYYgF%{*pSmvjy!}0sv=7VREtHp&u#doOr?!n_P$1-#PP0* z*C=Nt)|G#Tx13g+devX~lQXu}Fy32mOL&6~tz$=%CbY z;IA!IiRt#ZMNBho0x?G)PHa;vXG>TT$m4_b# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e64356b538c001423b6aedefcf1ee66cd17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23188 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 diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472c..0000000 --- a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074813a27d0a7a249047832988d5bf0fe756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22248 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 diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f445929ffb03b50e98c2a2f7d831a0cb1b276a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20535 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 Z%0#`NexefPFV?Xj51H#Y#AC7WXn+Jg($4?@ diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e3..0000000 --- a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e6cc061ff17fd2903075cbde12715512b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23400 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
    - -

    Global

    - - - - - - -
    - -
    - -

    - - -
    - -
    -
    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - -
    - - - - - - - - - - - - - - -

    Members

    - - - -

    (private) _debugElement :object

    - - - - -
    -

    The debug DOM object

    -
    - - - -
    Type:
    -
      -
    • - -object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _isZooming :boolean

    - - - - -
    -

    Flag to know if a zoom action is occuring on map

    -
    - - - -
    Type:
    -
      -
    • - -boolean - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _marks :object

    - - - - -
    -

    The stored marks for spots, stores and bars

    -
    - - - -
    Type:
    -
      -
    • - -object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _newMarker :object

    - - - - -
    -

    The temporary marker for new marks only

    -
    - - - -
    Type:
    -
      -
    • - -object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _user :object

    - - - - -
    -

    The user object holds everything useful to ensure a proper session

    -
    - - - -
    Type:
    -
      -
    • - -object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private) _watchId :number

    - - - - -
    -

    ID for geolocation watch callback

    -
    - - - -
    Type:
    -
      -
    • - -number - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - -
    - -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.7 on Fri Jan 14 2022 11:03:18 GMT+0100 (GMT+01:00) -
    - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/index.html b/front/doc/beercrackerz/0.0.1/index.html deleted file mode 100644 index c5b903e..0000000 --- a/front/doc/beercrackerz/0.0.1/index.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - JSDoc: Home - - - - - - - - - - -
    - -

    Home

    - - - - - - - - -

    beercrackerz 0.0.1

    - - - - - - - - - - - - - - - -
    -

    BeerCrackerz

    -

    The website for beer lover, to share the best spot to crack a beer, or to easily refill this beverage of the gods!

    -

    https://github.com/pointhi/leaflet-color-markers

    -

    https://leafletjs.com/

    -

    https://www.svgrepo.com/svg/287438/info

    -

    https://github.com/Leaflet/Leaflet.markercluster

    -
    - - - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.10 on Fri Feb 11 2022 16:38:03 GMT+0100 (GMT+01:00) -
    - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/js_Utils.js.html b/front/doc/beercrackerz/0.0.1/js_Utils.js.html deleted file mode 100644 index a8e8926..0000000 --- a/front/doc/beercrackerz/0.0.1/js_Utils.js.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - JSDoc: Source: js/Utils.js - - - - - - - - - - -
    - -

    Source: js/Utils.js

    - - - - - - -
    -
    -
    class Utils {
    -
    -
    -  constructor() { /* Not meant to be instantiated, all methods should be static */ }
    -
    -
    -  static fetchTemplate(url) {
    -    return new Promise((resolve, reject) => {
    -			fetch(url).then(data => {
    -        data.text().then(html => {
    -          resolve(document.createRange().createContextualFragment(html));
    -        }).catch(reject);
    -			}).catch(reject);
    -		});
    -  }
    -
    -
    -  static fetchFile(url) {
    -    return new Promise((resolve, reject) => {
    -			fetch(url).then(data => {
    -        data.text().then(string => {
    -          resolve(string);
    -        }).catch(reject);
    -			}).catch(reject);
    -		});    
    -  }
    -
    -
    -  static stripDom(html){
    -    let doc = new DOMParser().parseFromString(html, 'text/html');
    -    return doc.body.textContent || '';
    -  }
    -
    -
    -  static replaceString(element, string, value) {
    -    element.innerHTML = element.innerHTML.replace(string, value);
    -  }
    -
    -
    -  static getDistanceBetweenCoords(from, to) {
    -    // return distance in meters
    -    var lon1 = (from[1] * Math.PI) / 180,
    -      lat1 = (from[0] * Math.PI) / 180,
    -      lon2 = (to[1] * Math.PI) / 180,
    -      lat2 = (to[0] * Math.PI) / 180;
    -
    -    var deltaLat = lat2 - lat1;
    -    var deltaLon = lon2 - lon1;
    -
    -    var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);
    -    var c = 2 * Math.asin(Math.sqrt(a));
    -    var EARTH_RADIUS = 6371;
    -    return c * EARTH_RADIUS * 1000;
    -  }
    -
    -
    -  /** @method
    -   * @name precisionRound
    -   * @public
    -   * @memberof Utils
    -   * @author Arthur Beaulieu
    -   * @since September 2018
    -   * @description Do a Math.round with a given precision (ie amount of integers after the coma)
    -   * @param {nunmber} value - The value to precisely round
    -   * @param {number} precision - The number of integers after the coma
    -   * @return {number} - The rounded value */
    -  static precisionRound(value, precision) {
    -    const multiplier = Math.pow(10, precision || 0);
    -    return Math.round(value * multiplier) / multiplier;
    -  }
    -
    -
    -  static initDebugInterface() {
    -    const lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);
    -    const debugContainer = document.createElement('DIV');
    -    const userLat = document.createElement('P');
    -    const userLng = document.createElement('P');
    -    const updatesAmount = document.createElement('P');
    -    const userAccuracy = document.createElement('P');
    -    const highAccuracy = document.createElement('P');
    -    const maxAge = document.createElement('P');
    -    const posTimeout = document.createElement('P');
    -    const zoomLevel = document.createElement('P');
    -    const marks = document.createElement('P');
    -    debugContainer.classList.add('debug-container');
    -    userLat.classList.add('debug-user-lat');
    -    userLng.classList.add('debug-user-lng');
    -    updatesAmount.classList.add('debug-updates-amount');
    -    userAccuracy.classList.add('debug-user-accuracy');
    -    highAccuracy.classList.add('debug-high-accuracy');
    -    maxAge.classList.add('debug-pos-max-age');
    -    posTimeout.classList.add('debug-pos-timeout');
    -    zoomLevel.classList.add('debug-zoom-level');
    -    marks.classList.add('debug-marks-amount');
    -    userLat.innerHTML = `<b>${lang('lat')}</b> : -`;
    -    userLng.innerHTML = `<b>${lang('lng')}</b> : -`;
    -    updatesAmount.innerHTML = `<b>${lang('updates')}</b> : 0`;
    -    userAccuracy.innerHTML = `<b>${lang('accuracy')}</b> : -`;
    -    highAccuracy.innerHTML = `<b>${lang('highAccuracy')}</b> : -`;
    -    maxAge.innerHTML = `<b>${lang('posAge')}</b> : -`;
    -    posTimeout.innerHTML = `<b>${lang('posTimeout')}</b> : -`;
    -    zoomLevel.innerHTML = `<b>${lang('zoom')}</b> : -`;
    -    marks.innerHTML = `<b>${lang('marks')}</b> : -`;
    -    debugContainer.appendChild(userLat);
    -    debugContainer.appendChild(userLng);
    -    debugContainer.appendChild(updatesAmount);
    -    debugContainer.appendChild(userAccuracy);
    -    debugContainer.appendChild(highAccuracy);
    -    debugContainer.appendChild(maxAge);
    -    debugContainer.appendChild(posTimeout);
    -    debugContainer.appendChild(zoomLevel);
    -    debugContainer.appendChild(marks);
    -    return debugContainer;
    -  }
    -
    -
    -  static updateDebugInterface(element, user, options) {
    -    if (window.DEBUG === true) {
    -      const bc = window.BeerCrackerz;
    -      const lang = bc.nls.debug.bind(bc.nls);
    -      const updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;
    -      const marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;
    -      element.querySelector('.debug-user-lat').innerHTML = `
    -        <b>${lang('lat')}</b> : ${user.lat}
    -      `;
    -      element.querySelector('.debug-user-lng').innerHTML = `
    -        <b>${lang('lng')}</b> : ${user.lng}
    -      `;
    -      element.querySelector('.debug-updates-amount').innerHTML = `
    -        <b>${lang('updates')}</b> : ${updates}
    -      `;
    -      element.querySelector('.debug-user-accuracy').innerHTML = `
    -        <b>${lang('accuracy')}</b> : ${Utils.precisionRound(user.accuracy, 2)}m
    -      `;
    -      element.querySelector('.debug-high-accuracy').innerHTML = `
    -        <b>${lang('highAccuracy')}</b> : ${options.enableHighAccuracy === true ? lang('enabled') : lang('disabled')}
    -      `;
    -      element.querySelector('.debug-pos-max-age').innerHTML = `
    -        <b>${lang('posAge')}</b> : ${options.maximumAge / 1000}s
    -      `;
    -      element.querySelector('.debug-pos-timeout').innerHTML = `
    -        <b>${lang('posTimeout')}</b> : ${options.timeout / 1000}s
    -      `;
    -      element.querySelector('.debug-zoom-level').innerHTML = `
    -        <b>${lang('zoom')}</b> : ${bc.map.getZoom()}
    -      `;
    -      element.querySelector('.debug-marks-amount').innerHTML = `
    -        <b>${lang('marks')}</b> : ${marks}
    -      `;
    -    }
    -  }
    -
    -
    -  static getPreference(pref) {
    -    return localStorage.getItem(pref) || null;
    -  }
    -
    -
    -  static setPreference(pref, value) {
    -    localStorage.setItem(pref, value);
    -  }
    -
    -
    -  static get RANGE_COLOR() {
    -    return '#ffd87d';
    -  }
    -
    -
    -  static get USER_COLOR() {
    -    return '#63fff5';
    -  }
    -
    -
    -  static get SPOT_COLOR() {
    -    return '#26ad23';
    -  }
    -
    -
    -  static get STORE_COLOR() {
    -    return '#247dc9';
    -  }
    -
    -
    -  static get BAR_COLOR() {
    -    return '#ca2a3d';
    -  }
    -
    -
    -  static get CIRCLE_RADIUS() {
    -    return 100;
    -  }
    -
    -
    -  static get NEW_MARKER_RANGE() {
    -    return 200;
    -  }
    -
    -
    -  static get MAP_BOUNDS() {
    -    return window.L.latLngBounds(
    -      window.L.latLng(-89.98155760646617, -180),
    -      window.L.latLng(89.99346179538875, 180)
    -    );
    -  }
    -
    -
    -  static get HIGH_ACCURACY() {
    -    return {
    -      enableHighAccuracy: true, // More consuption, better position
    -      maximumAge: 1000, // A position will last 1s maximum
    -      timeout: 900, // A position is updated in 0.9s maximum
    -    };
    -  }
    -
    -
    -  static get OPTIMIZED_ACCURACY() {
    -    return {
    -      enableHighAccuracy: false, // Less consuption
    -      maximumAge: 30000, // A position will last 30s maximum
    -      timeout: 29000 // A position is updated in 29s maximum
    -    };
    -  }
    -
    -
    -  static get SUPPORTED_LANGUAGE() {
    -    return ['en', 'fr', 'es'];
    -  }
    -
    -}
    -
    -
    -export default Utils;
    -
    -
    -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.10 on Thu Feb 10 2022 17:00:51 GMT+0100 (GMT+01:00) -
    - - - - - diff --git a/front/doc/beercrackerz/0.0.1/js_utils_Utils.js.html b/front/doc/beercrackerz/0.0.1/js_utils_Utils.js.html deleted file mode 100644 index 28c676f..0000000 --- a/front/doc/beercrackerz/0.0.1/js_utils_Utils.js.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - JSDoc: Source: js/utils/Utils.js - - - - - - - - - - -
    - -

    Source: js/utils/Utils.js

    - - - - - - -
    -
    -
    class Utils {
    -
    -
    -  constructor() { /* Not meant to be instantiated, all methods should be static */ }
    -
    -
    -  static fetchTemplate(url) {
    -    return new Promise((resolve, reject) => {
    -			fetch(url).then(data => {
    -        data.text().then(html => {
    -          resolve(document.createRange().createContextualFragment(html));
    -        }).catch(reject);
    -			}).catch(reject);
    -		});
    -  }
    -
    -
    -  static fetchFile(url) {
    -    return new Promise((resolve, reject) => {
    -			fetch(url).then(data => {
    -        data.text().then(string => {
    -          resolve(string);
    -        }).catch(reject);
    -			}).catch(reject);
    -		});    
    -  }
    -
    -
    -  static stripDom(html){
    -    let doc = new DOMParser().parseFromString(html, 'text/html');
    -    return doc.body.textContent || '';
    -  }
    -
    -
    -  static replaceString(element, string, value) {
    -    element.innerHTML = element.innerHTML.replace(string, value);
    -  }
    -
    -
    -  static getDistanceBetweenCoords(from, to) {
    -    // return distance in meters
    -    var lon1 = (from[1] * Math.PI) / 180,
    -      lat1 = (from[0] * Math.PI) / 180,
    -      lon2 = (to[1] * Math.PI) / 180,
    -      lat2 = (to[0] * Math.PI) / 180;
    -
    -    var deltaLat = lat2 - lat1;
    -    var deltaLon = lon2 - lon1;
    -
    -    var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);
    -    var c = 2 * Math.asin(Math.sqrt(a));
    -    var EARTH_RADIUS = 6371;
    -    return c * EARTH_RADIUS * 1000;
    -  }
    -
    -
    -  /** @method
    -   * @name precisionRound
    -   * @public
    -   * @memberof Utils
    -   * @author Arthur Beaulieu
    -   * @since September 2018
    -   * @description Do a Math.round with a given precision (ie amount of integers after the coma)
    -   * @param {nunmber} value - The value to precisely round
    -   * @param {number} precision - The number of integers after the coma
    -   * @return {number} - The rounded value */
    -  static precisionRound(value, precision) {
    -    const multiplier = Math.pow(10, precision || 0);
    -    return Math.round(value * multiplier) / multiplier;
    -  }
    -
    -
    -  static initDebugInterface() {
    -    const lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);
    -    const debugContainer = document.createElement('DIV');
    -    const userLat = document.createElement('P');
    -    const userLng = document.createElement('P');
    -    const updatesAmount = document.createElement('P');
    -    const userAccuracy = document.createElement('P');
    -    const highAccuracy = document.createElement('P');
    -    const maxAge = document.createElement('P');
    -    const posTimeout = document.createElement('P');
    -    const zoomLevel = document.createElement('P');
    -    const marks = document.createElement('P');
    -    debugContainer.classList.add('debug-container');
    -    userLat.classList.add('debug-user-lat');
    -    userLng.classList.add('debug-user-lng');
    -    updatesAmount.classList.add('debug-updates-amount');
    -    userAccuracy.classList.add('debug-user-accuracy');
    -    highAccuracy.classList.add('debug-high-accuracy');
    -    maxAge.classList.add('debug-pos-max-age');
    -    posTimeout.classList.add('debug-pos-timeout');
    -    zoomLevel.classList.add('debug-zoom-level');
    -    marks.classList.add('debug-marks-amount');
    -    userLat.innerHTML = `<b>${lang('lat')}</b> : -`;
    -    userLng.innerHTML = `<b>${lang('lng')}</b> : -`;
    -    updatesAmount.innerHTML = `<b>${lang('updates')}</b> : 0`;
    -    userAccuracy.innerHTML = `<b>${lang('accuracy')}</b> : -`;
    -    highAccuracy.innerHTML = `<b>${lang('highAccuracy')}</b> : -`;
    -    maxAge.innerHTML = `<b>${lang('posAge')}</b> : -`;
    -    posTimeout.innerHTML = `<b>${lang('posTimeout')}</b> : -`;
    -    zoomLevel.innerHTML = `<b>${lang('zoom')}</b> : -`;
    -    marks.innerHTML = `<b>${lang('marks')}</b> : -`;
    -    debugContainer.appendChild(userLat);
    -    debugContainer.appendChild(userLng);
    -    debugContainer.appendChild(updatesAmount);
    -    debugContainer.appendChild(userAccuracy);
    -    debugContainer.appendChild(highAccuracy);
    -    debugContainer.appendChild(maxAge);
    -    debugContainer.appendChild(posTimeout);
    -    debugContainer.appendChild(zoomLevel);
    -    debugContainer.appendChild(marks);
    -    return debugContainer;
    -  }
    -
    -
    -  static updateDebugInterface(element, user, options) {
    -    if (window.DEBUG === true) {
    -      const bc = window.BeerCrackerz;
    -      const lang = bc.nls.debug.bind(bc.nls);
    -      const updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;
    -      const marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;
    -      element.querySelector('.debug-user-lat').innerHTML = `
    -        <b>${lang('lat')}</b> : ${user.lat}
    -      `;
    -      element.querySelector('.debug-user-lng').innerHTML = `
    -        <b>${lang('lng')}</b> : ${user.lng}
    -      `;
    -      element.querySelector('.debug-updates-amount').innerHTML = `
    -        <b>${lang('updates')}</b> : ${updates}
    -      `;
    -      element.querySelector('.debug-user-accuracy').innerHTML = `
    -        <b>${lang('accuracy')}</b> : ${Utils.precisionRound(user.accuracy, 2)}m
    -      `;
    -      element.querySelector('.debug-high-accuracy').innerHTML = `
    -        <b>${lang('highAccuracy')}</b> : ${options.enableHighAccuracy === true ? lang('enabled') : lang('disabled')}
    -      `;
    -      element.querySelector('.debug-pos-max-age').innerHTML = `
    -        <b>${lang('posAge')}</b> : ${options.maximumAge / 1000}s
    -      `;
    -      element.querySelector('.debug-pos-timeout').innerHTML = `
    -        <b>${lang('posTimeout')}</b> : ${options.timeout / 1000}s
    -      `;
    -      element.querySelector('.debug-zoom-level').innerHTML = `
    -        <b>${lang('zoom')}</b> : ${bc.map.getZoom()}
    -      `;
    -      element.querySelector('.debug-marks-amount').innerHTML = `
    -        <b>${lang('marks')}</b> : ${marks}
    -      `;
    -    }
    -  }
    -
    -
    -  static getPreference(pref) {
    -    return localStorage.getItem(pref) || null;
    -  }
    -
    -
    -  static setPreference(pref, value) {
    -    localStorage.setItem(pref, value);
    -  }
    -
    -
    -  static get RANGE_COLOR() {
    -    return '#ffd87d';
    -  }
    -
    -
    -  static get USER_COLOR() {
    -    return '#63fff5';
    -  }
    -
    -
    -  static get SPOT_COLOR() {
    -    return '#26ad23';
    -  }
    -
    -
    -  static get STORE_COLOR() {
    -    return '#247dc9';
    -  }
    -
    -
    -  static get BAR_COLOR() {
    -    return '#ca2a3d';
    -  }
    -
    -
    -  static get CIRCLE_RADIUS() {
    -    return 100;
    -  }
    -
    -
    -  static get NEW_MARKER_RANGE() {
    -    return 200;
    -  }
    -
    -
    -  static get MAP_BOUNDS() {
    -    return window.L.latLngBounds(
    -      window.L.latLng(-89.98155760646617, -180),
    -      window.L.latLng(89.99346179538875, 180)
    -    );
    -  }
    -
    -
    -  static get HIGH_ACCURACY() {
    -    return {
    -      enableHighAccuracy: true, // More consuption, better position
    -      maximumAge: 1000, // A position will last 1s maximum
    -      timeout: 900, // A position is updated in 0.9s maximum
    -    };
    -  }
    -
    -
    -  static get OPTIMIZED_ACCURACY() {
    -    return {
    -      enableHighAccuracy: false, // Less consuption
    -      maximumAge: 30000, // A position will last 30s maximum
    -      timeout: 29000 // A position is updated in 29s maximum
    -    };
    -  }
    -
    -
    -  static get SUPPORTED_LANGUAGE() {
    -    return ['en', 'fr', 'es'];
    -  }
    -
    -  
    -}
    -
    -
    -export default Utils;
    -
    -
    -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.10 on Fri Feb 11 2022 16:38:03 GMT+0100 (GMT+01:00) -
    - - - - - diff --git a/front/doc/beercrackerz/0.0.1/module-BeerCrackerz.html b/front/doc/beercrackerz/0.0.1/module-BeerCrackerz.html deleted file mode 100644 index 3719235..0000000 --- a/front/doc/beercrackerz/0.0.1/module-BeerCrackerz.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - JSDoc: Module: BeerCrackerz - - - - - - - - - - -
    - -

    Module: BeerCrackerz

    - - - - - - -
    - -
    - - - - - -
    - -
    -
    - - -
    -This component handles the whole BeerCrackerz app. It includes the map manipulation, -the geolocation API to update the user position and process any map events that are -relevant to an UX stand point. For more information, please consult the application -description page at https://about.beercrackerz.org/ -
    - - - - - - - - - - - - - - - - - - - -
    - - - - -
    Since:
    -
    • January 2022
    - - - - - - - - - - - - - - - -
    Author:
    -
    -
      -
    • Arthur Beaulieu
    • -
    -
    - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - -
    - - -

    Extends

    - - - - -
      -
    • MapHelper
    • -
    - - - - - - - - - - - - - - - -

    Members

    - - - -

    (private, inner) _map :object

    - - - - -
    -

    The core Leaflet.js map

    -
    - - - -
    Type:
    -
      -
    • - -object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - -

    (private, inner) _user :object

    - - - - -
    -

    The user object holds everything useful to ensure a proper session

    -
    - - - -
    Type:
    -
      -
    • - -object - - -
    • -
    - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - -
    - -
    - - - - -
    - - - -
    - -
    - Documentation generated by JSDoc 3.6.7 on Fri Jan 14 2022 10:42:37 GMT+0100 (GMT+01:00) -
    - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/scripts/linenumber.js b/front/doc/beercrackerz/0.0.1/scripts/linenumber.js deleted file mode 100644 index 4354785..0000000 --- a/front/doc/beercrackerz/0.0.1/scripts/linenumber.js +++ /dev/null @@ -1,25 +0,0 @@ -/*global document */ -(() => { - const source = document.getElementsByClassName('prettyprint source linenums'); - let i = 0; - let lineNumber = 0; - let lineId; - let lines; - let totalLines; - let anchorHash; - - if (source && source[0]) { - anchorHash = document.location.hash.substring(1); - lines = source[0].getElementsByTagName('li'); - totalLines = lines.length; - - for (; i < totalLines; i++) { - lineNumber++; - lineId = `line${lineNumber}`; - lines[i].id = lineId; - if (lineId === anchorHash) { - lines[i].className += ' selected'; - } - } - } -})(); diff --git a/front/doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt b/front/doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt deleted file mode 100644 index d645695..0000000 --- a/front/doc/beercrackerz/0.0.1/scripts/prettify/Apache-License-2.0.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/front/doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js b/front/doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js deleted file mode 100644 index 041e1f5..0000000 --- a/front/doc/beercrackerz/0.0.1/scripts/prettify/lang-css.js +++ /dev/null @@ -1,2 +0,0 @@ -PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n "]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com", -/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]); diff --git a/front/doc/beercrackerz/0.0.1/scripts/prettify/prettify.js b/front/doc/beercrackerz/0.0.1/scripts/prettify/prettify.js deleted file mode 100644 index eef5ad7..0000000 --- a/front/doc/beercrackerz/0.0.1/scripts/prettify/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p th:last-child { border-right: 1px solid #ddd; } - -.ancestors, .attribs { color: #999; } -.ancestors a, .attribs a -{ - color: #999 !important; - text-decoration: none; -} - -.clear -{ - clear: both; -} - -.important -{ - font-weight: bold; - color: #950B02; -} - -.yes-def { - text-indent: -1000px; -} - -.type-signature { - color: #aaa; -} - -.name, .signature { - font-family: Consolas, Monaco, 'Andale Mono', monospace; -} - -.details { margin-top: 14px; border-left: 2px solid #DDD; } -.details dt { width: 120px; float: left; padding-left: 10px; padding-top: 6px; } -.details dd { margin-left: 70px; } -.details ul { margin: 0; } -.details ul { list-style-type: none; } -.details li { margin-left: 30px; padding-top: 6px; } -.details pre.prettyprint { margin: 0 } -.details .object-value { padding-top: 0; } - -.description { - margin-bottom: 1em; - margin-top: 1em; -} - -.code-caption -{ - font-style: italic; - font-size: 107%; - margin: 0; -} - -.source -{ - border: 1px solid #ddd; - width: 80%; - overflow: auto; -} - -.prettyprint.source { - width: inherit; -} - -.source code -{ - font-size: 100%; - line-height: 18px; - display: block; - padding: 4px 12px; - margin: 0; - background-color: #fff; - color: #4D4E53; -} - -.prettyprint code span.line -{ - display: inline-block; -} - -.prettyprint.linenums -{ - padding-left: 70px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.prettyprint.linenums ol -{ - padding-left: 0; -} - -.prettyprint.linenums li -{ - border-left: 3px #ddd solid; -} - -.prettyprint.linenums li.selected, -.prettyprint.linenums li.selected * -{ - background-color: lightyellow; -} - -.prettyprint.linenums li * -{ - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.params .name, .props .name, .name code { - color: #4D4E53; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 100%; -} - -.params td.description > p:first-child, -.props td.description > p:first-child -{ - margin-top: 0; - padding-top: 0; -} - -.params td.description > p:last-child, -.props td.description > p:last-child -{ - margin-bottom: 0; - padding-bottom: 0; -} - -.disabled { - color: #454545; -} diff --git a/front/doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css b/front/doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css deleted file mode 100644 index 5a2526e..0000000 --- a/front/doc/beercrackerz/0.0.1/styles/prettify-jsdoc.css +++ /dev/null @@ -1,111 +0,0 @@ -/* JSDoc prettify.js theme */ - -/* plain text */ -.pln { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* string content */ -.str { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a keyword */ -.kwd { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a comment */ -.com { - font-weight: normal; - font-style: italic; -} - -/* a type name */ -.typ { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a literal value */ -.lit { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* punctuation */ -.pun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp open bracket */ -.opn { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* lisp close bracket */ -.clo { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a markup tag name */ -.tag { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute name */ -.atn { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a markup attribute value */ -.atv { - color: #006400; - font-weight: normal; - font-style: normal; -} - -/* a declaration */ -.dec { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* a variable name */ -.var { - color: #000000; - font-weight: normal; - font-style: normal; -} - -/* a function name */ -.fun { - color: #000000; - font-weight: bold; - font-style: normal; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; -} diff --git a/front/doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css b/front/doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css deleted file mode 100644 index b6f92a7..0000000 --- a/front/doc/beercrackerz/0.0.1/styles/prettify-tomorrow.css +++ /dev/null @@ -1,132 +0,0 @@ -/* Tomorrow Theme */ -/* Original theme - https://github.com/chriskempson/tomorrow-theme */ -/* Pretty printing styles. Used with prettify.js. */ -/* SPAN elements with the classes below are added by prettyprint. */ -/* plain text */ -.pln { - color: #4d4d4c; } - -@media screen { - /* string content */ - .str { - color: #718c00; } - - /* a keyword */ - .kwd { - color: #8959a8; } - - /* a comment */ - .com { - color: #8e908c; } - - /* a type name */ - .typ { - color: #4271ae; } - - /* a literal value */ - .lit { - color: #f5871f; } - - /* punctuation */ - .pun { - color: #4d4d4c; } - - /* lisp open bracket */ - .opn { - color: #4d4d4c; } - - /* lisp close bracket */ - .clo { - color: #4d4d4c; } - - /* a markup tag name */ - .tag { - color: #c82829; } - - /* a markup attribute name */ - .atn { - color: #f5871f; } - - /* a markup attribute value */ - .atv { - color: #3e999f; } - - /* a declaration */ - .dec { - color: #f5871f; } - - /* a variable name */ - .var { - color: #c82829; } - - /* a function name */ - .fun { - color: #4271ae; } } -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { - color: #060; } - - .kwd { - color: #006; - font-weight: bold; } - - .com { - color: #600; - font-style: italic; } - - .typ { - color: #404; - font-weight: bold; } - - .lit { - color: #044; } - - .pun, .opn, .clo { - color: #440; } - - .tag { - color: #006; - font-weight: bold; } - - .atn { - color: #404; } - - .atv { - color: #060; } } -/* Style */ -/* -pre.prettyprint { - background: white; - font-family: Consolas, Monaco, 'Andale Mono', monospace; - font-size: 12px; - line-height: 1.5; - border: 1px solid #ccc; - padding: 10px; } -*/ - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin-top: 0; - margin-bottom: 0; } - -/* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L4, -li.L5, -li.L6, -li.L7, -li.L8, -li.L9 { - /* */ } - -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { - /* */ } diff --git a/front/doc/jsDoc.json b/front/doc/jsDoc.json deleted file mode 100644 index 99e16ae..0000000 --- a/front/doc/jsDoc.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "plugins": ["plugins/markdown"], - "recurseDepth": 10, - "source": { - "include": ["./"], - "exclude": ["./assets/dist/", "./doc/", "./node_modules/", "./webpack/"], - "includePattern": ".+\\.js(doc|x)?$", - "excludePattern": "(^|\\/|\\\\)_" - }, - "sourceType": "module", - "tags": { - "allowUnknownTags": true, - "dictionaries": ["jsdoc", "closure"] - }, - "templates": { - "name": "BeerCrackerz", - "footerText": "BeerCrackerz - Version 0.0.2", - "cleverLinks": false, - "monospaceLinks": false - }, - "opts": { - "destination": "doc/", - "readme": "README.md", - "package": "package.json", - "access": "all", - "recurse": true, - "verbose": true, - "private": true - } -} diff --git a/front/index.html b/front/index.html deleted file mode 100644 index 005011d..0000000 --- a/front/index.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - Beer Crackerz - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    -
    - -
    -
    -

    +

    -
    -
    -
    -

    -
    -
    - - - - - - - - - diff --git a/front/src/BeerCrackerz.js b/front/src/BeerCrackerz.js index 2e2805f..66937fc 100644 --- a/front/src/BeerCrackerz.js +++ b/front/src/BeerCrackerz.js @@ -443,7 +443,7 @@ class BeerCrackerz extends MapHelper { return window.L.divIcon({ className: 'cluster-icon-wrapper', html: ` - + ${cluster.getChildCount()} ` }); @@ -454,7 +454,7 @@ class BeerCrackerz extends MapHelper { return window.L.divIcon({ className: 'cluster-icon-wrapper', html: ` - + ${cluster.getChildCount()} ` }); @@ -465,7 +465,7 @@ class BeerCrackerz extends MapHelper { return window.L.divIcon({ className: 'cluster-icon-wrapper', html: ` - + ${cluster.getChildCount()} ` }); @@ -702,7 +702,7 @@ class BeerCrackerz extends MapHelper { editMarkModal(options) { - Utils.fetchTemplate(`/assets/html/modal/edit${options.type}.html`).then(dom => { + Utils.fetchTemplate(`/static/html/modal/edit${options.type}.html`).then(dom => { const name = dom.querySelector(`#${options.type}-name`); const description = dom.querySelector(`#${options.type}-desc`); const submit = dom.querySelector(`#${options.type}-submit`); @@ -710,12 +710,12 @@ class BeerCrackerz extends MapHelper { const rate = dom.querySelector(`#${options.type}-rating`); const rating = new Rating(rate, options.rate); // Update nls for template - Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal(`${options.type}EditTitle`)); - Utils.replaceString(dom.querySelector(`#nls-${options.type}-name`), `{{${options.type.toUpperCase()}_NAME}}`, this.nls[options.type]('nameLabel')); - Utils.replaceString(dom.querySelector(`#nls-${options.type}-desc`), `{{${options.type.toUpperCase()}_DESC}}`, this.nls[options.type]('descLabel')); - Utils.replaceString(dom.querySelector(`#nls-${options.type}-rate`), `{{${options.type.toUpperCase()}_RATE}}`, this.nls[options.type]('rateLabel')); - Utils.replaceString(submit, `{{${options.type.toUpperCase()}_SUBMIT}}`, this.nls.nav('add')); - Utils.replaceString(cancel, `{{${options.type.toUpperCase()}_CANCEL}}`, this.nls.nav('cancel')); + Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{MODAL_TITLE}`, this.nls.modal(`${options.type}EditTitle`)); + Utils.replaceString(dom.querySelector(`#nls-${options.type}-name`), `{${options.type.toUpperCase()}_NAME}`, this.nls[options.type]('nameLabel')); + Utils.replaceString(dom.querySelector(`#nls-${options.type}-desc`), `{${options.type.toUpperCase()}_DESC}`, this.nls[options.type]('descLabel')); + Utils.replaceString(dom.querySelector(`#nls-${options.type}-rate`), `{${options.type.toUpperCase()}_RATE}`, this.nls[options.type]('rateLabel')); + Utils.replaceString(submit, `{${options.type.toUpperCase()}_SUBMIT}`, this.nls.nav('add')); + Utils.replaceString(cancel, `{${options.type.toUpperCase()}_CANCEL}`, this.nls.nav('cancel')); name.value = options.name; description.value = options.description; submit.addEventListener('click', () => { @@ -768,12 +768,12 @@ class BeerCrackerz extends MapHelper { * @param {Function} cb The function to callback with true or false depending on user's choice **/ deleteMarkModal(cb) { - Utils.fetchTemplate('/assets/html/modal/deletemark.html').then(dom => { + Utils.fetchTemplate('/static/html/modal/deletemark.html').then(dom => { // Update nls for template - Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('deleteMarkTitle')); - Utils.replaceString(dom.querySelector(`#nls-modal-desc`), `{{MODAL_DESC}}`, this.nls.modal('deleteMarkDesc')); - Utils.replaceString(dom.querySelector(`#cancel-close`), `{{MODAL_CANCEL}}`, this.nls.nav('cancel')); - Utils.replaceString(dom.querySelector(`#delete-close`), `{{MODAL_DELETE}}`, this.nls.nav('delete')); + Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{MODAL_TITLE}`, this.nls.modal('deleteMarkTitle')); + Utils.replaceString(dom.querySelector(`#nls-modal-desc`), `{MODAL_DESC}`, this.nls.modal('deleteMarkDesc')); + Utils.replaceString(dom.querySelector(`#cancel-close`), `{MODAL_CANCEL}`, this.nls.nav('cancel')); + Utils.replaceString(dom.querySelector(`#delete-close`), `{MODAL_DELETE}`, this.nls.nav('delete')); document.getElementById('overlay').appendChild(dom); document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons @@ -804,12 +804,12 @@ class BeerCrackerz extends MapHelper { * **/ userProfileModal() { - Utils.fetchTemplate('/assets/html/modal/user.html').then(dom => { + Utils.fetchTemplate('/static/html/modal/user.html').then(dom => { // Update nls for template - Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('userTitle')); - Utils.replaceString(dom.querySelector(`#nls-user-modal-accuracy`), `{{ACCURACY_USER_MODAL}}`, this.nls.modal('userAccuracyPref')); - Utils.replaceString(dom.querySelector(`#nls-user-modal-debug`), `{{DEBUG_USER_MODAL}}`, this.nls.modal('userDebugPref')); - Utils.replaceString(dom.querySelector(`#nls-about-desc`), `{{BEERCRACKERZ_DESC}}`, this.nls.modal('aboutDesc')); + Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{MODAL_TITLE}`, this.nls.modal('userTitle')); + Utils.replaceString(dom.querySelector(`#nls-user-modal-accuracy`), `{ACCURACY_USER_MODAL}`, this.nls.modal('userAccuracyPref')); + Utils.replaceString(dom.querySelector(`#nls-user-modal-debug`), `{DEBUG_USER_MODAL}`, this.nls.modal('userDebugPref')); + Utils.replaceString(dom.querySelector(`#nls-about-desc`), `{BEERCRACKERZ_DESC}`, this.nls.modal('aboutDesc')); document.getElementById('overlay').appendChild(dom); document.getElementById('overlay').style.display = 'flex'; @@ -844,15 +844,15 @@ class BeerCrackerz extends MapHelper { * **/ hidShowModal() { - Utils.fetchTemplate('/assets/html/modal/hideshow.html').then(dom => { + Utils.fetchTemplate('/static/html/modal/hideshow.html').then(dom => { // Update template nls - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-title`), `{{MODAL_TITLE}}`, this.nls.modal('hideShowTitle')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-labels`), `{{LABELS_HIDESHOW_MODAL}}`, this.nls.modal('hideShowLabels')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-circles`), `{{CIRCLES_HIDESHOW_MODAL}}`, this.nls.modal('hideShowCircles')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-spots`), `{{SPOTS_HIDESHOW_MODAL}}`, this.nls.modal('hideShowSpots')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-stores`), `{{STORES_HIDESHOW_MODAL}}`, this.nls.modal('hideShowStores')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-bars`), `{{BARS_HIDESHOW_MODAL}}`, this.nls.modal('hideShowBars')); - Utils.replaceString(dom.querySelector(`#modal-close-button`), `{{MODAL_CLOSE}}`, this.nls.nav('close')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-title`), `{MODAL_TITLE}`, this.nls.modal('hideShowTitle')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-labels`), `{LABELS_HIDESHOW_MODAL}`, this.nls.modal('hideShowLabels')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-circles`), `{CIRCLES_HIDESHOW_MODAL}`, this.nls.modal('hideShowCircles')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-spots`), `{SPOTS_HIDESHOW_MODAL}`, this.nls.modal('hideShowSpots')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-stores`), `{STORES_HIDESHOW_MODAL}`, this.nls.modal('hideShowStores')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-bars`), `{BARS_HIDESHOW_MODAL}`, this.nls.modal('hideShowBars')); + Utils.replaceString(dom.querySelector(`#modal-close-button`), `{MODAL_CLOSE}`, this.nls.nav('close')); document.getElementById('overlay').appendChild(dom); document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index fd02965..0c5eb84 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -12,8 +12,6 @@ class BeerCrackerzAuth extends MapHelper { constructor() { super(); - - console.log('CACACACACACACACA') /** * The user object holds everything useful to ensure a proper session * @type {Object} @@ -81,14 +79,14 @@ class BeerCrackerzAuth extends MapHelper { _handleLoginAside() { // Update page nls according to browser language document.title = this.nls.login('headTitle'); - Utils.replaceString(document.body, '{{LOGIN_SUBTITLE}}', this.nls.login('subtitle')); - Utils.replaceString(document.body, '{{LOGIN_HIDDEN_ERROR}}', this.nls.login('hiddenError')); - Utils.replaceString(document.body, '{{LOGIN_USERNAME_LABEL}}', this.nls.login('username')); - Utils.replaceString(document.body, '{{LOGIN_USERNAME_PASSWORD}}', this.nls.login('password')); - Utils.replaceString(document.body, '{{LOGIN_FORGOT_PASSWORD}}', this.nls.login('forgot')); - Utils.replaceString(document.body, '{{LOGIN_BUTTON}}', this.nls.login('login')); - Utils.replaceString(document.body, '{{LOGIN_NOT_REGISTERED}}', this.nls.login('notRegistered')); - Utils.replaceString(document.body, '{{LOGIN_REGISTER}}', this.nls.login('register')); + Utils.replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle')); + Utils.replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError')); + Utils.replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username')); + Utils.replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password')); + Utils.replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot')); + Utils.replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login')); + Utils.replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered')); + Utils.replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register')); const error = document.getElementById('login-error'); const username = document.getElementById('username'); @@ -146,15 +144,15 @@ class BeerCrackerzAuth extends MapHelper { _handleRegisterAside() { // Update page nls according to browser language document.title = this.nls.register('headTitle'); - Utils.replaceString(document.body, '{{REGISTER_SUBTITLE}}', this.nls.register('subtitle')); - Utils.replaceString(document.body, '{{REGISTER_HIDDEN_ERROR}}', this.nls.register('hiddenError')); - Utils.replaceString(document.body, '{{REGISTER_USERNAME_LABEL}}', this.nls.register('username')); - Utils.replaceString(document.body, '{{REGISTER_MAIL_LABEL}}', this.nls.register('mail')); - Utils.replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_1}}', this.nls.register('password1')); - Utils.replaceString(document.body, '{{REGISTER_USERNAME_PASSWORD_2}}', this.nls.register('password2')); - Utils.replaceString(document.body, '{{REGISTER_BUTTON}}', this.nls.register('register')); - Utils.replaceString(document.body, '{{REGISTER_ALREADY_DONE}}', this.nls.register('notRegistered')); - Utils.replaceString(document.body, '{{REGISTER_LOGIN}}', this.nls.register('login')); + Utils.replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle')); + Utils.replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError')); + Utils.replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username')); + Utils.replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail')); + Utils.replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1')); + Utils.replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2')); + Utils.replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register')); + Utils.replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered')); + Utils.replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login')); const error = document.getElementById('register-error'); const username = document.getElementById('username'); const mail = document.getElementById('mail'); @@ -220,12 +218,12 @@ class BeerCrackerzAuth extends MapHelper { _handleResetPasswordAdise() { // Update page nls according to browser language document.title = this.nls.forgotPassword('headTitle'); - Utils.replaceString(document.body, '{{FORGOT_PASSWORD_SUBTITLE}}', this.nls.forgotPassword('subtitle')); - Utils.replaceString(document.body, '{{FORGOT_PASSWORD_ERROR}}', this.nls.register('hiddenError')); - Utils.replaceString(document.body, '{{FORGOT_PASSWORD_MAIL_LABEL}}', this.nls.forgotPassword('mail')); - Utils.replaceString(document.body, '{{FORGOT_PASSWORD_BUTTON}}', this.nls.forgotPassword('submit')); - Utils.replaceString(document.body, '{{FORGOT_PASSWORD_LOGIN_LABEL}}', this.nls.forgotPassword('loginLabel')); - Utils.replaceString(document.body, '{{FORGOT_PASSWORD_LOGIN}}', this.nls.forgotPassword('login')); + Utils.replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle')); + Utils.replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError')); + Utils.replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail')); + Utils.replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit')); + Utils.replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel')); + Utils.replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login')); const error = document.getElementById('forgot-password-error'); const mail = document.getElementById('mail'); // useful login method for field check and server response check @@ -269,7 +267,7 @@ class BeerCrackerzAuth extends MapHelper { _loadAside(type) { return new Promise((resolve, reject) => { - Utils.fetchTemplate(`/assets/html/aside/${type}.html`).then(dom => { + Utils.fetchTemplate(`/static/html/aside/${type}.html`).then(dom => { document.body.className = ''; // Clear previous css class document.body.classList.add(type); // Update body class with current aside view // We need to get aside at the last moment because of nls that changed HTML content @@ -283,27 +281,21 @@ class BeerCrackerzAuth extends MapHelper { _loadLoginAside() { - this._loadAside('login').then(() => { - this._handleLoginAside(); - }).catch(() => { + this._loadAside('login').then(this._handleLoginAside.bind(this)).catch(() => { console.error('Couldn\'t fetch or build the login aside'); }); } _loadRegisterAside() { - this._loadAside('register').then(() => { - this._handleRegisterAside(); - }).catch(() => { + this._loadAside('register').then(this._handleRegisterAside.bind(this)).catch(() => { console.error('Couldn\'t fetch or build the register aside'); }); } _loadForgotPasswordAside() { - this._loadAside('forgot-password').then(() => { - this._handleResetPasswordAdise(); - }).catch(() => { + this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this)).catch(() => { console.error('Couldn\'t fetch or build the forgot password aside'); }); } @@ -318,7 +310,7 @@ class BeerCrackerzAuth extends MapHelper { requestAnimationFrame(() => { this._map.invalidateSize(); }); setTimeout(() => { document.getElementById('aside-expander').style.left = '-44.8rem'; - document.getElementById('aside-expander-icon').src = '/assets/img/logo/left.svg'; + document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg'; }, 100); } else { this._isAsideExpanded = true; @@ -326,7 +318,7 @@ class BeerCrackerzAuth extends MapHelper { document.getElementById('aside').style.right = '0'; document.getElementById('aside-expander').style.transition = 'none'; document.getElementById('aside-expander').style.left = '0'; - document.getElementById('aside-expander-icon').src = '/assets/img/logo/right.svg'; + document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg'; setTimeout(() => { document.documentElement.style.setProperty('--aside-width', '40rem'); document.getElementById('aside').style.maxWidth = 'var(--aside-width)'; @@ -524,7 +516,7 @@ class BeerCrackerzAuth extends MapHelper { return window.L.divIcon({ className: 'cluster-icon-wrapper', html: ` - + ${cluster.getChildCount()} ` }); @@ -535,7 +527,7 @@ class BeerCrackerzAuth extends MapHelper { return window.L.divIcon({ className: 'cluster-icon-wrapper', html: ` - + ${cluster.getChildCount()} ` }); @@ -546,7 +538,7 @@ class BeerCrackerzAuth extends MapHelper { return window.L.divIcon({ className: 'cluster-icon-wrapper', html: ` - + ${cluster.getChildCount()} ` }); @@ -627,7 +619,6 @@ class BeerCrackerzAuth extends MapHelper { **/ mapClicked() { // Let this empty - console.log('lkjdslm') } diff --git a/front/src/js/MapHelper.js b/front/src/js/MapHelper.js index aa8e9d4..b8580bc 100644 --- a/front/src/js/MapHelper.js +++ b/front/src/js/MapHelper.js @@ -139,7 +139,7 @@ class MapHelper { defineMarkFactory(type, options) { - Utils.fetchTemplate(`/assets/html/modal/new${type}.html`).then(dom => { + Utils.fetchTemplate(`/static/html/modal/new${type}.html`).then(dom => { const name = dom.querySelector(`#${type}-name`); const description = dom.querySelector(`#${type}-desc`); const rating = new Rating(dom.querySelector(`#${type}-rating`)); @@ -206,7 +206,7 @@ class MapHelper { markPopupFactory(options) { return new Promise(resolve => { - Utils.fetchTemplate(`/assets/html/popup/${options.type}.html`).then(dom => { + Utils.fetchTemplate(`/static/html/popup/${options.type}.html`).then(dom => { const element = document.createElement('DIV'); element.appendChild(dom); const user = options.user || this.user.username; diff --git a/front/src/js/utils/LangManager.js b/front/src/js/utils/LangManager.js index 3a5f924..98ac974 100644 --- a/front/src/js/utils/LangManager.js +++ b/front/src/js/utils/LangManager.js @@ -13,7 +13,7 @@ class LangManager { _init() { return new Promise((resolve, reject) => { - Utils.fetchFile(`/assets/nls/${this._lang}.json`).then(lang => { + Utils.fetchFile(`/static/nls/${this._lang}.json`).then(lang => { this._values = JSON.parse(lang); resolve(); }).catch(reject); diff --git a/front/src/js/utils/MarkerEnum.js b/front/src/js/utils/MarkerEnum.js index b6fb12d..1d4c67b 100644 --- a/front/src/js/utils/MarkerEnum.js +++ b/front/src/js/utils/MarkerEnum.js @@ -1,79 +1,79 @@ export default Object.freeze({ blue: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-blue.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-blue.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), gold: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-gold.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-gold.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), red: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-red.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-red.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), green: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-green.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-green.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), orange: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-orange.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-orange.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), yellow: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-yellow.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-yellow.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), violet: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-violet.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-violet.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), grey: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-grey.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-grey.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), black: new window.L.Icon({ - iconUrl: '/assets/img/marker/marker-icon-black.png', - shadowUrl: '/assets/img/marker/marker-shadow.png', + iconUrl: '/static/img/marker/marker-icon-black.png', + shadowUrl: '/static/img/marker/marker-shadow.png', iconSize: [25, 41], iconAnchor: [12, 41], popupAnchor: [1, -34], shadowSize: [41, 41], }), user: new window.L.Icon({ - iconUrl: '/assets/img/marker/user-position.png', - shadowUrl: '/assets/img/marker/user-position-shadow.png', + iconUrl: '/static/img/marker/user-position.png', + shadowUrl: '/static/img/marker/user-position-shadow.png', iconSize: [32, 32], iconAnchor: [16, 16], popupAnchor: [1, -34], diff --git a/front/welcome.html b/front/welcome.html deleted file mode 100644 index d7639c4..0000000 --- a/front/welcome.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - Login | BeerCrackerz - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -

    +

    -
    -
    -
    -

    -
    - - - - - - - - - - diff --git a/static/dist/BeerCrackerz.bundle.css b/static/dist/BeerCrackerz.bundle.css index 1f51ff2..355eee7 100644 --- a/static/dist/BeerCrackerz.bundle.css +++ b/static/dist/BeerCrackerz.bundle.css @@ -1 +1,4 @@ +/*!******************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerz.scss ***! + \******************************************************************************************************************************************************************************************************************/ @-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif;position:relative}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}main.beer-crakerz-map{height:100%;width:100%;z-index:10}main.beer-crakerz-map .new-poi{text-align:center}main.beer-crakerz-map .new-poi p{font-size:1.6rem;font-weight:700}main.beer-crakerz-map .new-poi button{margin:1.2rem 0}main.beer-crakerz-map .marker-tooltip{font-style:italic;text-align:center}nav{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:absolute;right:1rem;top:1rem;width:4.8rem;z-index:20}nav img{border-radius:50%;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;cursor:pointer;width:100%}nav .cmd-bar .cmd-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin:1rem 0;padding:.2rem}nav .cmd-bar .cmd-wrapper:first-child{margin-top:0}nav .cmd-bar .cmd-wrapper img{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-transition:all .2s;transition:all .2s}nav .cmd-bar .cmd-wrapper img:active,nav .cmd-bar .cmd-wrapper img:focus,nav .cmd-bar .cmd-wrapper img:hover{border:1px solid #b9b9b9;border-radius:.5rem;-webkit-filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);padding:.2rem}nav .cmd-bar .cmd-wrapper img[class$=-on]{-webkit-filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%);filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%)}nav .cmd-bar .cmd-wrapper.logo img{padding:.1rem}nav .cmd-bar .cmd-wrapper.logo img:active,nav .cmd-bar .cmd-wrapper.logo img:focus,nav .cmd-bar .cmd-wrapper.logo img:hover{-webkit-filter:inherit;filter:inherit}.notification-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:3rem;justify-content:center;left:calc(50% - 15rem);opacity:0;position:absolute;top:-4rem;-webkit-transition:top .3s,opacity .2s ease-out;transition:top .3s,opacity .2s ease-out;width:30rem;z-index:40}.notification-wrapper.opened{opacity:1;top:1rem}.notification-wrapper .notification-message{font-style:italic;margin:0}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .3s,opacity .2s ease-out;transition:right .3s,opacity .2s ease-out;width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:1rem}.zoom-slider p{cursor:pointer;font-size:1.6rem;font-weight:700;margin:.5rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider .slider-wrapper{border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:lime;bottom:0;position:absolute;-webkit-transition:height .2s;transition:height .2s;width:100%}.overlay{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:hsla(0,0%,100%,.8);display:none;height:100%;justify-content:center;opacity:0;position:absolute;top:0;-webkit-transition:opacity .3s;transition:opacity .3s;width:100%;z-index:30}.overlay [class$=-modal]{background:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;padding:3rem 4rem;position:relative;text-align:center}.overlay [class$=-modal] h1{margin-bottom:3rem}.overlay [class$=-modal] button{margin-top:3rem}.overlay [class$=-modal] .modal-close{color:#999;cursor:pointer;font-size:2.2rem;font-weight:700;line-height:1.4rem;position:absolute;right:1rem;top:1rem}.overlay [class$=-modal] .button-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center}.overlay [class$=-modal] .button-wrapper button{margin-left:1rem;margin-right:1rem}.overlay .edit-mark-modal,.overlay .new-mark-modal{width:calc(100% - 2rem)}.overlay .edit-mark-modal h1,.overlay .edit-mark-modal p,.overlay .new-mark-modal h1,.overlay .new-mark-modal p{text-align:center}.overlay .edit-mark-modal .rating,.overlay .new-mark-modal .rating{margin-bottom:1.2rem}.overlay .edit-mark-modal .rating img,.overlay .new-mark-modal .rating img{cursor:pointer;height:2.5rem;margin:0 .25rem;width:2.5rem}.overlay .edit-mark-modal .rating img.active,.overlay .new-mark-modal .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.overlay .edit-mark-modal .rating img.active.selected,.overlay .new-mark-modal .rating img.active.selected{-webkit-filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%);filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%)}.overlay .hide-show-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:15rem}.overlay .hide-show-modal .item img{height:2rem;margin-right:2rem}.overlay .hide-show-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .hide-show-modal .item input{margin:0;width:auto}.overlay .user-profile-modal{height:calc(100% - 2rem);width:calc(100% - 2rem)}.overlay .user-profile-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:25rem}.overlay .user-profile-modal .item img{height:2rem;margin-right:2rem}.overlay .user-profile-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .user-profile-modal .item input{margin:0;width:auto}.debug-container{background-color:hsla(0,0%,100%,.8);border-radius:.5rem;color:#000;left:1rem;padding:1rem;position:absolute;top:1rem;z-index:20}.debug-container p{margin-bottom:.2rem}.popup h1,.popup h2,.popup p{margin:0;text-align:center}.popup h1{font-size:2rem;margin-bottom:1.2rem}.popup .rating{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;width:100%}.popup .rating img{height:1.2rem}.popup .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.popup .rating p{font-style:inherit;margin-left:.5rem}.popup p{font-style:italic}.popup h2{font-size:1.3rem;font-weight:inherit;margin-top:1.2rem}.popup footer{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin-top:1.2rem;position:relative}.popup footer img{cursor:pointer;height:2rem;margin-left:.5rem}.cluster-icon-wrapper{position:relative}.cluster-icon-wrapper .cluster-icon{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);height:50px;line-height:50px;margin-left:-21px;margin-top:-13px;-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s;width:auto}.cluster-icon-wrapper .cluster-icon:active,.cluster-icon-wrapper .cluster-icon:focus,.cluster-icon-wrapper .cluster-icon:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8);-webkit-transform:scale(1.066);transform:scale(1.066)}.cluster-icon-wrapper .cluster-label{background-color:#fff;border:1px solid #000;border-radius:.75rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;color:#000;font-size:1.1rem;font-weight:700;left:15px;padding:.1rem .4rem;position:absolute;top:-15px}.leaflet-control-layers.leaflet-control{-webkit-transition:all .2s;transition:all .2s}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)}@media (min-width:720px){.overlay [class$=-modal]{max-width:50%}} diff --git a/static/dist/BeerCrackerz.bundle.js b/static/dist/BeerCrackerz.bundle.js index a80256f..bc75b6a 100644 --- a/static/dist/BeerCrackerz.bundle.js +++ b/static/dist/BeerCrackerz.bundle.js @@ -1 +1,177 @@ -!function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return w}});var r=Object.freeze({blue:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-blue.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),gold:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-gold.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),red:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-red.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),green:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-green.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),orange:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-orange.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),yellow:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-yellow.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),violet:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-violet.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),grey:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-grey.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),black:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-black.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),user:new window.L.Icon({iconUrl:"/assets/img/marker/user-position.png",shadowUrl:"/assets/img/marker/user-position-shadow.png",iconSize:[32,32],iconAnchor:[16,16],popupAnchor:[1,-34],shadowSize:[32,32]})});function n(e,t){for(var r=0;r : -"),n.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),o.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(r),t.appendChild(n),t.appendChild(a),t.appendChild(o),t.appendChild(i),t.appendChild(c),t.appendChild(s),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,r,n){if(!0===window.DEBUG){var a=window.BeerCrackerz,o=a.nls.debug.bind(a.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.store.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(o("lat")," : ").concat(r.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(o("lng")," : ").concat(r.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(o("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(o("accuracy")," : ").concat(e.precisionRound(r.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(o("highAccuracy")," : ").concat(!0===n.enableHighAccuracy?o("enabled"):o("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(o("posAge")," : ").concat(n.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(o("posTimeout")," : ").concat(n.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(o("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(o("marks")," : ").concat(c,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(r){e.getReq("http://localhost:8080/api/".concat(t)).then(r)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("shop").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&o(t.prototype,null),r&&o(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();function c(e,t){for(var r=0;ri.CIRCLE_RADIUS&&console.log("Too far"),o!==t.user.username?a.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),r(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var r=0;rOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var r=0;r".concat(e.nls.map("planLayerOSM"),"

    ")]=r,a["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=n,i.getPreference("map-plan-layer"))switch(i.getPreference("map-plan-layer")){case e.nls.map("planLayerOSM"):r.addTo(e._map);break;case e.nls.map("satLayerEsri"):n.addTo(e._map);break;default:r.addTo(e._map)}else r.addTo(e._map);window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){document.getElementById("user-profile").addEventListener("click",e.userProfileModal.bind(e)),document.getElementById("hide-show").addEventListener("click",e.hidShowModal.bind(e)),document.getElementById("center-on").addEventListener("click",e.toggleFocusLock.bind(e)),document.getElementById("overlay").addEventListener("click",e.closeModal.bind(e)),e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0))),e.updateDebugUI()})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var r={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(r,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var n=function(t){e.markPopupFactory(t).then((function(r){t.dom=r,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t=i.CIRCLE_RADIUS&&t[r].circle.visible&&(t[r].circle.visible=!1,t[r].circle.setStyle({opacity:0,fillOpacity:0}))}};"true"===i.getPreference("poi-show-circle")&&(t(this._marks.spot),t(this._marks.store),t(this._marks.bar),t([this._user]))}},{key:"formatSavedMarker",value:function(e){return{type:e.type,lat:e.lat,lng:e.lng,name:e.name,description:e.description,user:e.username||this.user.username,userId:e.userId||this.user.id,dom:null,rate:e.rate,marker:null,circle:null}}},{key:"editMarker",value:function(e){this._map.closePopup(),this.editMarkModal(e)}},{key:"deleteMarker",value:function(e){var t=this;this.deleteMarkModal((function(r){if(!0===r){for(var n=t._marks[e.type],a=0;a { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/BeerCrackerz.js": +/*!*****************************!*\ + !*** ./src/BeerCrackerz.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Boolean}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
    \n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server\n _this2._user.id = 42;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-store', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this5.nls.map('planLayerOSM'), \"

    \")] = osm; //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan;\n\n baseMaps[\"

    \".concat(_this5.nls.map('satLayerEsri'), \"

    \")] = esri; //baseMaps[`

    ${this.nls.map('satLayerGeo')}

    `] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.store, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.store, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.store, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.store, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this7._map.addLayer(_this7._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n spots[i].lat = spots[i].latitude;\n spots[i].lng = spots[i].longitude;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 42;\n stores[i].lat = stores[i].latitude;\n stores[i].lng = stores[i].longitude;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n bars[i].lat = bars[i].latitude;\n bars[i].lng = bars[i].longitude;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
    \n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/stores/bars marks. This label is basically the\n * mark name given by its creator.\n *
    \n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.store, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/stores/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
    \n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.store, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/stores/bars must be given as an argument\n *
    \n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
    \n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
    \n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate(\"/static/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(submit, \"{\".concat(options.type.toUpperCase(), \"_SUBMIT}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(cancel, \"{\".concat(options.type.toUpperCase(), \"_CANCEL}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i = 0; _i < _this8._marks[options.type].length; ++_i) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
    \n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('/static/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{MODAL_DESC}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{MODAL_CANCEL}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{MODAL_DELETE}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
    \n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('/static/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{ACCURACY_USER_MODAL}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{DEBUG_USER_MODAL}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{BEERCRACKERZ_DESC}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/stores/bars\n *
    \n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('/static/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{MODAL_TITLE}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{LABELS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{CIRCLES_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{SPOTS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-stores\"), \"{STORES_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowStores'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{BARS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{MODAL_CLOSE}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === 'true') {\n document.getElementById('show-stores').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-stores').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'store'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
    \n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"saved-\".concat(options.type))) || [];\n marks.push(this.formatSavedMarker(options));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(marks));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/stores/bars) and for the user marker\n *
    \n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.store);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
    \n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n type: mark.type,\n lat: mark.lat,\n lng: mark.lng,\n name: mark.name,\n description: mark.description,\n user: mark.username || this.user.username,\n userId: mark.userId || this.user.id,\n dom: null,\n rate: mark.rate,\n marker: null,\n circle: null\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will open a mark edition modal\n *
    \n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will delete a mark after prompting the user if he trully wants to\n *
    \n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i2 = 0; _i2 < _this13._marks[options.type].length; ++_i2) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i2]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The addDebugUI() method appends the debug DOM element to the document body\n *
    \n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The removeDebugUI() method remove the debug DOM element from the document body\n *
    \n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateDebugUI() method will update informations held in the debug DOM\n *
    \n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
    \n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
    \n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); + +/***/ }), + +/***/ "./src/js/MapHelper.js": +/*!*****************************!*\ + !*** ./src/js/MapHelper.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); + +/***/ }), + +/***/ "./src/js/ui/Notification.js": +/*!***********************************!*\ + !*** ./src/js/ui/Notification.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); + +/***/ }), + +/***/ "./src/js/ui/Rating.js": +/*!*****************************!*\ + !*** ./src/js/ui/Rating.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); + +/***/ }), + +/***/ "./src/js/ui/ZoomSlider.js": +/*!*********************************!*\ + !*** ./src/js/ui/ZoomSlider.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); + +/***/ }), + +/***/ "./src/js/utils/LangManager.js": +/*!*************************************!*\ + !*** ./src/js/utils/LangManager.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); + +/***/ }), + +/***/ "./src/js/utils/MarkerEnum.js": +/*!************************************!*\ + !*** ./src/js/utils/MarkerEnum.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-blue.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-gold.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-red.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-green.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-orange.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-yellow.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-violet.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-grey.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-black.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: '/static/img/marker/user-position.png',\n shadowUrl: '/static/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/ProviderEnum.js": +/*!**************************************!*\ + !*** ./src/js/utils/ProviderEnum.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/Utils.js": +/*!*******************************!*\ + !*** ./src/js/utils/Utils.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getStores\",\n value: function getStores() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); + +/***/ }), + +/***/ "./src/BeerCrackerz.scss": +/*!*******************************!*\ + !*** ./src/BeerCrackerz.scss ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.scss?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerz.js"); +/******/ window.BeerCrackerz = __webpack_exports__["default"]; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/static/dist/BeerCrackerzAuth.bundle.css b/static/dist/BeerCrackerzAuth.bundle.css index a4ee30d..0ca1dbe 100644 --- a/static/dist/BeerCrackerzAuth.bundle.css +++ b/static/dist/BeerCrackerzAuth.bundle.css @@ -1 +1,4 @@ +/*!**********************************************************************************************************************************************************************************************************************!*\ + !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerzAuth.scss ***! + \**********************************************************************************************************************************************************************************************************************/ @-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}:root{--aside-width:40rem}body{background:#fff;height:100%;position:relative;width:100%}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:grey;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;justify-content:space-between;max-width:40rem;max-width:var(--aside-width);right:0;text-align:center;width:100%;z-index:30}aside,aside .aside-expander{position:absolute;top:0;-webkit-transition:all .5s;transition:all .5s}aside .aside-expander{cursor:pointer;height:4.8rem;left:0}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside main{margin:0 4rem;text-align:left}aside main button{margin:2.9rem auto 1.2rem}aside main p{text-align:right}aside main p[class*=error]{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s}aside main p[class*=error].visible{color:#ff5454}aside footer{margin-bottom:5rem}main.beer-crakerz-map{height:100%;-webkit-transition:width .5s;transition:width .5s;width:calc(100% - 40rem);width:calc(100% - var(--aside-width));z-index:10}main.beer-crakerz-map .new-poi{text-align:center}main.beer-crakerz-map .new-poi p{font-size:1.6rem;font-weight:700}main.beer-crakerz-map .new-poi button{margin:1.2rem 0}main.beer-crakerz-map .marker-tooltip{font-style:italic;text-align:center}.notification-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:3rem;justify-content:center;left:calc(50% - 15rem);opacity:0;position:absolute;top:-4rem;-webkit-transition:top .3s,opacity .2s ease-out;transition:top .3s,opacity .2s ease-out;width:30rem;z-index:40}.notification-wrapper.opened{opacity:1;top:1rem}.notification-wrapper .notification-message{font-style:italic;margin:0}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .3s,opacity .2s ease-out;transition:right .3s,opacity .2s ease-out;width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:41rem;right:calc(var(--aside-width) + 1rem)}.zoom-slider p{cursor:pointer;font-size:1.6rem;font-weight:700;margin:.5rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider .slider-wrapper{border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:lime;bottom:0;position:absolute;-webkit-transition:height .2s;transition:height .2s;width:100%}.leaflet-control-layers.leaflet-control{-webkit-transition:all .2s;transition:all .2s}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)} diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index c187cef..0a25431 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -1 +1,177 @@ -!function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return w}});var n=Object.freeze({blue:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-blue.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),gold:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-gold.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),red:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-red.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),green:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-green.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),orange:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-orange.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),yellow:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-yellow.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),violet:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-violet.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),grey:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-grey.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),black:new window.L.Icon({iconUrl:"/assets/img/marker/marker-icon-black.png",shadowUrl:"/assets/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),user:new window.L.Icon({iconUrl:"/assets/img/marker/user-position.png",shadowUrl:"/assets/img/marker/user-position-shadow.png",iconSize:[32,32],iconAnchor:[16,16],popupAnchor:[1,-34],shadowSize:[32,32]})});function r(e,t){for(var n=0;n : -"),r.innerHTML="".concat(e("lng")," : -"),o.innerHTML="".concat(e("updates")," : 0"),a.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),s.innerHTML="".concat(e("posAge")," : -"),c.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(n),t.appendChild(r),t.appendChild(o),t.appendChild(a),t.appendChild(i),t.appendChild(s),t.appendChild(c),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,n,r){if(!0===window.DEBUG){var o=window.BeerCrackerz,a=o.nls.debug.bind(o.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,s=o.marks.spot.length+o.marks.store.length+o.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(a("lat")," : ").concat(n.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(a("lng")," : ").concat(n.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(a("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(a("accuracy")," : ").concat(e.precisionRound(n.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(a("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?a("enabled"):a("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(a("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(a("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(a("zoom")," : ").concat(o.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(a("marks")," : ").concat(s,"\n ")}}},{key:"getPoints",value:function(t){return new Promise((function(n){e.getReq("http://localhost:8080/api/".concat(t)).then(n)}))}},{key:"getSpots",value:function(){return new Promise((function(t){e.getPoints("spot").then(t)}))}},{key:"getStores",value:function(){return new Promise((function(t){e.getPoints("shop").then(t)}))}},{key:"getBars",value:function(){return new Promise((function(t){e.getPoints("bar").then(t)}))}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"STORE_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de"]}}],null&&a(t.prototype,null),n&&a(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function s(e,t){for(var n=0;ni.CIRCLE_RADIUS&&console.log("Too far"),a!==t.user.username?o.removeChild(o.querySelector("#popup-edit")):(o.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),o.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),n(o)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var n=0;nOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function u(e,t){for(var n=0;n".concat(e.nls.map("planLayerOSM"),"

    ")]=n,o["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=r,n.addTo(e._map),window.L.control.layers(o,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new d(e._map),t()}))}},{key:"_initGeolocation",value:function(){var e=this;return new Promise((function(t){if("geolocation"in navigator){var n="true"===i.getPreference("map-high-accuracy")?i.HIGH_ACCURACY:i.OPTIMIZED_ACCURACY;e._watchId=navigator.geolocation.watchPosition((function(t){e._user.lat=t.coords.latitude,e._user.lng=t.coords.longitude,e._user.accuracy=t.coords.accuracy,e._map&&(e.drawUserMarker(),e._map.setView(e._user))}),null,n),t()}else e._notification.raise(e.nls.notif("geolocationError")),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.store,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.store,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.store,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.store,!0),e.setMarkerLabels(e._marks.bar,!0)))})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var n={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.store=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-store")&&e._map.addLayer(e._clusters.store),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var r=function(t){e.markPopupFactory(t).then((function(n){t.dom=n,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};i.getSpots().then((function(e){for(var t=0;t { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/BeerCrackerzAuth.js": +/*!*********************************!*\ + !*** ./src/BeerCrackerzAuth.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true; // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this10._map.addLayer(_this10._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this10._map.addLayer(_this10._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this10._map.addLayer(_this10._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n spots[i].lat = spots[i].latitude;\n spots[i].lng = spots[i].longitude;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 42;\n stores[i].lat = stores[i].latitude;\n stores[i].lng = stores[i].longitude;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n bars[i].lat = bars[i].latitude;\n bars[i].lng = bars[i].longitude;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); + +/***/ }), + +/***/ "./src/js/MapHelper.js": +/*!*****************************!*\ + !*** ./src/js/MapHelper.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); + +/***/ }), + +/***/ "./src/js/ui/Notification.js": +/*!***********************************!*\ + !*** ./src/js/ui/Notification.js ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); + +/***/ }), + +/***/ "./src/js/ui/Rating.js": +/*!*****************************!*\ + !*** ./src/js/ui/Rating.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); + +/***/ }), + +/***/ "./src/js/ui/ZoomSlider.js": +/*!*********************************!*\ + !*** ./src/js/ui/ZoomSlider.js ***! + \*********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); + +/***/ }), + +/***/ "./src/js/utils/LangManager.js": +/*!*************************************!*\ + !*** ./src/js/utils/LangManager.js ***! + \*************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); + +/***/ }), + +/***/ "./src/js/utils/MarkerEnum.js": +/*!************************************!*\ + !*** ./src/js/utils/MarkerEnum.js ***! + \************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-blue.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-gold.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-red.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-green.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-orange.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-yellow.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-violet.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-grey.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-black.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: '/static/img/marker/user-position.png',\n shadowUrl: '/static/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/ProviderEnum.js": +/*!**************************************!*\ + !*** ./src/js/utils/ProviderEnum.js ***! + \**************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); + +/***/ }), + +/***/ "./src/js/utils/Utils.js": +/*!*******************************!*\ + !*** ./src/js/utils/Utils.js ***! + \*******************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getStores\",\n value: function getStores() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); + +/***/ }), + +/***/ "./src/BeerCrackerzAuth.scss": +/*!***********************************!*\ + !*** ./src/BeerCrackerzAuth.scss ***! + \***********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.scss?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module can't be inlined because the eval devtool is used. +/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerzAuth.js"); +/******/ window.BeerCrackerz = __webpack_exports__["default"]; +/******/ +/******/ })() +; \ No newline at end of file diff --git a/static/html/aside/forgot-password.html b/static/html/aside/forgot-password.html new file mode 100644 index 0000000..3cb8b2a --- /dev/null +++ b/static/html/aside/forgot-password.html @@ -0,0 +1,16 @@ +
    +
    +

    BeerCrackerz

    +

    {FORGOT_PASSWORD_SUBTITLE}

    +
    +
    +

    {FORGOT_PASSWORD_ERROR}

    + + + +

    {FORGOT_PASSWORD_LOGIN_LABEL} {FORGOT_PASSWORD_LOGIN}

    +
    + diff --git a/static/html/aside/login.html b/static/html/aside/login.html new file mode 100644 index 0000000..8eeef10 --- /dev/null +++ b/static/html/aside/login.html @@ -0,0 +1,18 @@ +
    +
    +

    BeerCrackerz

    +

    {LOGIN_SUBTITLE}

    +
    +
    + + + + + + +

    {LOGIN_NOT_REGISTERED} {LOGIN_REGISTER}

    +
    + diff --git a/static/html/aside/register.html b/static/html/aside/register.html new file mode 100644 index 0000000..e00a1db --- /dev/null +++ b/static/html/aside/register.html @@ -0,0 +1,22 @@ +
    +
    +

    BeerCrackerz

    +

    {REGISTER_SUBTITLE}

    +
    +
    + + + + + + + + + + +

    {REGISTER_ALREADY_DONE} {REGISTER_LOGIN}

    +
    + diff --git a/static/html/modal/deletemark.html b/static/html/modal/deletemark.html old mode 100755 new mode 100644 index 90c09b0..b22fa2f --- a/static/html/modal/deletemark.html +++ b/static/html/modal/deletemark.html @@ -1,9 +1,9 @@
    -

    {{MODAL_TITLE}}

    -

    {{MODAL_DESC}}

    +

    {MODAL_TITLE}

    +

    {MODAL_DESC}

    - - + +
    diff --git a/static/html/modal/editbar.html b/static/html/modal/editbar.html old mode 100755 new mode 100644 index 1c61023..2ab5b0f --- a/static/html/modal/editbar.html +++ b/static/html/modal/editbar.html @@ -1,20 +1,20 @@
    -

    {{MODAL_TITLE}}

    - +

    {MODAL_TITLE}

    + - + - +
    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    - - + +
    diff --git a/static/html/modal/editspot.html b/static/html/modal/editspot.html old mode 100755 new mode 100644 index b08d201..77a2f84 --- a/static/html/modal/editspot.html +++ b/static/html/modal/editspot.html @@ -1,20 +1,20 @@
    -

    {{MODAL_TITLE}}

    - +

    {MODAL_TITLE}

    + - + - +
    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    - - + +
    diff --git a/static/html/modal/editstore.html b/static/html/modal/editstore.html old mode 100755 new mode 100644 index b9e765e..8a3e583 --- a/static/html/modal/editstore.html +++ b/static/html/modal/editstore.html @@ -1,20 +1,20 @@
    -

    {{MODAL_TITLE}}

    - +

    {MODAL_TITLE}

    + - + - +
    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    - - + +
    diff --git a/static/html/modal/hideshow.html b/static/html/modal/hideshow.html old mode 100755 new mode 100644 index 4641c03..c4c1b69 --- a/static/html/modal/hideshow.html +++ b/static/html/modal/hideshow.html @@ -1,30 +1,30 @@
    -

    {{MODAL_TITLE}}

    +

    {MODAL_TITLE}

    - label-toggle - + label-toggle +
    - circle-toggle - + circle-toggle +
    - show-spots - + show-spots +
    - show-stores - + show-stores +
    - show-bars - + show-bars +
    - +
    diff --git a/static/html/modal/newbar.html b/static/html/modal/newbar.html old mode 100755 new mode 100644 index 75d3d69..fc4e420 --- a/static/html/modal/newbar.html +++ b/static/html/modal/newbar.html @@ -1,19 +1,19 @@
    -

    {{BAR_TITLE}}

    -

    {{BAR_SUBTITLE}}

    - +

    {BAR_TITLE}

    +

    {BAR_SUBTITLE}

    + - + - +
    - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star
    - - + +
    diff --git a/static/html/modal/newspot.html b/static/html/modal/newspot.html old mode 100755 new mode 100644 index 65081af..eaad8f1 --- a/static/html/modal/newspot.html +++ b/static/html/modal/newspot.html @@ -1,21 +1,21 @@
    -

    {{SPOT_TITLE}}

    -

    {{SPOT_SUBTITLE}}

    - +

    {SPOT_TITLE}

    +

    {SPOT_SUBTITLE}

    + - + - +
    - rating-star - rating-star - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star + rating-star + rating-star
    - - + +
    diff --git a/static/html/modal/newstore.html b/static/html/modal/newstore.html old mode 100755 new mode 100644 index 4adb7c9..75eb0a4 --- a/static/html/modal/newstore.html +++ b/static/html/modal/newstore.html @@ -1,19 +1,19 @@
    -

    {{STORE_TITLE}}

    -

    {{STORE_SUBTITLE}}

    - +

    {STORE_TITLE}

    +

    {STORE_SUBTITLE}

    + - + - +
    - rating-star - rating-star - rating-star + rating-star + rating-star + rating-star
    - - + +
    diff --git a/static/html/modal/user.html b/static/html/modal/user.html old mode 100755 new mode 100644 index 45550f1..d963b81 --- a/static/html/modal/user.html +++ b/static/html/modal/user.html @@ -1,15 +1,15 @@ diff --git a/static/html/popup/bar.html b/static/html/popup/bar.html old mode 100755 new mode 100644 index d0ad110..3fc6cce --- a/static/html/popup/bar.html +++ b/static/html/popup/bar.html @@ -1,23 +1,23 @@ diff --git a/static/html/popup/spot.html b/static/html/popup/spot.html old mode 100755 new mode 100644 index 1d11502..3247f67 --- a/static/html/popup/spot.html +++ b/static/html/popup/spot.html @@ -1,23 +1,23 @@ diff --git a/static/html/popup/store.html b/static/html/popup/store.html old mode 100755 new mode 100644 index ca9988c..6f22fc6 --- a/static/html/popup/store.html +++ b/static/html/popup/store.html @@ -1,23 +1,23 @@ diff --git a/static/img/favicon/android-icon-144x144.png b/static/img/favicon/android-icon-144x144.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/android-icon-192x192.png b/static/img/favicon/android-icon-192x192.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/android-icon-36x36.png b/static/img/favicon/android-icon-36x36.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/android-icon-48x48.png b/static/img/favicon/android-icon-48x48.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/android-icon-72x72.png b/static/img/favicon/android-icon-72x72.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/android-icon-96x96.png b/static/img/favicon/android-icon-96x96.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-114x114.png b/static/img/favicon/apple-icon-114x114.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-120x120.png b/static/img/favicon/apple-icon-120x120.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-144x144.png b/static/img/favicon/apple-icon-144x144.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-152x152.png b/static/img/favicon/apple-icon-152x152.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-180x180.png b/static/img/favicon/apple-icon-180x180.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-57x57.png b/static/img/favicon/apple-icon-57x57.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-60x60.png b/static/img/favicon/apple-icon-60x60.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-72x72.png b/static/img/favicon/apple-icon-72x72.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-76x76.png b/static/img/favicon/apple-icon-76x76.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon-precomposed.png b/static/img/favicon/apple-icon-precomposed.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/apple-icon.png b/static/img/favicon/apple-icon.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/browserconfig.xml b/static/img/favicon/browserconfig.xml old mode 100755 new mode 100644 diff --git a/static/img/favicon/favicon-16x16.png b/static/img/favicon/favicon-16x16.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/favicon-32x32.png b/static/img/favicon/favicon-32x32.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/favicon-96x96.png b/static/img/favicon/favicon-96x96.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/favicon.ico b/static/img/favicon/favicon.ico old mode 100755 new mode 100644 diff --git a/static/img/favicon/manifest.json b/static/img/favicon/manifest.json old mode 100755 new mode 100644 diff --git a/static/img/favicon/ms-icon-144x144.png b/static/img/favicon/ms-icon-144x144.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/ms-icon-150x150.png b/static/img/favicon/ms-icon-150x150.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/ms-icon-310x310.png b/static/img/favicon/ms-icon-310x310.png old mode 100755 new mode 100644 diff --git a/static/img/favicon/ms-icon-70x70.png b/static/img/favicon/ms-icon-70x70.png old mode 100755 new mode 100644 diff --git a/static/img/logo-small.png b/static/img/logo-small.png old mode 100755 new mode 100644 diff --git a/static/img/logo-social.png b/static/img/logo-social.png old mode 100755 new mode 100644 diff --git a/static/img/logo-text.png b/static/img/logo-text.png old mode 100755 new mode 100644 diff --git a/static/img/logo.png b/static/img/logo.png old mode 100755 new mode 100644 diff --git a/static/img/logo.svg b/static/img/logo.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/center.svg b/static/img/logo/center.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/circle.svg b/static/img/logo/circle.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/comment.svg b/static/img/logo/comment.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/debug.svg b/static/img/logo/debug.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/delete.svg b/static/img/logo/delete.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/dollar.svg b/static/img/logo/dollar.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/edit.svg b/static/img/logo/edit.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/hide.svg b/static/img/logo/hide.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/info.svg b/static/img/logo/info.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/label.svg b/static/img/logo/label.svg old mode 100755 new mode 100644 diff --git a/front/assets/img/logo/left.svg b/static/img/logo/left.svg similarity index 100% rename from front/assets/img/logo/left.svg rename to static/img/logo/left.svg diff --git a/static/img/logo/photo.svg b/static/img/logo/photo.svg old mode 100755 new mode 100644 diff --git a/static/img/logo/precision.svg b/static/img/logo/precision.svg old mode 100755 new mode 100644 diff --git a/front/assets/img/logo/right.svg b/static/img/logo/right.svg similarity index 100% rename from front/assets/img/logo/right.svg rename to static/img/logo/right.svg diff --git a/static/img/logo/star.svg b/static/img/logo/star.svg old mode 100755 new mode 100644 diff --git a/static/img/marker/cluster-icon-blue.png b/static/img/marker/cluster-icon-blue.png old mode 100755 new mode 100644 diff --git a/static/img/marker/cluster-icon-green.png b/static/img/marker/cluster-icon-green.png old mode 100755 new mode 100644 diff --git a/static/img/marker/cluster-icon-red.png b/static/img/marker/cluster-icon-red.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-black.png b/static/img/marker/marker-icon-black.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-blue.png b/static/img/marker/marker-icon-blue.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-gold.png b/static/img/marker/marker-icon-gold.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-green.png b/static/img/marker/marker-icon-green.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-grey.png b/static/img/marker/marker-icon-grey.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-orange.png b/static/img/marker/marker-icon-orange.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-red.png b/static/img/marker/marker-icon-red.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-violet.png b/static/img/marker/marker-icon-violet.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-icon-yellow.png b/static/img/marker/marker-icon-yellow.png old mode 100755 new mode 100644 diff --git a/static/img/marker/marker-shadow.png b/static/img/marker/marker-shadow.png old mode 100755 new mode 100644 diff --git a/static/img/marker/user-position-shadow.png b/static/img/marker/user-position-shadow.png old mode 100755 new mode 100644 diff --git a/static/img/marker/user-position.png b/static/img/marker/user-position.png old mode 100755 new mode 100644 diff --git a/static/nls/de.json b/static/nls/de.json old mode 100755 new mode 100644 index 29c0ea2..394f924 --- a/static/nls/de.json +++ b/static/nls/de.json @@ -23,7 +23,7 @@ "storeDeleted": "Store has been successfully deleted from map", "barDeleted": "Bar has been successfully deleted from map", "markNameEmpty": "You didn't specified a name for the mark", - "lockFocusOn": "Centering and locking on your position", + "lockFocusOn": "Centering and locking view on your position", "unlockFocusOn": "Position locking ended" }, "nav": { @@ -96,6 +96,7 @@ "hiddenError": "Oh! Un texte caché!", "username": "Nom d'utilisateur ou Email", "password": "Mot de passe", + "forgot": "Vous l'avez oublié?", "login": "Se connecter", "notRegistered": "Pas encore inscrit?", "register": "Créer un compte", @@ -108,7 +109,8 @@ "headTitle": "S'inscrire | BeerCrackerz", "subtitle": "S'inscrire", "hiddenError": "Oh! Un texte caché!", - "username": "Nom d'utilisateur ou Email", + "username": "Nom d'utilisateur", + "mail": "Adresse email", "password1": "Mot de passe", "password2": "Confirmer le mot de passe", "register": "S'inscrire", @@ -116,6 +118,17 @@ "login": "Se connecter", "fieldEmpty": "Veuillez remplir tous les champs du formulaire", "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + }, + "forgotPassword": { + "headTitle": "Mot de passe oublié | BeerCrackerz", + "subtitle": "Mot de passe oublié", + "hiddenError": "Oh! Un texte caché!", + "mail": "Mail", + "submit": "Réinitialiser votre mot de passe", + "loginLabel": "Vous vous en souvenez?", + "login": "Se connecter", + "fieldEmpty": "Renseignez votre adresse mail", + "serverError": "Une erreur serveur est survenue, contactez le support" } } } diff --git a/static/nls/en.json b/static/nls/en.json old mode 100755 new mode 100644 index 848c375..394f924 --- a/static/nls/en.json +++ b/static/nls/en.json @@ -96,6 +96,7 @@ "hiddenError": "Oh! Un texte caché!", "username": "Nom d'utilisateur ou Email", "password": "Mot de passe", + "forgot": "Vous l'avez oublié?", "login": "Se connecter", "notRegistered": "Pas encore inscrit?", "register": "Créer un compte", @@ -108,7 +109,8 @@ "headTitle": "S'inscrire | BeerCrackerz", "subtitle": "S'inscrire", "hiddenError": "Oh! Un texte caché!", - "username": "Nom d'utilisateur ou Email", + "username": "Nom d'utilisateur", + "mail": "Adresse email", "password1": "Mot de passe", "password2": "Confirmer le mot de passe", "register": "S'inscrire", @@ -116,6 +118,17 @@ "login": "Se connecter", "fieldEmpty": "Veuillez remplir tous les champs du formulaire", "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + }, + "forgotPassword": { + "headTitle": "Mot de passe oublié | BeerCrackerz", + "subtitle": "Mot de passe oublié", + "hiddenError": "Oh! Un texte caché!", + "mail": "Mail", + "submit": "Réinitialiser votre mot de passe", + "loginLabel": "Vous vous en souvenez?", + "login": "Se connecter", + "fieldEmpty": "Renseignez votre adresse mail", + "serverError": "Une erreur serveur est survenue, contactez le support" } } } diff --git a/static/nls/es.json b/static/nls/es.json old mode 100755 new mode 100644 index c7a8342..394f924 --- a/static/nls/es.json +++ b/static/nls/es.json @@ -15,7 +15,7 @@ }, "notif": { "geolocationError": "Your browser doesn't implement the geolocation API", - "newMarkerOutside": "New marker out of range", + "newMarkerOutside": "New marker out of your range", "spotAdded": "New spot saved to map", "storeAdded": "New store saved to map", "barAdded": "New bar saved to map", @@ -23,7 +23,7 @@ "storeDeleted": "Store has been successfully deleted from map", "barDeleted": "Bar has been successfully deleted from map", "markNameEmpty": "You didn't specified a name for the mark", - "lockFocusOn": "Centering and locking on your position", + "lockFocusOn": "Centering and locking view on your position", "unlockFocusOn": "Position locking ended" }, "nav": { @@ -96,6 +96,7 @@ "hiddenError": "Oh! Un texte caché!", "username": "Nom d'utilisateur ou Email", "password": "Mot de passe", + "forgot": "Vous l'avez oublié?", "login": "Se connecter", "notRegistered": "Pas encore inscrit?", "register": "Créer un compte", @@ -108,7 +109,8 @@ "headTitle": "S'inscrire | BeerCrackerz", "subtitle": "S'inscrire", "hiddenError": "Oh! Un texte caché!", - "username": "Nom d'utilisateur ou Email", + "username": "Nom d'utilisateur", + "mail": "Adresse email", "password1": "Mot de passe", "password2": "Confirmer le mot de passe", "register": "S'inscrire", @@ -116,6 +118,17 @@ "login": "Se connecter", "fieldEmpty": "Veuillez remplir tous les champs du formulaire", "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + }, + "forgotPassword": { + "headTitle": "Mot de passe oublié | BeerCrackerz", + "subtitle": "Mot de passe oublié", + "hiddenError": "Oh! Un texte caché!", + "mail": "Mail", + "submit": "Réinitialiser votre mot de passe", + "loginLabel": "Vous vous en souvenez?", + "login": "Se connecter", + "fieldEmpty": "Renseignez votre adresse mail", + "serverError": "Une erreur serveur est survenue, contactez le support" } } } diff --git a/static/nls/fr.json b/static/nls/fr.json old mode 100755 new mode 100644 index 571ad49..394f924 --- a/static/nls/fr.json +++ b/static/nls/fr.json @@ -2,92 +2,92 @@ "debug": { "lat": "Latitude", "lng": "Longitude", - "updates": "Mises à jour", - "accuracy": "Précision", - "highAccuracy": "Haute précision", - "posAge": "Fréquence de rafraichissement", - "posTimeout": "Validité de la position", - "zoom": "Niveau de zoom", - "enabled": "Activée", - "disabled": "Désactivée", - "marks": "Marqueurs", - "export": "Exporter les données" + "updates": "Updates", + "accuracy": "Accuracy", + "highAccuracy": "High accuracy", + "posAge": "Position max age", + "posTimeout": "Position timeout", + "zoom": "Zoom level", + "enabled": "Enabled", + "disabled": "Disabled", + "marks": "Marks", + "export": "Export data" }, "notif": { - "geolocationError": "Votre navigateur ne peux utiliser votre localisation", - "newMarkerOutside": "Nouveau marqueur hors de votre portée", - "spotAdded": "Nouveau spot ajouté à la carte", - "storeAdded": "Nouveau magasin ajouté à la carte", - "barAdded": "Nouveau bar ajouté à la carte", - "spotDeleted": "Le spot a été supprimé de la carte avec succès", - "storeDeleted": "Le magasin a été supprimé de la carte avec succès", - "barDeleted": "Le bar a été supprimé de la carte avec succès", - "markNameEmpty": "Vous devez specifier un nom pour le marqueur", - "lockFocusOn": "Suivre et recentrer sur votre position", - "unlockFocusOn": "Fin du suivi de position" + "geolocationError": "Your browser doesn't implement the geolocation API", + "newMarkerOutside": "New marker out of your range", + "spotAdded": "New spot saved to map", + "storeAdded": "New store saved to map", + "barAdded": "New bar saved to map", + "spotDeleted": "Spot has been successfully deleted from map", + "storeDeleted": "Store has been successfully deleted from map", + "barDeleted": "Bar has been successfully deleted from map", + "markNameEmpty": "You didn't specified a name for the mark", + "lockFocusOn": "Centering and locking view on your position", + "unlockFocusOn": "Position locking ended" }, "nav": { - "add": "Ajouter", - "cancel": "Annuler", - "close": "Fermer", - "delete": "Supprimer" + "add": "Add", + "cancel": "Cancel", + "close": "Close", + "delete": "Delete" }, "map": { - "newTitle": "Nouveau marqueur", - "newSpot": "Ajouter un spot", - "newStore": "Ajouter un magasin", - "newBar": "Ajouter un bar", + "newTitle": "New marker", + "newSpot": "Add a spot", + "newStore": "Add a shop", + "newBar": "Add a bar", "planLayerOSM": "Plan OSM", "planLayerGeo": "Plan GeoPortail", "satLayerEsri": "Satellite ESRI", "satLayerGeo": "Satellite GeoPortail" }, "spot": { - "title": "Nouveau spot", - "subtitle": "Un spot est un endroit remarquable pour cracker une bière en tout quiétude! Faites en profiter la communauté, que ce soit pour le calme exceptionnel, pour la vue incroyable ou pour tout autre source de ravissement houblonné.", - "nameLabel": "Nommer ce spot", - "descLabel": "Pourquoi ne pas le décrire", - "rateLabel": "Lui attribuer une note" + "title": "New spot", + "subtitle": "A spot is a remarkable place to crack a beer ! Share it with the community, wether it is for the astonishing view of for whatever it is enjoyable to drink a beer!", + "nameLabel": "Name that spot", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" }, "store": { - "title": "Nouveau magasin", - "subtitle": "C'est un indispensable pour se ravitailler des meilleurs breuvages houblonnés. Rensigner la gamme de prix et surtout si fraicheur il y a!", - "nameLabel": "Nom du magasin", - "descLabel": "Pourquoi ne pas le décrire", - "rateLabel": "Lui attribuer une note" + "title": "New store", + "subtitle": "The must have place to refill your beer stock. The more info you provide, the better you help your fellow beer crackerz!", + "nameLabel": "Store name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" }, "bar": { - "title": "Nouveau bar", - "subtitle": "Un bar est un endroit convivial ou le houblons coule des saintes tireuses à pression.", - "nameLabel": "Nom du bar", - "descLabel": "Pourquoi ne pas le décrire", - "rateLabel": "Lui attribuer une note" + "title": "New bar", + "subtitle": "A bar is a holly place where you can get some nicely colded draft beers!", + "nameLabel": "Bar name", + "descLabel": "Why don't you describe it", + "rateLabel": "Give it a note" }, "modal": { - "userTitle": "Compte utilisateur", - "userAccuracyPref": "Haute précision", - "userDebugPref": "Interface de debug", - "aboutTitle": "À propos de BeerCrackerz", - "aboutDesc": "Une idée brillante de David Béché!
    BeerCrackerz, c'est la communauté incontournable d'amoureux du houblons, de pourfendeurs de pintes, d'aficionados de céréales!", - "hideShowTitle": "Options de carte", - "hideShowLabels": "Étiquettes", - "hideShowCircles": "Cercles", + "userTitle": "User account", + "userAccuracyPref": "High precision", + "userDebugPref": "Debug interface", + "aboutTitle": "About BeerCrackerz", + "aboutDesc": "A brilliant idea from David Béché!
    BeerCrackerz is the beer lovers comunity, filled with pint slayers and cereals lovers", + "hideShowTitle": "Map options", + "hideShowLabels": "Labels", + "hideShowCircles": "Circles", "hideShowSpots": "Spots", - "hideShowStores": "Magasins", + "hideShowStores": "Stores", "hideShowBars": "Bars", - "deleteMarkTitle": "Supprimer le marqueur", - "deleteMarkDesc": "Êtes-vous sûr de vouloir supprimer ce marqueur?
    Cette action est permanente et irréversible.", - "spotEditTitle": "Éditer le spot", - "storeEditTitle": "Éditer le magasin", - "barEditTitle": "Éditer le bar" + "deleteMarkTitle": "Delete mark", + "deleteMarkDesc": "Are you sure you want to delete this mark?
    This action is permanent and can not be reverted.", + "spotEditTitle": "Edit spot", + "storeEditTitle": "Edit store", + "barEditTitle": "Edit bar" }, "popup": { - "spotFoundBy": "Un spot découvert par", - "storeFoundBy": "Un magasin ajouté par", - "barFoundBy": "Un bar ajouté par", - "spotNoDesc": "Pas de description disponible pour ce spot", - "storeNoDesc": "Pas de description disponible pour ce magasin", - "barNoDesc": "Pas de description disponible pour ce bar" + "spotFoundBy": "A spot discovered by", + "storeFoundBy": "A store added by", + "barFoundBy": "A bar added by", + "spotNoDesc": "No description available for this spot", + "storeNoDesc": "No description available for this store", + "barNoDesc": "No description available for this bar" }, "auth": { "login": { @@ -96,6 +96,7 @@ "hiddenError": "Oh! Un texte caché!", "username": "Nom d'utilisateur ou Email", "password": "Mot de passe", + "forgot": "Vous l'avez oublié?", "login": "Se connecter", "notRegistered": "Pas encore inscrit?", "register": "Créer un compte", @@ -108,7 +109,8 @@ "headTitle": "S'inscrire | BeerCrackerz", "subtitle": "S'inscrire", "hiddenError": "Oh! Un texte caché!", - "username": "Nom d'utilisateur ou Email", + "username": "Nom d'utilisateur", + "mail": "Adresse email", "password1": "Mot de passe", "password2": "Confirmer le mot de passe", "register": "S'inscrire", @@ -116,6 +118,17 @@ "login": "Se connecter", "fieldEmpty": "Veuillez remplir tous les champs du formulaire", "notMatchingPassword": "Les deux mots de passe ne correspondent pas" + }, + "forgotPassword": { + "headTitle": "Mot de passe oublié | BeerCrackerz", + "subtitle": "Mot de passe oublié", + "hiddenError": "Oh! Un texte caché!", + "mail": "Mail", + "submit": "Réinitialiser votre mot de passe", + "loginLabel": "Vous vous en souvenez?", + "login": "Se connecter", + "fieldEmpty": "Renseignez votre adresse mail", + "serverError": "Une erreur serveur est survenue, contactez le support" } } } From 7359e415812ee32fdc3acf66778ade7da0906831 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Thu, 15 Sep 2022 16:26:00 +0200 Subject: [PATCH 014/204] feat(front): create communication class for csrf header --- front/src/BeerCrackerzAuth.js | 3 + front/src/js/utils/Kom.js | 340 +++++++++++++++++++++++++ static/dist/BeerCrackerzAuth.bundle.js | 12 +- 3 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 front/src/js/utils/Kom.js diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 0c5eb84..eccf286 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -5,6 +5,7 @@ import ZoomSlider from './js/ui/ZoomSlider.js'; import LangManager from './js/utils/LangManager.js'; import Notification from './js/ui/Notification.js'; import Utils from './js/utils/Utils.js'; +import Kom from './js/utils/Kom.js'; class BeerCrackerzAuth extends MapHelper { @@ -51,6 +52,8 @@ class BeerCrackerzAuth extends MapHelper { this._aside = null; this._isAsideExpanded = true; + + this._kom = new Kom(); // The BeerCrackerz app is only initialized once nls are set up // By default, the template contains the login aside, no need to fetch it this._lang = new LangManager( diff --git a/front/src/js/utils/Kom.js b/front/src/js/utils/Kom.js new file mode 100644 index 0000000..94e51f3 --- /dev/null +++ b/front/src/js/utils/Kom.js @@ -0,0 +1,340 @@ +class Kom { + + + /** @summary

    Server communication abstraction

    + * @author Arthur Beaulieu + * @since June 2020 + * @description
    This class is the main object to deal with when requesting something from the server.
    + * It handle all urls calls (GET, POST), treat responses or handle errors using + * Promise.
    Because it uses Promise, success and errors are to be handled in the caller + * function, using .then() and .catch(). To properly deal with POST request, + * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */ + constructor() { + /** @private + * @member {string} - User session CSRF token to use in POST request */ + this._csrfToken = this._getCsrfCookie(); + /** @private + * @member {array[]} - Array of HTTP headers to be used in HTTP calls */ + this._headers = this._createRequestHeaders(); + // Check that CSRF token exists and that headers are properly created + this._checkValidity(); + } + + + /* --------------------------------------------------------------------------------------------------------------- */ + /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */ + /* --------------------------------------------------------------------------------------------------------------- */ + + + /** @method + * @name _getCsrfCookie + * @private + * @memberof Kom + * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty + * string by default. This method is required to be called on construction.
    + * @return {string} - The CSRF token string */ + _getCsrfCookie() { + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; ++i) { + // Parse current cookie to extract its properties + const cookie = cookies[i].split('='); + if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) { + // Found a matching cookie for csrftoken value, return as decoded string + return decodeURIComponent(cookie[1]); + } + } + } + // Return empty string by default, POST calls may fail + return ''; + } + + + /** @method + * @name _createRequestHeaders + * @private + * @memberof Kom + * @description
    Fills Kom _headers private member array, to use in HTTP requests later on. + * This method is required to be called on construction.
    + * @return {array[]} - The headers array, length 3, to be used in HTTP requests */ + _createRequestHeaders() { + return [ + ['Content-Type', 'application/json; charset=UTF-8'], + ['Accept', 'application/json'], + ['X-XSRF-TOKEN', this._csrfToken] + ]; + } + + + /** @method + * @async + * @name _checkValidity + * @private + * @memberof Kom + * @description
    Check the Kom instance validity to ensure its properties validity.
    */ + _checkValidity() { + if (this._csrfToken !== '') { + if (this._headers.length !== 3) { + console.error('F_KOM_HEADERS_ERROR'); + } + } else { + console.error('F_KOM_NO_CSRF_TOKEN'); + } + } + + + /* --------------------------------------------------------------------------------------------------------------- */ + /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */ + /* --------------------------------------------------------------------------------------------------------------- */ + + + /** @method + * @name _getErrorCodeFromHTTPStatus + * @private + * @memberof Kom + * @description
    This method is called whenever a server request didn't went well. In case a request (from + * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled + * in the user interface (with notification, console or else).
    + * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration + * @return {string} The HTTP status as an error code */ + _getErrorCodeFromHTTPStatus(code) { + if (code === 404) { + return 'B_KOM_NOT_FOUND'; + } else if (code === 403) { + return 'B_KOM_ACCESS_FORBIDDEN'; + } else if (code === 500) { + return 'B_KOM_INTERNAL_ERROR'; + } else { + return `B_KOM_UNKNOWN_ERROR`; + } + } + + + /** @method + * @async + * @name _resolveAs + * @private + * @memberof Kom + * @description
    Generic tool method used by private methods on fetch responses to format output in the provided + * format. It must be either `json`, `text` or `raw`.
    + * @param {String} type - The type of resolution, can be `json`, `text` or `raw` + * @param {Object} response - The fetch response object + * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */ + _resolveAs(type, response) { + return new Promise((resolve, reject) => { + if (response) { + if (type === 'raw') { // Raw are made in XMLHttpRequest and need special handling + if (response.status === 200) { + resolve(response.responseText); + } else { + reject(this._getErrorCodeFromHTTPStatus(response.status)); + } + } else if (type === 'json' || type === 'text') { // Call are made using fetch API + if (response[type]) { + resolve(response[type]()); + } else { // Fallback on standard error handling + reject(this._getErrorCodeFromHTTPStatus(response.status)); + } + } else { // Resolution type doesn't exists + reject('F_KOM_UNSUPPORTED_TYPE'); + } + } else { + reject('F_KOM_MISSING_ARGUMENT'); + } + }); + } + + + /** @method + * @async + * @name _resolveAsJSON + * @private + * @memberof Kom + * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be + * read in JavaScript code as objects.
    + * @param {Object} response - The fetch response object + * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */ + _resolveAsJSON(response) { + return this._resolveAs('json', response); + } + + + /** @method + * @async + * @name _resolveAsText + * @private + * @memberof Kom + * @description
    Tool method used by public methods on fetch responses to format output data as text to be + * read in JavaScript code as string (mostly to parse HTML templates).
    + * @param {Object} response - The fetch response object + * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */ + _resolveAsText(response) { + return this._resolveAs('text', response); + } + + + /** @method + * @async + * @name _resolveAsRaw + * @private + * @memberof Kom + * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    + * @param {Object} response - The XmlHTTPRequest response status object + * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */ + _resolveAsRaw(response) { + return this._resolveAs('raw', response); + } + + + _xhrCall(url, verb, data) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.open(verb, url, true); + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + xhr.onreadystatechange = response => { + if (response.target.readyState === 4) { // Ready state changed has reach the response state + this._resolveAsRaw(response.target) + .then(resolve) + .catch(reject); + } + }; + xhr.onerror = () => { + reject('F_KOM_XHR_ERROR'); + }; + xhr.send(data); + }); + } + + + /* --------------------------------------------------------------------------------------------------------------- */ + /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */ + /* --------------------------------------------------------------------------------------------------------------- */ + + + /** @method + * @async + * @name get + * @public + * @memberof Kom + * @description
    GET HTTP request using the fetch API.
    resolve returns the + * response as an Object.
    reject returns an error key as a String. + * It is meant to perform API call to access database through the user interface.
    + * @param {String} url - The GET url to fetch data from, in supported back URLs + * @returns {Promise} The request Promise */ + get(url, resolution = this._resolveAsJSON.bind(this)) { + return new Promise((resolve, reject) => { + const options = { + method: 'GET', + headers: new Headers([this._headers[0]]) // Content type to JSON + }; + + fetch(url, options) + .then(resolution) + .then(resolve) + .catch(reject); + }); + } + + + /** @method + * @async + * @name getText + * @public + * @memberof Kom + * @description
    GET HTTP request using the fetch API.
    resolve returns the + * response as a String.
    reject returns an error key as a String. It is + * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    + * @param {String} url - The GET url to fetch data from, in supported back URLs + * @returns {Promise} The request Promise */ + getText(url) { + return this.get(url, this._resolveAsText.bind(this)); + } + + + /** @method + * @async + * @name getRaw + * @public + * @memberof Kom + * @description
    GET HTTP request using an XMLHttpRequest, with an override + * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject + * returns an error code as a String.
    + * @param {String} url - The url to fetch raw data from + * @returns {Promise} The request Promise */ + getRaw(url) { + return new Promise((resolve, reject) => { + this._xhrCall(url, 'GET', null) + .then(resolve) + .catch(reject); + }); + } + + + /** @method + * @async + * @name post + * @public + * @memberof Kom + * @description
    POST HTTP request using the fetch API.
    Beware that the given options + * object match the url expectations.
    resolve + * returns the response as an Object.
    reject returns an error key as a String.
    + * @param {String} url - The POST url to fetch data from + * @param {Object} data - The JSON object that contains POST parameters + * @returns {Promise} The request Promise */ + post(url, data, resolution = this._resolveAsJSON.bind(this)) { + return new Promise((resolve, reject) => { + const options = { + method: 'POST', + headers: new Headers(this._headers), // POST needs all previously defined headers + body: JSON.stringify(data) + }; + + fetch(url, options) + .then(resolution) + .then(resolve) + .catch(reject); + }); + } + + + /** @method + * @async + * @name postText + * @public + * @memberof Kom + * @description
    POST HTTP request using the fetch API.
    Beware that the given options + * object match the url expectations.
    resolve + * returns the response as a String.
    reject returns an error key as a String.
    + * @param {String} url - The POST url to fetch data from + * @param {Object} data - The JSON object that contains POST parameters + * @returns {Promise} The request Promise */ + postText(url, data) { + return this.post(url, data, this._resolveAsText.bind(this)); + } + + + /** @method + * @async + * @name postRaw + * @public + * @memberof Kom + * @description
    POST HTTP request using the fetch API.
    Beware that the given options + * object match the url expectations.
    resolve, with an override + * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject + * returns an error code as a String.
    + * @param {String} url - The url to fetch raw data from + * @param {Object} data - The JSON object that contains POST parameters + * @returns {Promise} The request Promise */ + postRaw(url, data) { + return new Promise((resolve, reject) => { + this._xhrCall(url, 'POST', JSON.stringify(data)) + .then(resolve) + .catch(reject); + }); + } + + +} + + +export default Kom; diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index 0a25431..6fbccbc 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true; // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this10._map.addLayer(_this10._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this10._map.addLayer(_this10._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this10._map.addLayer(_this10._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n spots[i].lat = spots[i].latitude;\n spots[i].lng = spots[i].longitude;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 42;\n stores[i].lat = stores[i].latitude;\n stores[i].lng = stores[i].longitude;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n bars[i].lat = bars[i].latitude;\n bars[i].lng = bars[i].longitude;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true;\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this10._map.addLayer(_this10._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this10._map.addLayer(_this10._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this10._map.addLayer(_this10._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n spots[i].lat = spots[i].latitude;\n spots[i].lng = spots[i].longitude;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 42;\n stores[i].lat = stores[i].latitude;\n stores[i].lng = stores[i].longitude;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n bars[i].lat = bars[i].latitude;\n bars[i].lng = bars[i].longitude;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), @@ -60,6 +60,16 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/js/utils/Kom.js": +/*!*****************************!*\ + !*** ./src/js/utils/Kom.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Kom = /*#__PURE__*/function () {\n /** @summary

    Server communication abstraction

    \n * @author Arthur Beaulieu\n * @since June 2020\n * @description
    This class is the main object to deal with when requesting something from the server.
    \n * It handle all urls calls (GET, POST), treat responses or handle errors using\n * Promise.
    Because it uses Promise, success and errors are to be handled in the caller\n * function, using .then() and .catch(). To properly deal with POST request,\n * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */\n function Kom() {\n _classCallCheck(this, Kom);\n\n /** @private\n * @member {string} - User session CSRF token to use in POST request */\n this._csrfToken = this._getCsrfCookie();\n /** @private\n * @member {array[]} - Array of HTTP headers to be used in HTTP calls */\n\n this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created\n\n this._checkValidity();\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getCsrfCookie\n * @private\n * @memberof Kom\n * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty\n * string by default. This method is required to be called on construction.
    \n * @return {string} - The CSRF token string */\n\n\n _createClass(Kom, [{\n key: \"_getCsrfCookie\",\n value: function _getCsrfCookie() {\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n\n for (var i = 0; i < cookies.length; ++i) {\n // Parse current cookie to extract its properties\n var cookie = cookies[i].split('=');\n\n if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) {\n // Found a matching cookie for csrftoken value, return as decoded string\n return decodeURIComponent(cookie[1]);\n }\n }\n } // Return empty string by default, POST calls may fail\n\n\n return '';\n }\n /** @method\n * @name _createRequestHeaders\n * @private\n * @memberof Kom\n * @description
    Fills Kom _headers private member array, to use in HTTP requests later on.\n * This method is required to be called on construction.
    \n * @return {array[]} - The headers array, length 3, to be used in HTTP requests */\n\n }, {\n key: \"_createRequestHeaders\",\n value: function _createRequestHeaders() {\n return [['Content-Type', 'application/json; charset=UTF-8'], ['Accept', 'application/json'], ['X-XSRF-TOKEN', this._csrfToken]];\n }\n /** @method\n * @async\n * @name _checkValidity\n * @private\n * @memberof Kom\n * @description
    Check the Kom instance validity to ensure its properties validity.
    */\n\n }, {\n key: \"_checkValidity\",\n value: function _checkValidity() {\n if (this._csrfToken !== '') {\n if (this._headers.length !== 3) {\n console.error('F_KOM_HEADERS_ERROR');\n }\n } else {\n console.error('F_KOM_NO_CSRF_TOKEN');\n }\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getErrorCodeFromHTTPStatus\n * @private\n * @memberof Kom\n * @description
    This method is called whenever a server request didn't went well. In case a request (from\n * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled\n * in the user interface (with notification, console or else).
    \n * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration\n * @return {string} The HTTP status as an error code */\n\n }, {\n key: \"_getErrorCodeFromHTTPStatus\",\n value: function _getErrorCodeFromHTTPStatus(code) {\n if (code === 404) {\n return 'B_KOM_NOT_FOUND';\n } else if (code === 403) {\n return 'B_KOM_ACCESS_FORBIDDEN';\n } else if (code === 500) {\n return 'B_KOM_INTERNAL_ERROR';\n } else {\n return \"B_KOM_UNKNOWN_ERROR\";\n }\n }\n /** @method\n * @async\n * @name _resolveAs\n * @private\n * @memberof Kom\n * @description
    Generic tool method used by private methods on fetch responses to format output in the provided\n * format. It must be either `json`, `text` or `raw`.
    \n * @param {String} type - The type of resolution, can be `json`, `text` or `raw`\n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAs\",\n value: function _resolveAs(type, response) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (response) {\n if (type === 'raw') {\n // Raw are made in XMLHttpRequest and need special handling\n if (response.status === 200) {\n resolve(response.responseText);\n } else {\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'json' || type === 'text') {\n // Call are made using fetch API\n if (response[type]) {\n resolve(response[type]());\n } else {\n // Fallback on standard error handling\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else {\n // Resolution type doesn't exists\n reject('F_KOM_UNSUPPORTED_TYPE');\n }\n } else {\n reject('F_KOM_MISSING_ARGUMENT');\n }\n });\n }\n /** @method\n * @async\n * @name _resolveAsJSON\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be\n * read in JavaScript code as objects.
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsJSON\",\n value: function _resolveAsJSON(response) {\n return this._resolveAs('json', response);\n }\n /** @method\n * @async\n * @name _resolveAsText\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as text to be\n * read in JavaScript code as string (mostly to parse HTML templates).
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsText\",\n value: function _resolveAsText(response) {\n return this._resolveAs('text', response);\n }\n /** @method\n * @async\n * @name _resolveAsRaw\n * @private\n * @memberof Kom\n * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    \n * @param {Object} response - The XmlHTTPRequest response status object\n * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */\n\n }, {\n key: \"_resolveAsRaw\",\n value: function _resolveAsRaw(response) {\n return this._resolveAs('raw', response);\n }\n }, {\n key: \"_xhrCall\",\n value: function _xhrCall(url, verb, data) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open(verb, url, true);\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n xhr.onreadystatechange = function (response) {\n if (response.target.readyState === 4) {\n // Ready state changed has reach the response state\n _this2._resolveAsRaw(response.target).then(resolve)[\"catch\"](reject);\n }\n };\n\n xhr.onerror = function () {\n reject('F_KOM_XHR_ERROR');\n };\n\n xhr.send(data);\n });\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @async\n * @name get\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as an Object.
    reject returns an error key as a String.\n * It is meant to perform API call to access database through the user interface.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"get\",\n value: function get(url) {\n var _this3 = this;\n\n var resolution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers([_this3._headers[0]]) // Content type to JSON\n\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getText\",\n value: function getText(url) {\n return this.get(url, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name getRaw\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using an XMLHttpRequest, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getRaw\",\n value: function getRaw(url) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._xhrCall(url, 'GET', null).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name post\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as an Object.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"post\",\n value: function post(url, data) {\n var _this5 = this;\n\n var resolution = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(_this5._headers),\n // POST needs all previously defined headers\n body: JSON.stringify(data)\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name postText\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as a String.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postText\",\n value: function postText(url, data) {\n return this.post(url, data, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name postRaw\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postRaw\",\n value: function postRaw(url, data) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6._xhrCall(url, 'POST', JSON.stringify(data)).then(resolve)[\"catch\"](reject);\n });\n }\n }]);\n\n return Kom;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Kom);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Kom.js?"); + +/***/ }), + /***/ "./src/js/utils/LangManager.js": /*!*************************************!*\ !*** ./src/js/utils/LangManager.js ***! From 07ee752c7f4aabac2caa35139e0ccb219ad49629 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Thu, 15 Sep 2022 16:42:08 +0200 Subject: [PATCH 015/204] fix(front): fix display spots latlng bug --- front/src/BeerCrackerzAuth.js | 27 ++++++++------------------ front/src/js/MapHelper.js | 13 +++++++------ static/dist/BeerCrackerz.bundle.js | 2 +- static/dist/BeerCrackerzAuth.bundle.js | 4 ++-- 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index eccf286..1e49fb5 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -547,16 +547,11 @@ class BeerCrackerzAuth extends MapHelper { }); } })); - // Append clusters to the map depending on user preferences - if (Utils.getPreference(`poi-show-spot`) === 'true') { - this._map.addLayer(this._clusters.spot); - } - if (Utils.getPreference(`poi-show-store`) === 'true') { - this._map.addLayer(this._clusters.store); - } - if (Utils.getPreference(`poi-show-bar`) === 'true') { - this._map.addLayer(this._clusters.bar); - } + + this._map.addLayer(this._clusters.spot); + this._map.addLayer(this._clusters.store); + this._map.addLayer(this._clusters.bar); + // Load data from local storage, later to be fetched from server const iterateMarkers = mark => { this.markPopupFactory(mark).then(dom => { @@ -572,9 +567,7 @@ class BeerCrackerzAuth extends MapHelper { // TODO @raph spots[i].type = 'spot'; spots[i].user = 'messmaker'; - spots[i].userId = 42; - spots[i].lat = spots[i].latitude; - spots[i].lng = spots[i].longitude; + spots[i].userId = 1; iterateMarkers(spots[i]); } }); @@ -584,9 +577,7 @@ class BeerCrackerzAuth extends MapHelper { // TODO @raph stores[i].type = 'store'; stores[i].user = 'messmaker'; - stores[i].userId = 42; - stores[i].lat = stores[i].latitude; - stores[i].lng = stores[i].longitude; + stores[i].userId = 1; iterateMarkers(stores[i]); } }); @@ -596,9 +587,7 @@ class BeerCrackerzAuth extends MapHelper { // TODO @raph bars[i].type = 'bar'; bars[i].user = 'messmaker'; - bars[i].userId = 42; - bars[i].lat = bars[i].latitude; - bars[i].lng = bars[i].longitude; + bars[i].userId = 1; iterateMarkers(bars[i]); } }); diff --git a/front/src/js/MapHelper.js b/front/src/js/MapHelper.js index b8580bc..a024468 100644 --- a/front/src/js/MapHelper.js +++ b/front/src/js/MapHelper.js @@ -211,11 +211,11 @@ class MapHelper { element.appendChild(dom); const user = options.user || this.user.username; const desc = Utils.stripDom(options.description) || this.nls.popup(`${options.type}NoDesc`); - Utils.replaceString(element, `{{${options.type.toUpperCase()}_NAME}}`, Utils.stripDom(options.name)); - Utils.replaceString(element, `{{${options.type.toUpperCase()}_FINDER}}`, user); - Utils.replaceString(element, `{{${options.type.toUpperCase()}_RATE}}`, options.rate + 1); - Utils.replaceString(element, `{{${options.type.toUpperCase()}_DESC}}`, desc); - Utils.replaceString(element, `{{${options.type.toUpperCase()}_FOUND_BY}}`, this.nls.popup(`${options.type}FoundBy`)); + Utils.replaceString(element, `{${options.type.toUpperCase()}_NAME}`, Utils.stripDom(options.name)); + Utils.replaceString(element, `{${options.type.toUpperCase()}_FINDER}`, user); + Utils.replaceString(element, `{${options.type.toUpperCase()}_RATE}`, options.rate + 1); + Utils.replaceString(element, `{${options.type.toUpperCase()}_DESC}`, desc); + Utils.replaceString(element, `{${options.type.toUpperCase()}_FOUND_BY}`, this.nls.popup(`${options.type}FoundBy`)); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound) const rate = element.querySelector(`#${options.type}-rating`); for (let i = 0; i < options.rate + 1; ++i) { @@ -228,13 +228,14 @@ class MapHelper { //element.removeChild(element.querySelector('')); } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition... +/* TODO handle unlogged display if (user !== this.user.username) { element.removeChild(element.querySelector('#popup-edit')); } else { element.querySelector('#edit-mark').addEventListener('click', this.editMarker.bind(this, options), false); element.querySelector('#delete-mark').addEventListener('click', this.deleteMarker.bind(this, options), false); } - +*/ // Append circle around marker options.color = Utils[`${options.type.toUpperCase()}_COLOR`]; options.circle = this.drawCircle(options); diff --git a/static/dist/BeerCrackerz.bundle.js b/static/dist/BeerCrackerz.bundle.js index bc75b6a..33682ff 100644 --- a/static/dist/BeerCrackerz.bundle.js +++ b/static/dist/BeerCrackerz.bundle.js @@ -26,7 +26,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n /* TODO handle unlogged display \n if (user !== this.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', this.editMarker.bind(this, options), false);\n element.querySelector('#delete-mark').addEventListener('click', this.deleteMarker.bind(this, options), false);\n }\n */\n // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); /***/ }), diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index 6fbccbc..5ee2ce7 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true;\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this10._map.addLayer(_this10._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this10._map.addLayer(_this10._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this10._map.addLayer(_this10._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n spots[i].lat = spots[i].latitude;\n spots[i].lng = spots[i].longitude;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 42;\n stores[i].lat = stores[i].latitude;\n stores[i].lng = stores[i].longitude;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n bars[i].lat = bars[i].latitude;\n bars[i].lng = bars[i].longitude;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true;\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n\n _this10._map.addLayer(_this10._clusters.spot);\n\n _this10._map.addLayer(_this10._clusters.store);\n\n _this10._map.addLayer(_this10._clusters.bar); // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 1;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 1;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 1;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), @@ -26,7 +26,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_NAME}}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FINDER}}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_RATE}}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_DESC}}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{{\".concat(options.type.toUpperCase(), \"_FOUND_BY}}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n /* TODO handle unlogged display \n if (user !== this.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', this.editMarker.bind(this, options), false);\n element.querySelector('#delete-mark').addEventListener('click', this.deleteMarker.bind(this, options), false);\n }\n */\n // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); /***/ }), From 558303335b5796c61da2f3d7e182c1695721f67e Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Thu, 15 Sep 2022 16:50:23 +0200 Subject: [PATCH 016/204] feat(front): add proper api login call --- front/src/BeerCrackerzAuth.js | 7 +++++-- static/dist/BeerCrackerzAuth.bundle.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 1e49fb5..7654eda 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -120,7 +120,7 @@ class BeerCrackerzAuth extends MapHelper { // Check response and handle status codes console.log(response); // If all front and back tests are ok, redirect to auth - // If the user ma nually force redirection to authindex, + // If the user manually force redirection to authindex, // the server should reject the request as the user is not authenticated window.location = 'authindex.html'; }; @@ -131,7 +131,10 @@ class BeerCrackerzAuth extends MapHelper { username.classList.remove('error'); password.classList.remove('error'); if (_frontFieldValidation()) { - Utils.postReq('/api/login/submit').then(_backValidation).catch(() => { + this._kom.post('/api/login/', { + username: username.value, + password: password.value + }).then(_backValidation).catch(() => { error.classList.add('visible'); error.innerHTML = this.nls.login('serverError'); }); diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index 5ee2ce7..bde2114 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true;\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/login/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n\n _this10._map.addLayer(_this10._clusters.spot);\n\n _this10._map.addLayer(_this10._clusters.store);\n\n _this10._map.addLayer(_this10._clusters.bar); // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 1;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 1;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 1;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true;\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this2._kom.post('/api/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n\n _this10._map.addLayer(_this10._clusters.spot);\n\n _this10._map.addLayer(_this10._clusters.store);\n\n _this10._map.addLayer(_this10._clusters.bar); // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 1;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 1;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 1;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), From b0a38d7eb808da339e0970387f7adf06685ccf28 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 17 Sep 2022 12:07:51 +0200 Subject: [PATCH 017/204] feat(front): rename all store in shop --- front/src/BeerCrackerz.js | 72 ++++++------ front/src/BeerCrackerzAuth.js | 182 +++++++++++++++++++++--------- front/src/js/MapHelper.js | 34 +++--- front/src/js/utils/Kom.js | 24 ++++ front/src/js/utils/LangManager.js | 4 +- front/src/js/utils/Utils.js | 6 +- 6 files changed, 206 insertions(+), 116 deletions(-) diff --git a/front/src/BeerCrackerz.js b/front/src/BeerCrackerz.js index 66937fc..037e410 100644 --- a/front/src/BeerCrackerz.js +++ b/front/src/BeerCrackerz.js @@ -66,14 +66,14 @@ class BeerCrackerz extends MapHelper { username: '' }; /** - * The stored marks for spots, stores and bars + * The stored marks for spots, shops and bars * @type {Object} * @private **/ this._marks = { spot: [], - store: [], - bar: [], + shop: [], + bar: [] }; /** * The stored clusters for markers, see Leaflet.markercluster plugin @@ -82,8 +82,8 @@ class BeerCrackerz extends MapHelper { **/ this._clusters = { spot: {}, - store: {}, - bar: {}, + shop: {}, + bar: {} }; /** * The temporary marker for new marks only @@ -198,8 +198,8 @@ class BeerCrackerz extends MapHelper { Utils.setPreference('poi-show-spot', true); } - if (Utils.getPreference('poi-show-store') === null) { - Utils.setPreference('poi-show-store', true); + if (Utils.getPreference('poi-show-shop') === null) { + Utils.setPreference('poi-show-shop', true); } if (Utils.getPreference('poi-show-bar') === null) { @@ -376,7 +376,7 @@ class BeerCrackerz extends MapHelper { this._isZooming = true; if (Utils.getPreference('poi-show-circle') === 'true') { this.setMarkerCircles(this._marks.spot, false); - this.setMarkerCircles(this._marks.store, false); + this.setMarkerCircles(this._marks.shop, false); this.setMarkerCircles(this._marks.bar, false); this.setMarkerCircles([this._user], false); this.setMarkerCircles([{ circle: this._user.range }], false); @@ -387,7 +387,7 @@ class BeerCrackerz extends MapHelper { if (Utils.getPreference('poi-show-circle') === 'true') { if (this._map.getZoom() >= 15) { this.setMarkerCircles(this._marks.spot, true); - this.setMarkerCircles(this._marks.store, true); + this.setMarkerCircles(this._marks.shop, true); this.setMarkerCircles(this._marks.bar, true); this.setMarkerCircles([this._user], true); this.setMarkerCircles([{ circle: this._user.range }], true); @@ -397,11 +397,11 @@ class BeerCrackerz extends MapHelper { if (Utils.getPreference('poi-marker-label') === 'true') { if (this._map.getZoom() < 15) { this.setMarkerLabels(this._marks.spot, false); - this.setMarkerLabels(this._marks.store, false); + this.setMarkerLabels(this._marks.shop, false); this.setMarkerLabels(this._marks.bar, false); } else { this.setMarkerLabels(this._marks.spot, true); - this.setMarkerLabels(this._marks.store, true); + this.setMarkerLabels(this._marks.shop, true); this.setMarkerLabels(this._marks.bar, true); } } @@ -449,7 +449,7 @@ class BeerCrackerz extends MapHelper { }); } })); - this._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, { + this._clusters.shop = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, { iconCreateFunction: cluster => { return window.L.divIcon({ className: 'cluster-icon-wrapper', @@ -475,8 +475,8 @@ class BeerCrackerz extends MapHelper { if (Utils.getPreference(`poi-show-spot`) === 'true') { this._map.addLayer(this._clusters.spot); } - if (Utils.getPreference(`poi-show-store`) === 'true') { - this._map.addLayer(this._clusters.store); + if (Utils.getPreference(`poi-show-shop`) === 'true') { + this._map.addLayer(this._clusters.shop); } if (Utils.getPreference(`poi-show-bar`) === 'true') { this._map.addLayer(this._clusters.bar); @@ -497,21 +497,17 @@ class BeerCrackerz extends MapHelper { spots[i].type = 'spot'; spots[i].user = 'messmaker'; spots[i].userId = 42; - spots[i].lat = spots[i].latitude; - spots[i].lng = spots[i].longitude; iterateMarkers(spots[i]); } }); - Utils.getStores().then(stores => { - for (let i = 0; i < stores.length; ++i) { + Utils.getShops().then(shops => { + for (let i = 0; i < shops.length; ++i) { // TODO @raph - stores[i].type = 'store'; - stores[i].user = 'messmaker'; - stores[i].userId = 42; - stores[i].lat = stores[i].latitude; - stores[i].lng = stores[i].longitude; - iterateMarkers(stores[i]); + shops[i].type = 'shop'; + shops[i].user = 'messmaker'; + shops[i].userId = 42; + iterateMarkers(shops[i]); } }); @@ -521,8 +517,6 @@ class BeerCrackerz extends MapHelper { bars[i].type = 'bar'; bars[i].user = 'messmaker'; bars[i].userId = 42; - bars[i].lat = bars[i].latitude; - bars[i].lng = bars[i].longitude; iterateMarkers(bars[i]); } }); @@ -575,14 +569,14 @@ class BeerCrackerz extends MapHelper { * @description *
    * The toggleLabel() method will, depending on user preference, display or not - * the labels attached to spots/stores/bars marks. This label is basically the + * the labels attached to spots/shops/bars marks. This label is basically the * mark name given by its creator. *
    **/ toggleLabel() { const visible = !(Utils.getPreference('poi-marker-label') === 'true'); this.setMarkerLabels(this._marks.spot, visible); - this.setMarkerLabels(this._marks.store, visible); + this.setMarkerLabels(this._marks.shop, visible); this.setMarkerLabels(this._marks.bar, visible); Utils.setPreference('poi-marker-label', visible); } @@ -598,14 +592,14 @@ class BeerCrackerz extends MapHelper { * @description *
    * The toggleCircle() method will, depending on user preference, display or not - * the circles around the spots/stores/bars marks. This circle indicates the minimal + * the circles around the spots/shops/bars marks. This circle indicates the minimal * distance which allow the user to make updates on the mark information *
    **/ toggleCircle() { const visible = !(Utils.getPreference('poi-show-circle') === 'true'); this.setMarkerCircles(this._marks.spot, visible); - this.setMarkerCircles(this._marks.store, visible); + this.setMarkerCircles(this._marks.shop, visible); this.setMarkerCircles(this._marks.bar, visible); this.setMarkerCircles([this._user], visible); this.setMarkerCircles([{ circle: this._user.range }], visible); @@ -624,7 +618,7 @@ class BeerCrackerz extends MapHelper { *
    * The toggleMarkers() method will, depending on user preference, display or not * a given mark type. This way, the user can fine tune what is displayed on the map. - * A mark type in spots/stores/bars must be given as an argument + * A mark type in spots/shops/bars must be given as an argument *
    * @param {String} type The mark type in spots/tores/bars **/ @@ -840,7 +834,7 @@ class BeerCrackerz extends MapHelper { * @description *
    * The hidShowModal() method will request the hide show modal, which all - * toggles for map elements ; labels/circles/spots/stores/bars + * toggles for map elements ; labels/circles/spots/shops/bars *
    **/ hidShowModal() { @@ -850,7 +844,7 @@ class BeerCrackerz extends MapHelper { Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-labels`), `{LABELS_HIDESHOW_MODAL}`, this.nls.modal('hideShowLabels')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-circles`), `{CIRCLES_HIDESHOW_MODAL}`, this.nls.modal('hideShowCircles')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-spots`), `{SPOTS_HIDESHOW_MODAL}`, this.nls.modal('hideShowSpots')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-stores`), `{STORES_HIDESHOW_MODAL}`, this.nls.modal('hideShowStores')); + Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-shops`), `{SHOPS_HIDESHOW_MODAL}`, this.nls.modal('hideShowShops')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-bars`), `{BARS_HIDESHOW_MODAL}`, this.nls.modal('hideShowBars')); Utils.replaceString(dom.querySelector(`#modal-close-button`), `{MODAL_CLOSE}`, this.nls.nav('close')); document.getElementById('overlay').appendChild(dom); @@ -868,8 +862,8 @@ class BeerCrackerz extends MapHelper { document.getElementById('show-spots').checked = true; } - if (Utils.getPreference('poi-show-store') === 'true') { - document.getElementById('show-stores').checked = true; + if (Utils.getPreference('poi-show-shop') === 'true') { + document.getElementById('show-shops').checked = true; } if (Utils.getPreference('poi-show-bar') === 'true') { @@ -879,7 +873,7 @@ class BeerCrackerz extends MapHelper { document.getElementById('label-toggle').addEventListener('change', this.toggleLabel.bind(this)); document.getElementById('circle-toggle').addEventListener('change', this.toggleCircle.bind(this)); document.getElementById('show-spots').addEventListener('change', this.toggleMarkers.bind(this, 'spot')); - document.getElementById('show-stores').addEventListener('change', this.toggleMarkers.bind(this, 'store')); + document.getElementById('show-shops').addEventListener('change', this.toggleMarkers.bind(this, 'shop')); document.getElementById('show-bars').addEventListener('change', this.toggleMarkers.bind(this, 'bar')); setTimeout(() => document.getElementById('overlay').style.opacity = 1, 50); @@ -987,7 +981,7 @@ class BeerCrackerz extends MapHelper { * @description *
    * The updateMarkerCirclesVisibility() method will update the circle visibility for - * all mark types (spots/stores/bars) and for the user marker + * all mark types (spots/shops/bars) and for the user marker *
    **/ updateMarkerCirclesVisibility() { @@ -1018,7 +1012,7 @@ class BeerCrackerz extends MapHelper { if (Utils.getPreference('poi-show-circle') === 'true') { _updateByType(this._marks.spot); - _updateByType(this._marks.store); + _updateByType(this._marks.shop); _updateByType(this._marks.bar); _updateByType([this._user]); } @@ -1219,7 +1213,7 @@ class BeerCrackerz extends MapHelper { /** * @public * @property {Object} marks - * Leaflet.js marks that holds spot/store/bar marks as subkeys + * Leaflet.js marks that holds spot/shop/bar marks as subkeys **/ get marks() { return this._marks; diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 7654eda..26f8265 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -1,18 +1,17 @@ import './BeerCrackerzAuth.scss'; -import MapHelper from './js/MapHelper.js'; import Providers from './js/utils/ProviderEnum.js'; import ZoomSlider from './js/ui/ZoomSlider.js'; import LangManager from './js/utils/LangManager.js'; import Notification from './js/ui/Notification.js'; +import Markers from './js/utils/MarkerEnum.js'; import Utils from './js/utils/Utils.js'; import Kom from './js/utils/Kom.js'; -class BeerCrackerzAuth extends MapHelper { +class BeerCrackerzAuth { constructor() { - super(); /** * The user object holds everything useful to ensure a proper session * @type {Object} @@ -30,14 +29,14 @@ class BeerCrackerzAuth extends MapHelper { username: '' }; /** - * The stored marks for spots, stores and bars + * The stored marks for spots, shops and bars * @type {Object} * @private **/ this._marks = { spot: [], - store: [], - bar: [], + shop: [], + bar: [] }; /** * The stored clusters for markers, see Leaflet.markercluster plugin @@ -46,8 +45,8 @@ class BeerCrackerzAuth extends MapHelper { **/ this._clusters = { spot: {}, - store: {}, - bar: {}, + shop: {}, + bar: {} }; this._aside = null; @@ -209,7 +208,12 @@ class BeerCrackerzAuth extends MapHelper { password1.classList.remove('error'); password2.classList.remove('error'); if (_frontFieldValidation()) { - Utils.postReq('/api/register/submit').then(_backValidation).catch(() => { + this._kom.post('/api/register/submit', { + username: username.value, + email: mail.value, + password1: password1.value, + password2: password2.value + }).then(_backValidation).catch(() => { error.classList.add('visible'); error.innerHTML = this.nls.register('serverError'); }); @@ -259,7 +263,9 @@ class BeerCrackerzAuth extends MapHelper { error.classList.remove('visible'); mail.classList.remove('error'); if (_frontFieldValidation()) { - Utils.postReq('/api/password/reset').then(_backValidation).catch(() => { + this._kom.post('/api/password/reset', { + email: mail.value + }).then(_backValidation).catch(() => { error.classList.add('visible'); error.innerHTML = this.nls.forgotPassword('serverError'); }); @@ -273,7 +279,7 @@ class BeerCrackerzAuth extends MapHelper { _loadAside(type) { return new Promise((resolve, reject) => { - Utils.fetchTemplate(`/static/html/aside/${type}.html`).then(dom => { + this._kom.getTemplate(`/static/html/aside/${type}.html`).then(dom => { document.body.className = ''; // Clear previous css class document.body.classList.add(type); // Update body class with current aside view // We need to get aside at the last moment because of nls that changed HTML content @@ -404,7 +410,6 @@ class BeerCrackerzAuth extends MapHelper { _initGeolocation() { return new Promise(resolve => { if ('geolocation' in navigator) { - const options = (Utils.getPreference('map-high-accuracy') === 'true') ? Utils.HIGH_ACCURACY : Utils.OPTIMIZED_ACCURACY; this._watchId = navigator.geolocation.watchPosition(position => { // Update saved user position this._user.lat = position.coords.latitude; @@ -415,7 +420,7 @@ class BeerCrackerzAuth extends MapHelper { this.drawUserMarker(); this._map.setView(this._user); } - }, null, options); + }, null, Utils.HIGH_ACCURACY); resolve(); } else { this._notification.raise(this.nls.notif('geolocationError')); @@ -447,49 +452,24 @@ class BeerCrackerzAuth extends MapHelper { this._map.on('drag', () => { // Constrain pan to the map bounds this._map.panInsideBounds(Utils.MAP_BOUNDS, { animate: true }); - // Disable lock focus if user drags the map - if (Utils.getPreference('map-center-on-user') === 'true') { - this.toggleFocusLock(); - } }); // Map events this._map.on('zoomstart', () => { this._isZooming = true; - if (Utils.getPreference('poi-show-circle') === 'true') { - this.setMarkerCircles(this._marks.spot, false); - this.setMarkerCircles(this._marks.store, false); - this.setMarkerCircles(this._marks.bar, false); - this.setMarkerCircles([this._user], false); - this.setMarkerCircles([{ circle: this._user.range }], false); - } }); this._map.on('zoomend', () => { this._isZooming = false; - if (Utils.getPreference('poi-show-circle') === 'true') { - if (this._map.getZoom() >= 15) { - this.setMarkerCircles(this._marks.spot, true); - this.setMarkerCircles(this._marks.store, true); - this.setMarkerCircles(this._marks.bar, true); - this.setMarkerCircles([this._user], true); - this.setMarkerCircles([{ circle: this._user.range }], true); - } - } // Auto hide labels if zoom level is too high (and restore it when needed) - if (Utils.getPreference('poi-marker-label') === 'true') { - if (this._map.getZoom() < 15) { - this.setMarkerLabels(this._marks.spot, false); - this.setMarkerLabels(this._marks.store, false); - this.setMarkerLabels(this._marks.bar, false); - } else { - this.setMarkerLabels(this._marks.spot, true); - this.setMarkerLabels(this._marks.store, true); - this.setMarkerLabels(this._marks.bar, true); - } + if (this._map.getZoom() < 15) { + this.setMarkerLabels(this._marks.spot, false); + this.setMarkerLabels(this._marks.shop, false); + this.setMarkerLabels(this._marks.bar, false); + } else { + this.setMarkerLabels(this._marks.spot, true); + this.setMarkerLabels(this._marks.shop, true); + this.setMarkerLabels(this._marks.bar, true); } }); - this._map.on('baselayerchange', event => { - Utils.setPreference('map-plan-layer', Utils.stripDom(event.name)); - }); resolve(); }); } @@ -528,7 +508,7 @@ class BeerCrackerzAuth extends MapHelper { }); } })); - this._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, { + this._clusters.shop = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, { iconCreateFunction: cluster => { return window.L.divIcon({ className: 'cluster-icon-wrapper', @@ -552,7 +532,7 @@ class BeerCrackerzAuth extends MapHelper { })); this._map.addLayer(this._clusters.spot); - this._map.addLayer(this._clusters.store); + this._map.addLayer(this._clusters.shop); this._map.addLayer(this._clusters.bar); // Load data from local storage, later to be fetched from server @@ -575,13 +555,13 @@ class BeerCrackerzAuth extends MapHelper { } }); - Utils.getStores().then(stores => { - for (let i = 0; i < stores.length; ++i) { + Utils.getShops().then(shops => { + for (let i = 0; i < shops.length; ++i) { // TODO @raph - stores[i].type = 'store'; - stores[i].user = 'messmaker'; - stores[i].userId = 1; - iterateMarkers(stores[i]); + shops[i].type = 'shop'; + shops[i].user = 'messmaker'; + shops[i].userId = 1; + iterateMarkers(shops[i]); } }); @@ -600,6 +580,98 @@ class BeerCrackerzAuth extends MapHelper { } + drawUserMarker() { + if (!this.user.marker) { // Create user marker if not existing + this.user.type = 'user'; + this.user.marker = this.placeMarker(this.user); + // Append circle around marker for accuracy and range for new marker + this.user.radius = this.user.accuracy; + // Callback on marker clicked to add marker on user position + this.user.marker.on('click', this.mapClicked.bind(this)); + } else { // Update user marker position, range, and accuracy circle + this.user.marker.setLatLng(this.user); + } + } + + + placeMarker(options) { + let icon = Markers.black; + if (options.type === 'shop') { + icon = Markers.blue; + } else if (options.type === 'spot') { + icon = Markers.green; + } else if (options.type === 'bar') { + icon = Markers.red; + } else if (options.type === 'user') { + icon = Markers.user; + } + + const marker = window.L.marker([options.lat, options.lng], { icon: icon }).on('click', () => { + // Actual fly to the marker + this.map.flyTo([options.lat, options.lng], 18); + }); + + if (options.dom) { + marker.bindPopup(options.dom); + } + // All markers that are not spot/shop/bar should be appended to the map + if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) { + marker.addTo(this.map); + } + + return marker; + } + + + markPopupFactory(options) { + return new Promise(resolve => { + this._kom.getTemplate(`/static/html/popup/${options.type}.html`).then(dom => { + const element = document.createElement('DIV'); + element.appendChild(dom); + const user = options.user || this.user.username; + const desc = Utils.stripDom(options.description) || this.nls.popup(`${options.type}NoDesc`); + Utils.replaceString(element, `{${options.type.toUpperCase()}_NAME}`, Utils.stripDom(options.name)); + Utils.replaceString(element, `{${options.type.toUpperCase()}_FINDER}`, user); + Utils.replaceString(element, `{${options.type.toUpperCase()}_RATE}`, options.rate + 1); + Utils.replaceString(element, `{${options.type.toUpperCase()}_DESC}`, desc); + Utils.replaceString(element, `{${options.type.toUpperCase()}_FOUND_BY}`, this.nls.popup(`${options.type}FoundBy`)); + // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound) + const rate = element.querySelector(`#${options.type}-rating`); + for (let i = 0; i < options.rate + 1; ++i) { + rate.children[i].classList.add('active'); + } + // Remove edition buttons if marker is not user's one, this does not replace a server test for edition... + //element.removeChild(element.querySelector('#popup-edit')); + // Append circle around marker + options.color = Utils[`${options.type.toUpperCase()}_COLOR`]; + // Create label for new marker + options.tooltip = window.L.tooltip({ + permanent: true, + direction: 'center', + className: 'marker-tooltip', + interactive: true + }).setContent(options.name) + .setLatLng(options); + // Make tooltip visible if preference is to true + options.tooltip.addTo(this.map); + // Send back the popup + resolve(element); + }); + }); + } + + + setMarkerLabels(marks, visible) { + for (let i = 0; i < marks.length; ++i) { + if (visible) { + marks[i].tooltip.addTo(this.map); + } else { + marks[i].tooltip.removeFrom(this.map); + } + } + } + + /** * @method * @name mapClicked @@ -635,7 +707,7 @@ class BeerCrackerzAuth extends MapHelper { /** * @public * @property {Object} marks - * Leaflet.js marks that holds spot/store/bar marks as subkeys + * Leaflet.js marks that holds spot/shop/bar marks as subkeys **/ get marks() { return this._marks; diff --git a/front/src/js/MapHelper.js b/front/src/js/MapHelper.js index a024468..c2a72b1 100644 --- a/front/src/js/MapHelper.js +++ b/front/src/js/MapHelper.js @@ -16,7 +16,7 @@ class MapHelper { placeMarker(options) { let icon = Markers.black; - if (options.type === 'store') { + if (options.type === 'shop') { icon = Markers.blue; } else if (options.type === 'spot') { icon = Markers.green; @@ -38,8 +38,8 @@ class MapHelper { if (options.dom) { marker.bindPopup(options.dom); } - // All markers that are not spot/store/bar should be appended to the map - if (['spot', 'store', 'bar'].indexOf(options.type) === -1) { + // All markers that are not spot/shop/bar should be appended to the map + if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) { marker.addTo(this.map); } @@ -87,23 +87,23 @@ class MapHelper { wrapper: document.createElement('DIV'), title: document.createElement('P'), spot: document.createElement('BUTTON'), - store: document.createElement('BUTTON'), + shop: document.createElement('BUTTON'), bar: document.createElement('BUTTON'), }; // Update class and inner HTMl content according to user's nls dom.wrapper.className = 'new-poi'; dom.title.innerHTML = this.nls.map('newTitle'); dom.spot.innerHTML = this.nls.map('newSpot'); - dom.store.innerHTML = this.nls.map('newStore'); + dom.shop.innerHTML = this.nls.map('newShop'); dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback) dom.spot.dataset.type = 'spot'; - dom.store.dataset.type = 'store'; + dom.shop.dataset.type = 'shop'; dom.bar.dataset.type = 'bar'; // DOM chaining dom.wrapper.appendChild(dom.title); dom.wrapper.appendChild(dom.spot); - dom.wrapper.appendChild(dom.store); + dom.wrapper.appendChild(dom.shop); dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements options.dom = dom.wrapper; @@ -119,7 +119,7 @@ class MapHelper { }; // Buttons click events dom.spot.addEventListener('click', _prepareNewMark); - dom.store.addEventListener('click', _prepareNewMark); + dom.shop.addEventListener('click', _prepareNewMark); dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark marker.on('popupclose', () => { @@ -147,13 +147,13 @@ class MapHelper { const cancel = dom.querySelector(`#${type}-cancel`); const close = dom.querySelector('#modal-close'); // Update nls for template - Utils.replaceString(dom.querySelector(`#nls-${type}-title`), `{{${type.toUpperCase()}_TITLE}}`, this.nls[type]('title')); - Utils.replaceString(dom.querySelector(`#nls-${type}-subtitle`), `{{${type.toUpperCase()}_SUBTITLE}}`, this.nls[type]('subtitle')); - Utils.replaceString(dom.querySelector(`#nls-${type}-name`), `{{${type.toUpperCase()}_NAME}}`, this.nls[type]('nameLabel')); - Utils.replaceString(dom.querySelector(`#nls-${type}-desc`), `{{${type.toUpperCase()}_DESC}}`, this.nls[type]('descLabel')); - Utils.replaceString(dom.querySelector(`#nls-${type}-rate`), `{{${type.toUpperCase()}_RATE}}`, this.nls[type]('rateLabel')); - Utils.replaceString(submit, `{{${type.toUpperCase()}_SUBMIT}}`, this.nls.nav('add')); - Utils.replaceString(cancel, `{{${type.toUpperCase()}_CANCEL}}`, this.nls.nav('cancel')); + Utils.replaceString(dom.querySelector(`#nls-${type}-title`), `{${type.toUpperCase()}_TITLE}`, this.nls[type]('title')); + Utils.replaceString(dom.querySelector(`#nls-${type}-subtitle`), `{${type.toUpperCase()}_SUBTITLE}`, this.nls[type]('subtitle')); + Utils.replaceString(dom.querySelector(`#nls-${type}-name`), `{${type.toUpperCase()}_NAME}`, this.nls[type]('nameLabel')); + Utils.replaceString(dom.querySelector(`#nls-${type}-desc`), `{${type.toUpperCase()}_DESC}`, this.nls[type]('descLabel')); + Utils.replaceString(dom.querySelector(`#nls-${type}-rate`), `{${type.toUpperCase()}_RATE}`, this.nls[type]('rateLabel')); + Utils.replaceString(submit, `{${type.toUpperCase()}_SUBMIT}`, this.nls.nav('add')); + Utils.replaceString(cancel, `{${type.toUpperCase()}_CANCEL}`, this.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map const _cleanDefineUI = () => { options.marker.isBeingDefined = false; @@ -189,8 +189,8 @@ class MapHelper { } - defineNewStore(options) { - this.defineMarkFactory('store', options); + defineNewShop(options) { + this.defineMarkFactory('shop', options); } diff --git a/front/src/js/utils/Kom.js b/front/src/js/utils/Kom.js index 94e51f3..b748ff5 100644 --- a/front/src/js/utils/Kom.js +++ b/front/src/js/utils/Kom.js @@ -135,6 +135,10 @@ class Kom { } else { // Fallback on standard error handling reject(this._getErrorCodeFromHTTPStatus(response.status)); } + } else if (type === 'dom') { + response.text().then(html => { + resolve(document.createRange().createContextualFragment(html)); + }).catch(reject); } else { // Resolution type doesn't exists reject('F_KOM_UNSUPPORTED_TYPE'); } @@ -173,6 +177,11 @@ class Kom { } + _resolveAsDom(response) { + return this._resolveAs('dom', response); + } + + /** @method * @async * @name _resolveAsRaw @@ -251,6 +260,21 @@ class Kom { } + /** @method + * @async + * @name getText + * @public + * @memberof Kom + * @description
    GET HTTP request using the fetch API.
    resolve returns the + * response as a String.
    reject returns an error key as a String. It is + * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    + * @param {String} url - The GET url to fetch data from, in supported back URLs + * @returns {Promise} The request Promise */ + getTemplate(url) { + return this.get(url, this._resolveAsDom.bind(this)); + } + + /** @method * @async * @name getRaw diff --git a/front/src/js/utils/LangManager.js b/front/src/js/utils/LangManager.js index 98ac974..a55d807 100644 --- a/front/src/js/utils/LangManager.js +++ b/front/src/js/utils/LangManager.js @@ -46,8 +46,8 @@ class LangManager { } - store(key) { - return this._values.store[key] || ''; + shop(key) { + return this._values.shop[key] || ''; } diff --git a/front/src/js/utils/Utils.js b/front/src/js/utils/Utils.js index 70c7f56..98aa2c5 100644 --- a/front/src/js/utils/Utils.js +++ b/front/src/js/utils/Utils.js @@ -156,7 +156,7 @@ class Utils { const bc = window.BeerCrackerz; const lang = bc.nls.debug.bind(bc.nls); const updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1; - const marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length; + const marks = bc.marks.spot.length + bc.marks.shop.length + bc.marks.bar.length; element.querySelector('.debug-user-lat').innerHTML = ` ${lang('lat')} : ${user.lat} `; @@ -203,7 +203,7 @@ class Utils { } - static getStores() { + static getShops() { return new Promise(resolve => { Utils.getPoints('shop').then(resolve); }); } @@ -241,7 +241,7 @@ class Utils { } - static get STORE_COLOR() { + static get SHOP_COLOR() { return '#247dc9'; } From b794363f4b1ed851aacc3c036f297cd99d40368a Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 17 Sep 2022 12:36:09 +0200 Subject: [PATCH 018/204] feat(front): save marks to server --- front/src/BeerCrackerz.js | 35 ++++++++++++++++++++--------------- front/src/js/utils/Kom.js | 30 ++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/front/src/BeerCrackerz.js b/front/src/BeerCrackerz.js index 037e410..0e6dd4c 100644 --- a/front/src/BeerCrackerz.js +++ b/front/src/BeerCrackerz.js @@ -5,6 +5,7 @@ import ZoomSlider from './js/ui/ZoomSlider.js'; import LangManager from './js/utils/LangManager.js'; import Notification from './js/ui/Notification.js'; import Rating from './js/ui/Rating.js'; +import Kom from './js/utils/Kom.js'; import Utils from './js/utils/Utils.js'; @@ -109,9 +110,15 @@ class BeerCrackerz extends MapHelper { * @private **/ this._isZooming = false; + /** + * The communication manager to process all server call + * @type {Object} + * @private + **/ + this._kom = new Kom(); /** * The LangManager must be instantiated to handle nls accross the app - * @type {Boolean} + * @type {Object} * @private **/ // The BeerCrackerz app is only initialized once nls are set up @@ -169,8 +176,8 @@ class BeerCrackerz extends MapHelper { **/ _initUser() { return new Promise(resolve => { - // TODO fill user information from server - this._user.id = 42; + // TODO fill user information from server @Raph + this._user.id = 1; this._user.username = 'messmaker'; resolve(); }); @@ -965,9 +972,7 @@ class BeerCrackerz extends MapHelper { // Clear new marker to let user add other stuff this._newMarker = null; // Save new marker in local storage, later to be sent to the server - const marks = JSON.parse(Utils.getPreference(`saved-${options.type}`)) || []; - marks.push(this.formatSavedMarker(options)); - Utils.setPreference(`saved-${options.type}`, JSON.stringify(marks)); + this._kom[`${options.type}Created`](this.formatSavedMarker(options)); } @@ -1040,17 +1045,12 @@ class BeerCrackerz extends MapHelper { **/ formatSavedMarker(mark) { return { - type: mark.type, - lat: mark.lat, - lng: mark.lng, + userId: mark.userId || this.user.id, name: mark.name, description: mark.description, - user: mark.username || this.user.username, - userId: mark.userId || this.user.id, - dom: null, - rate: mark.rate, - marker: null, - circle: null, + lat: mark.lat, + lng: mark.lng, + rate: mark.rate }; } @@ -1230,6 +1230,11 @@ class BeerCrackerz extends MapHelper { } + get kom() { + return this._kom; + } + + /** * @public * @property {Object} nls diff --git a/front/src/js/utils/Kom.js b/front/src/js/utils/Kom.js index b748ff5..15abca6 100644 --- a/front/src/js/utils/Kom.js +++ b/front/src/js/utils/Kom.js @@ -139,8 +139,8 @@ class Kom { response.text().then(html => { resolve(document.createRange().createContextualFragment(html)); }).catch(reject); - } else { // Resolution type doesn't exists - reject('F_KOM_UNSUPPORTED_TYPE'); + } else { // Resolution type doesn't exists, resolving empty + resolve(); } } else { reject('F_KOM_MISSING_ARGUMENT'); @@ -358,6 +358,32 @@ class Kom { } + /* */ + + + savePoint(type, data) { + return new Promise(resolve => { + this.post(`http://localhost:8080/api/${type}/`, data, null).then(resolve); + }); + } + + + spotCreated(data) { + return new Promise(resolve => { this.savePoint('spot', data).then(resolve); }); + } + + + shopCreated(data) { + return new Promise(resolve => { this.savePoint('shop', data).then(resolve); }); + } + + + barCreated(data) { + return new Promise(resolve => { this.savePoint('bar', data).then(resolve); }); + } + + + } From 76e2db470310668bf2c1957250e1601502930bcd Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 17 Sep 2022 13:09:02 +0200 Subject: [PATCH 019/204] fix(front): freezed map after aside loading --- front/src/BeerCrackerzAuth.js | 49 ++++++++++--------- static/dist/BeerCrackerz.bundle.js | 18 +++++-- static/dist/BeerCrackerzAuth.bundle.js | 28 ++--------- .../modal/{editstore.html => editshop.html} | 16 +++--- static/html/modal/hideshow.html | 6 +-- static/html/modal/newshop.html | 19 +++++++ static/html/modal/newstore.html | 19 ------- static/html/popup/{store.html => shop.html} | 10 ++-- static/nls/de.json | 20 ++++---- static/nls/en.json | 20 ++++---- static/nls/es.json | 20 ++++---- static/nls/fr.json | 20 ++++---- 12 files changed, 119 insertions(+), 126 deletions(-) rename static/html/modal/{editstore.html => editshop.html} (51%) create mode 100644 static/html/modal/newshop.html delete mode 100644 static/html/modal/newstore.html rename static/html/popup/{store.html => shop.html} (81%) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 26f8265..521f658 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -80,15 +80,16 @@ class BeerCrackerzAuth { _handleLoginAside() { // Update page nls according to browser language + const aside = document.getElementById('aside'); document.title = this.nls.login('headTitle'); - Utils.replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle')); - Utils.replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError')); - Utils.replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username')); - Utils.replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password')); - Utils.replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot')); - Utils.replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login')); - Utils.replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered')); - Utils.replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register')); + Utils.replaceString(aside, '{LOGIN_SUBTITLE}', this.nls.login('subtitle')); + Utils.replaceString(aside, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError')); + Utils.replaceString(aside, '{LOGIN_USERNAME_LABEL}', this.nls.login('username')); + Utils.replaceString(aside, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password')); + Utils.replaceString(aside, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot')); + Utils.replaceString(aside, '{LOGIN_BUTTON}', this.nls.login('login')); + Utils.replaceString(aside, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered')); + Utils.replaceString(aside, '{LOGIN_REGISTER}', this.nls.login('register')); const error = document.getElementById('login-error'); const username = document.getElementById('username'); @@ -148,16 +149,17 @@ class BeerCrackerzAuth { _handleRegisterAside() { // Update page nls according to browser language + const aside = document.getElementById('aside'); document.title = this.nls.register('headTitle'); - Utils.replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle')); - Utils.replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError')); - Utils.replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username')); - Utils.replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail')); - Utils.replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1')); - Utils.replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2')); - Utils.replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register')); - Utils.replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered')); - Utils.replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login')); + Utils.replaceString(aside, '{REGISTER_SUBTITLE}', this.nls.register('subtitle')); + Utils.replaceString(aside, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError')); + Utils.replaceString(aside, '{REGISTER_USERNAME_LABEL}', this.nls.register('username')); + Utils.replaceString(aside, '{REGISTER_MAIL_LABEL}', this.nls.register('mail')); + Utils.replaceString(aside, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1')); + Utils.replaceString(aside, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2')); + Utils.replaceString(aside, '{REGISTER_BUTTON}', this.nls.register('register')); + Utils.replaceString(aside, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered')); + Utils.replaceString(aside, '{REGISTER_LOGIN}', this.nls.register('login')); const error = document.getElementById('register-error'); const username = document.getElementById('username'); const mail = document.getElementById('mail'); @@ -227,13 +229,14 @@ class BeerCrackerzAuth { _handleResetPasswordAdise() { // Update page nls according to browser language + const aside = document.getElementById('aside'); document.title = this.nls.forgotPassword('headTitle'); - Utils.replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle')); - Utils.replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError')); - Utils.replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail')); - Utils.replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit')); - Utils.replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel')); - Utils.replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login')); + Utils.replaceString(aside, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle')); + Utils.replaceString(aside, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError')); + Utils.replaceString(aside, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail')); + Utils.replaceString(aside, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit')); + Utils.replaceString(aside, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel')); + Utils.replaceString(aside, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login')); const error = document.getElementById('forgot-password-error'); const mail = document.getElementById('mail'); // useful login method for field check and server response check diff --git a/static/dist/BeerCrackerz.bundle.js b/static/dist/BeerCrackerz.bundle.js index 33682ff..0d5a2cc 100644 --- a/static/dist/BeerCrackerz.bundle.js +++ b/static/dist/BeerCrackerz.bundle.js @@ -16,7 +16,7 @@ \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Boolean}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
    \n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server\n _this2._user.id = 42;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-store', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this5.nls.map('planLayerOSM'), \"

    \")] = osm; //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan;\n\n baseMaps[\"

    \".concat(_this5.nls.map('satLayerEsri'), \"

    \")] = esri; //baseMaps[`

    ${this.nls.map('satLayerGeo')}

    `] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.store, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.store, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.store, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.store, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-store\") === 'true') {\n _this7._map.addLayer(_this7._clusters.store);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n spots[i].lat = spots[i].latitude;\n spots[i].lng = spots[i].longitude;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 42;\n stores[i].lat = stores[i].latitude;\n stores[i].lng = stores[i].longitude;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n bars[i].lat = bars[i].latitude;\n bars[i].lng = bars[i].longitude;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
    \n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/stores/bars marks. This label is basically the\n * mark name given by its creator.\n *
    \n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.store, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/stores/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
    \n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.store, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/stores/bars must be given as an argument\n *
    \n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
    \n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
    \n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate(\"/static/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(submit, \"{\".concat(options.type.toUpperCase(), \"_SUBMIT}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(cancel, \"{\".concat(options.type.toUpperCase(), \"_CANCEL}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i = 0; _i < _this8._marks[options.type].length; ++_i) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
    \n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('/static/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{MODAL_DESC}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{MODAL_CANCEL}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{MODAL_DELETE}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
    \n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('/static/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{ACCURACY_USER_MODAL}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{DEBUG_USER_MODAL}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{BEERCRACKERZ_DESC}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/stores/bars\n *
    \n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].fetchTemplate('/static/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{MODAL_TITLE}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{LABELS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{CIRCLES_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{SPOTS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-stores\"), \"{STORES_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowStores'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{BARS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{MODAL_CLOSE}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-store') === 'true') {\n document.getElementById('show-stores').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-stores').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'store'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
    \n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n var marks = JSON.parse(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference(\"saved-\".concat(options.type))) || [];\n marks.push(this.formatSavedMarker(options));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(marks));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/stores/bars) and for the user marker\n *
    \n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.store);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
    \n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n type: mark.type,\n lat: mark.lat,\n lng: mark.lng,\n name: mark.name,\n description: mark.description,\n user: mark.username || this.user.username,\n userId: mark.userId || this.user.id,\n dom: null,\n rate: mark.rate,\n marker: null,\n circle: null\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will open a mark edition modal\n *
    \n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will delete a mark after prompting the user if he trully wants to\n *
    \n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i2 = 0; _i2 < _this13._marks[options.type].length; ++_i2) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i2]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The addDebugUI() method appends the debug DOM element to the document body\n *
    \n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The removeDebugUI() method remove the debug DOM element from the document body\n *
    \n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateDebugUI() method will update informations held in the debug DOM\n *
    \n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
    \n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
    \n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The communication manager to process all server call\n * @type {Object}\n * @private\n **/\n\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"]();\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Object}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
    \n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server @Raph\n _this2._user.id = 1;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-shop') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-shop', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this5.nls.map('planLayerOSM'), \"

    \")] = osm; //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan;\n\n baseMaps[\"

    \".concat(_this5.nls.map('satLayerEsri'), \"

    \")] = esri; //baseMaps[`

    ${this.nls.map('satLayerGeo')}

    `] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.shop, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.shop, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.shop, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.shop, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.shop = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-shop\") === 'true') {\n _this7._map.addLayer(_this7._clusters.shop);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n // TODO @raph\n shops[i].type = 'shop';\n shops[i].user = 'messmaker';\n shops[i].userId = 42;\n iterateMarkers(shops[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
    \n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/shops/bars marks. This label is basically the\n * mark name given by its creator.\n *
    \n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.shop, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/shops/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
    \n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.shop, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/shops/bars must be given as an argument\n *
    \n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
    \n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
    \n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate(\"/static/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(submit, \"{\".concat(options.type.toUpperCase(), \"_SUBMIT}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(cancel, \"{\".concat(options.type.toUpperCase(), \"_CANCEL}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i = 0; _i < _this8._marks[options.type].length; ++_i) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
    \n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate('/static/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{MODAL_DESC}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{MODAL_CANCEL}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{MODAL_DELETE}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
    \n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate('/static/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{ACCURACY_USER_MODAL}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{DEBUG_USER_MODAL}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{BEERCRACKERZ_DESC}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/shops/bars\n *
    \n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate('/static/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{MODAL_TITLE}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{LABELS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{CIRCLES_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{SPOTS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-shops\"), \"{SHOPS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowShops'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{BARS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{MODAL_CLOSE}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-shop') === 'true') {\n document.getElementById('show-shops').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-shops').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'shop'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
    \n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n this._kom[\"\".concat(options.type, \"Created\")](this.formatSavedMarker(options));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/shops/bars) and for the user marker\n *
    \n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.shop);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
    \n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n userId: mark.userId || this.user.id,\n name: mark.name,\n description: mark.description,\n lat: mark.lat,\n lng: mark.lng,\n rate: mark.rate\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will open a mark edition modal\n *
    \n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will delete a mark after prompting the user if he trully wants to\n *
    \n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i2 = 0; _i2 < _this13._marks[options.type].length; ++_i2) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i2]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The addDebugUI() method appends the debug DOM element to the document body\n *
    \n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The removeDebugUI() method remove the debug DOM element from the document body\n *
    \n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateDebugUI() method will update informations held in the debug DOM\n *
    \n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
    \n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
    \n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n }, {\n key: \"kom\",\n get: function get() {\n return this._kom;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); /***/ }), @@ -26,7 +26,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n /* TODO handle unlogged display \n if (user !== this.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', this.editMarker.bind(this, options), false);\n element.querySelector('#delete-mark').addEventListener('click', this.deleteMarker.bind(this, options), false);\n }\n */\n // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'shop') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/shop/bar should be appended to the map\n\n\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n shop: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.shop.innerHTML = this.nls.map('newShop');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.shop.dataset.type = 'shop';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.shop);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.shop.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{\".concat(type.toUpperCase(), \"_TITLE}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{\".concat(type.toUpperCase(), \"_SUBTITLE}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{\".concat(type.toUpperCase(), \"_NAME}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{\".concat(type.toUpperCase(), \"_DESC}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{\".concat(type.toUpperCase(), \"_RATE}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{\".concat(type.toUpperCase(), \"_SUBMIT}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{\".concat(type.toUpperCase(), \"_CANCEL}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewShop\",\n value: function defineNewShop(options) {\n this.defineMarkFactory('shop', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n /* TODO handle unlogged display \n if (user !== this.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', this.editMarker.bind(this, options), false);\n element.querySelector('#delete-mark').addEventListener('click', this.deleteMarker.bind(this, options), false);\n }\n */\n // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); /***/ }), @@ -60,13 +60,23 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), +/***/ "./src/js/utils/Kom.js": +/*!*****************************!*\ + !*** ./src/js/utils/Kom.js ***! + \*****************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Kom = /*#__PURE__*/function () {\n /** @summary

    Server communication abstraction

    \n * @author Arthur Beaulieu\n * @since June 2020\n * @description
    This class is the main object to deal with when requesting something from the server.
    \n * It handle all urls calls (GET, POST), treat responses or handle errors using\n * Promise.
    Because it uses Promise, success and errors are to be handled in the caller\n * function, using .then() and .catch(). To properly deal with POST request,\n * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */\n function Kom() {\n _classCallCheck(this, Kom);\n\n /** @private\n * @member {string} - User session CSRF token to use in POST request */\n this._csrfToken = this._getCsrfCookie();\n /** @private\n * @member {array[]} - Array of HTTP headers to be used in HTTP calls */\n\n this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created\n\n this._checkValidity();\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getCsrfCookie\n * @private\n * @memberof Kom\n * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty\n * string by default. This method is required to be called on construction.
    \n * @return {string} - The CSRF token string */\n\n\n _createClass(Kom, [{\n key: \"_getCsrfCookie\",\n value: function _getCsrfCookie() {\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n\n for (var i = 0; i < cookies.length; ++i) {\n // Parse current cookie to extract its properties\n var cookie = cookies[i].split('=');\n\n if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) {\n // Found a matching cookie for csrftoken value, return as decoded string\n return decodeURIComponent(cookie[1]);\n }\n }\n } // Return empty string by default, POST calls may fail\n\n\n return '';\n }\n /** @method\n * @name _createRequestHeaders\n * @private\n * @memberof Kom\n * @description
    Fills Kom _headers private member array, to use in HTTP requests later on.\n * This method is required to be called on construction.
    \n * @return {array[]} - The headers array, length 3, to be used in HTTP requests */\n\n }, {\n key: \"_createRequestHeaders\",\n value: function _createRequestHeaders() {\n return [['Content-Type', 'application/json; charset=UTF-8'], ['Accept', 'application/json'], ['X-XSRF-TOKEN', this._csrfToken]];\n }\n /** @method\n * @async\n * @name _checkValidity\n * @private\n * @memberof Kom\n * @description
    Check the Kom instance validity to ensure its properties validity.
    */\n\n }, {\n key: \"_checkValidity\",\n value: function _checkValidity() {\n if (this._csrfToken !== '') {\n if (this._headers.length !== 3) {\n console.error('F_KOM_HEADERS_ERROR');\n }\n } else {\n console.error('F_KOM_NO_CSRF_TOKEN');\n }\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getErrorCodeFromHTTPStatus\n * @private\n * @memberof Kom\n * @description
    This method is called whenever a server request didn't went well. In case a request (from\n * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled\n * in the user interface (with notification, console or else).
    \n * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration\n * @return {string} The HTTP status as an error code */\n\n }, {\n key: \"_getErrorCodeFromHTTPStatus\",\n value: function _getErrorCodeFromHTTPStatus(code) {\n if (code === 404) {\n return 'B_KOM_NOT_FOUND';\n } else if (code === 403) {\n return 'B_KOM_ACCESS_FORBIDDEN';\n } else if (code === 500) {\n return 'B_KOM_INTERNAL_ERROR';\n } else {\n return \"B_KOM_UNKNOWN_ERROR\";\n }\n }\n /** @method\n * @async\n * @name _resolveAs\n * @private\n * @memberof Kom\n * @description
    Generic tool method used by private methods on fetch responses to format output in the provided\n * format. It must be either `json`, `text` or `raw`.
    \n * @param {String} type - The type of resolution, can be `json`, `text` or `raw`\n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAs\",\n value: function _resolveAs(type, response) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (response) {\n if (type === 'raw') {\n // Raw are made in XMLHttpRequest and need special handling\n if (response.status === 200) {\n resolve(response.responseText);\n } else {\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'json' || type === 'text') {\n // Call are made using fetch API\n if (response[type]) {\n resolve(response[type]());\n } else {\n // Fallback on standard error handling\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'dom') {\n response.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n } else {\n // Resolution type doesn't exists, resolving empty\n resolve();\n }\n } else {\n reject('F_KOM_MISSING_ARGUMENT');\n }\n });\n }\n /** @method\n * @async\n * @name _resolveAsJSON\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be\n * read in JavaScript code as objects.
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsJSON\",\n value: function _resolveAsJSON(response) {\n return this._resolveAs('json', response);\n }\n /** @method\n * @async\n * @name _resolveAsText\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as text to be\n * read in JavaScript code as string (mostly to parse HTML templates).
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsText\",\n value: function _resolveAsText(response) {\n return this._resolveAs('text', response);\n }\n }, {\n key: \"_resolveAsDom\",\n value: function _resolveAsDom(response) {\n return this._resolveAs('dom', response);\n }\n /** @method\n * @async\n * @name _resolveAsRaw\n * @private\n * @memberof Kom\n * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    \n * @param {Object} response - The XmlHTTPRequest response status object\n * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */\n\n }, {\n key: \"_resolveAsRaw\",\n value: function _resolveAsRaw(response) {\n return this._resolveAs('raw', response);\n }\n }, {\n key: \"_xhrCall\",\n value: function _xhrCall(url, verb, data) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open(verb, url, true);\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n xhr.onreadystatechange = function (response) {\n if (response.target.readyState === 4) {\n // Ready state changed has reach the response state\n _this2._resolveAsRaw(response.target).then(resolve)[\"catch\"](reject);\n }\n };\n\n xhr.onerror = function () {\n reject('F_KOM_XHR_ERROR');\n };\n\n xhr.send(data);\n });\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @async\n * @name get\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as an Object.
    reject returns an error key as a String.\n * It is meant to perform API call to access database through the user interface.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"get\",\n value: function get(url) {\n var _this3 = this;\n\n var resolution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers([_this3._headers[0]]) // Content type to JSON\n\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getText\",\n value: function getText(url) {\n return this.get(url, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getTemplate\",\n value: function getTemplate(url) {\n return this.get(url, this._resolveAsDom.bind(this));\n }\n /** @method\n * @async\n * @name getRaw\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using an XMLHttpRequest, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getRaw\",\n value: function getRaw(url) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._xhrCall(url, 'GET', null).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name post\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as an Object.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"post\",\n value: function post(url, data) {\n var _this5 = this;\n\n var resolution = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(_this5._headers),\n // POST needs all previously defined headers\n body: JSON.stringify(data)\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name postText\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as a String.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postText\",\n value: function postText(url, data) {\n return this.post(url, data, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name postRaw\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postRaw\",\n value: function postRaw(url, data) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6._xhrCall(url, 'POST', JSON.stringify(data)).then(resolve)[\"catch\"](reject);\n });\n }\n /* */\n\n }, {\n key: \"savePoint\",\n value: function savePoint(type, data) {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n _this7.post(\"http://localhost:8080/api/\".concat(type, \"/\"), data, null).then(resolve);\n });\n }\n }, {\n key: \"spotCreated\",\n value: function spotCreated(data) {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n _this8.savePoint('spot', data).then(resolve);\n });\n }\n }, {\n key: \"shopCreated\",\n value: function shopCreated(data) {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n _this9.savePoint('shop', data).then(resolve);\n });\n }\n }, {\n key: \"barCreated\",\n value: function barCreated(data) {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n _this10.savePoint('bar', data).then(resolve);\n });\n }\n }]);\n\n return Kom;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Kom);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Kom.js?"); + +/***/ }), + /***/ "./src/js/utils/LangManager.js": /*!*************************************!*\ !*** ./src/js/utils/LangManager.js ***! \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"shop\",\n value: function shop(key) {\n return this._values.shop[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); /***/ }), @@ -96,7 +106,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getStores\",\n value: function getStores() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.shop.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getShops\",\n value: function getShops() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"SHOP_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); /***/ }), diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index bde2114..1149329 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,17 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerzAuth, _MapHelper);\n\n var _super = _createSuper(BeerCrackerzAuth);\n\n function BeerCrackerzAuth() {\n var _this;\n\n _classCallCheck(this, BeerCrackerzAuth);\n\n _this = _super.call(this);\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, stores and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n store: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n store: {},\n bar: {}\n };\n _this._aside = null;\n _this._isAsideExpanded = true;\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this2._kom.post('/api/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this3 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/register/submit').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this4 = this;\n\n // Update page nls according to browser language\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(document.body, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].postReq('/api/password/reset').then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this4.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].fetchTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this5._aside = document.getElementById('aside');\n _this5._aside.innerHTML = ''; // Clear HTML content\n\n _this5._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this6 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this6._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this7._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this7._user.lat, _this7._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this7._map); // Place user marker on the map\n\n _this7.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this7._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this7.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this7.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this7._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this7._map); // Init zoom slider when map has been created\n\n _this7._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this7._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].OPTIMIZED_ACCURACY;\n _this8._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this8._user.lat = position.coords.latitude;\n _this8._user.lng = position.coords.longitude;\n _this8._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this8._map) {\n _this8.drawUserMarker();\n\n _this8._map.setView(_this8._user);\n }\n }, null, options);\n resolve();\n } else {\n _this8._notification.raise(_this8.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this9._map.on('click', _this9.mapClicked.bind(_this9)); // Map is dragged by user mouse/finger\n\n\n _this9._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this9._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this9.toggleFocusLock();\n }\n }); // Map events\n\n\n _this9._map.on('zoomstart', function () {\n _this9._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this9.setMarkerCircles(_this9._marks.spot, false);\n\n _this9.setMarkerCircles(_this9._marks.store, false);\n\n _this9.setMarkerCircles(_this9._marks.bar, false);\n\n _this9.setMarkerCircles([_this9._user], false);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], false);\n }\n });\n\n _this9._map.on('zoomend', function () {\n _this9._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this9._map.getZoom() >= 15) {\n _this9.setMarkerCircles(_this9._marks.spot, true);\n\n _this9.setMarkerCircles(_this9._marks.store, true);\n\n _this9.setMarkerCircles(_this9._marks.bar, true);\n\n _this9.setMarkerCircles([_this9._user], true);\n\n _this9.setMarkerCircles([{\n circle: _this9._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this9._map.getZoom() < 15) {\n _this9.setMarkerLabels(_this9._marks.spot, false);\n\n _this9.setMarkerLabels(_this9._marks.store, false);\n\n _this9.setMarkerLabels(_this9._marks.bar, false);\n } else {\n _this9.setMarkerLabels(_this9._marks.spot, true);\n\n _this9.setMarkerLabels(_this9._marks.store, true);\n\n _this9.setMarkerLabels(_this9._marks.bar, true);\n }\n }\n });\n\n _this9._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this10._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.store = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this10._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n\n _this10._map.addLayer(_this10._clusters.spot);\n\n _this10._map.addLayer(_this10._clusters.store);\n\n _this10._map.addLayer(_this10._clusters.bar); // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this10.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this10.placeMarker(mark);\n\n _this10._marks[mark.type].push(mark);\n\n _this10._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 1;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getStores().then(function (stores) {\n for (var i = 0; i < stores.length; ++i) {\n // TODO @raph\n stores[i].type = 'store';\n stores[i].user = 'messmaker';\n stores[i].userId = 1;\n iterateMarkers(stores[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 1;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/store/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); - -/***/ }), - -/***/ "./src/js/MapHelper.js": -/*!*****************************!*\ - !*** ./src/js/MapHelper.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'store') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/store/bar should be appended to the map\n\n\n if (['spot', 'store', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n store: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.store.innerHTML = this.nls.map('newStore');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.store.dataset.type = 'store';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.store);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.store.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{{\".concat(type.toUpperCase(), \"_TITLE}}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{{\".concat(type.toUpperCase(), \"_SUBTITLE}}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{{\".concat(type.toUpperCase(), \"_NAME}}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{{\".concat(type.toUpperCase(), \"_DESC}}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{{\".concat(type.toUpperCase(), \"_RATE}}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{{\".concat(type.toUpperCase(), \"_SUBMIT}}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{{\".concat(type.toUpperCase(), \"_CANCEL}}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewStore\",\n value: function defineNewStore(options) {\n this.defineMarkFactory('store', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n /* TODO handle unlogged display \n if (user !== this.user.username) {\n element.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', this.editMarker.bind(this, options), false);\n element.querySelector('#delete-mark').addEventListener('click', this.deleteMarker.bind(this, options), false);\n }\n */\n // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n this._aside = null;\n this._isAsideExpanded = true;\n this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](window.navigator.language.substring(0, 2), this._init.bind(this));\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this = this;\n\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this._kom.post('/api/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this2._kom.post('/api/register/submit', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this3 = this;\n\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this3._kom.post('/api/password/reset', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._kom.getTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this4._aside = document.getElementById('aside');\n _this4._aside.innerHTML = ''; // Clear HTML content\n\n _this4._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n var _this5 = this;\n\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.getElementById('aside').style.right = '-40rem';\n document.documentElement.style.setProperty('--aside-width', '0'); // Refreshing map to load new tiles\n\n requestAnimationFrame(function () {\n _this5._map.invalidateSize();\n });\n setTimeout(function () {\n document.getElementById('aside-expander').style.left = '-44.8rem';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n }, 100);\n } else {\n this._isAsideExpanded = true;\n document.getElementById('aside').style.maxWidth = '40rem';\n document.getElementById('aside').style.right = '0';\n document.getElementById('aside-expander').style.transition = 'none';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n setTimeout(function () {\n document.documentElement.style.setProperty('--aside-width', '40rem');\n document.getElementById('aside').style.maxWidth = 'var(--aside-width)';\n document.getElementById('aside-expander').style.transition = 'all .5s';\n }, 500);\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this6._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this6._user.lat, _this6._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this6._map); // Place user marker on the map\n\n _this6.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this6._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this6.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this6.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this6._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this6._map); // Init zoom slider when map has been created\n\n _this6._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_this6._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this7._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this7._user.lat = position.coords.latitude;\n _this7._user.lng = position.coords.longitude;\n _this7._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this7._map) {\n _this7.drawUserMarker();\n\n _this7._map.setView(_this7._user);\n }\n }, null, _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY);\n resolve();\n } else {\n _this7._notification.raise(_this7.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this8._map.on('click', _this8.mapClicked.bind(_this8)); // Map is dragged by user mouse/finger\n\n\n _this8._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this8._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n });\n }); // Map events\n\n\n _this8._map.on('zoomstart', function () {\n _this8._isZooming = true;\n });\n\n _this8._map.on('zoomend', function () {\n _this8._isZooming = false; // Auto hide labels if zoom level is too high (and restore it when needed)\n\n if (_this8._map.getZoom() < 15) {\n _this8.setMarkerLabels(_this8._marks.spot, false);\n\n _this8.setMarkerLabels(_this8._marks.shop, false);\n\n _this8.setMarkerLabels(_this8._marks.bar, false);\n } else {\n _this8.setMarkerLabels(_this8._marks.spot, true);\n\n _this8.setMarkerLabels(_this8._marks.shop, true);\n\n _this8.setMarkerLabels(_this8._marks.bar, true);\n }\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this9._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this9._clusters.shop = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this9._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n\n _this9._map.addLayer(_this9._clusters.spot);\n\n _this9._map.addLayer(_this9._clusters.shop);\n\n _this9._map.addLayer(_this9._clusters.bar); // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this9.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this9.placeMarker(mark);\n\n _this9._marks[mark.type].push(mark);\n\n _this9._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 1;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n // TODO @raph\n shops[i].type = 'shop';\n shops[i].user = 'messmaker';\n shops[i].userId = 1;\n iterateMarkers(shops[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 1;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy; // Callback on marker clicked to add marker on user position\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n }, {\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this10 = this;\n\n var icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].black;\n\n if (options.type === 'shop') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this10.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/shop/bar should be appended to the map\n\n\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this11 = this;\n\n return new Promise(function (resolve) {\n _this11._kom.getTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this11.user.username;\n\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(options.description) || _this11.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(options.name));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this11.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n //element.removeChild(element.querySelector('#popup-edit'));\n // Append circle around marker\n\n\n options.color = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")]; // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Make tooltip visible if preference is to true\n\n options.tooltip.addTo(_this11.map); // Send back the popup\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), @@ -40,16 +30,6 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ }), -/***/ "./src/js/ui/Rating.js": -/*!*****************************!*\ - !*** ./src/js/ui/Rating.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); - -/***/ }), - /***/ "./src/js/ui/ZoomSlider.js": /*!*********************************!*\ !*** ./src/js/ui/ZoomSlider.js ***! @@ -66,7 +46,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*****************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Kom = /*#__PURE__*/function () {\n /** @summary

    Server communication abstraction

    \n * @author Arthur Beaulieu\n * @since June 2020\n * @description
    This class is the main object to deal with when requesting something from the server.
    \n * It handle all urls calls (GET, POST), treat responses or handle errors using\n * Promise.
    Because it uses Promise, success and errors are to be handled in the caller\n * function, using .then() and .catch(). To properly deal with POST request,\n * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */\n function Kom() {\n _classCallCheck(this, Kom);\n\n /** @private\n * @member {string} - User session CSRF token to use in POST request */\n this._csrfToken = this._getCsrfCookie();\n /** @private\n * @member {array[]} - Array of HTTP headers to be used in HTTP calls */\n\n this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created\n\n this._checkValidity();\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getCsrfCookie\n * @private\n * @memberof Kom\n * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty\n * string by default. This method is required to be called on construction.
    \n * @return {string} - The CSRF token string */\n\n\n _createClass(Kom, [{\n key: \"_getCsrfCookie\",\n value: function _getCsrfCookie() {\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n\n for (var i = 0; i < cookies.length; ++i) {\n // Parse current cookie to extract its properties\n var cookie = cookies[i].split('=');\n\n if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) {\n // Found a matching cookie for csrftoken value, return as decoded string\n return decodeURIComponent(cookie[1]);\n }\n }\n } // Return empty string by default, POST calls may fail\n\n\n return '';\n }\n /** @method\n * @name _createRequestHeaders\n * @private\n * @memberof Kom\n * @description
    Fills Kom _headers private member array, to use in HTTP requests later on.\n * This method is required to be called on construction.
    \n * @return {array[]} - The headers array, length 3, to be used in HTTP requests */\n\n }, {\n key: \"_createRequestHeaders\",\n value: function _createRequestHeaders() {\n return [['Content-Type', 'application/json; charset=UTF-8'], ['Accept', 'application/json'], ['X-XSRF-TOKEN', this._csrfToken]];\n }\n /** @method\n * @async\n * @name _checkValidity\n * @private\n * @memberof Kom\n * @description
    Check the Kom instance validity to ensure its properties validity.
    */\n\n }, {\n key: \"_checkValidity\",\n value: function _checkValidity() {\n if (this._csrfToken !== '') {\n if (this._headers.length !== 3) {\n console.error('F_KOM_HEADERS_ERROR');\n }\n } else {\n console.error('F_KOM_NO_CSRF_TOKEN');\n }\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getErrorCodeFromHTTPStatus\n * @private\n * @memberof Kom\n * @description
    This method is called whenever a server request didn't went well. In case a request (from\n * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled\n * in the user interface (with notification, console or else).
    \n * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration\n * @return {string} The HTTP status as an error code */\n\n }, {\n key: \"_getErrorCodeFromHTTPStatus\",\n value: function _getErrorCodeFromHTTPStatus(code) {\n if (code === 404) {\n return 'B_KOM_NOT_FOUND';\n } else if (code === 403) {\n return 'B_KOM_ACCESS_FORBIDDEN';\n } else if (code === 500) {\n return 'B_KOM_INTERNAL_ERROR';\n } else {\n return \"B_KOM_UNKNOWN_ERROR\";\n }\n }\n /** @method\n * @async\n * @name _resolveAs\n * @private\n * @memberof Kom\n * @description
    Generic tool method used by private methods on fetch responses to format output in the provided\n * format. It must be either `json`, `text` or `raw`.
    \n * @param {String} type - The type of resolution, can be `json`, `text` or `raw`\n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAs\",\n value: function _resolveAs(type, response) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (response) {\n if (type === 'raw') {\n // Raw are made in XMLHttpRequest and need special handling\n if (response.status === 200) {\n resolve(response.responseText);\n } else {\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'json' || type === 'text') {\n // Call are made using fetch API\n if (response[type]) {\n resolve(response[type]());\n } else {\n // Fallback on standard error handling\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else {\n // Resolution type doesn't exists\n reject('F_KOM_UNSUPPORTED_TYPE');\n }\n } else {\n reject('F_KOM_MISSING_ARGUMENT');\n }\n });\n }\n /** @method\n * @async\n * @name _resolveAsJSON\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be\n * read in JavaScript code as objects.
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsJSON\",\n value: function _resolveAsJSON(response) {\n return this._resolveAs('json', response);\n }\n /** @method\n * @async\n * @name _resolveAsText\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as text to be\n * read in JavaScript code as string (mostly to parse HTML templates).
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsText\",\n value: function _resolveAsText(response) {\n return this._resolveAs('text', response);\n }\n /** @method\n * @async\n * @name _resolveAsRaw\n * @private\n * @memberof Kom\n * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    \n * @param {Object} response - The XmlHTTPRequest response status object\n * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */\n\n }, {\n key: \"_resolveAsRaw\",\n value: function _resolveAsRaw(response) {\n return this._resolveAs('raw', response);\n }\n }, {\n key: \"_xhrCall\",\n value: function _xhrCall(url, verb, data) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open(verb, url, true);\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n xhr.onreadystatechange = function (response) {\n if (response.target.readyState === 4) {\n // Ready state changed has reach the response state\n _this2._resolveAsRaw(response.target).then(resolve)[\"catch\"](reject);\n }\n };\n\n xhr.onerror = function () {\n reject('F_KOM_XHR_ERROR');\n };\n\n xhr.send(data);\n });\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @async\n * @name get\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as an Object.
    reject returns an error key as a String.\n * It is meant to perform API call to access database through the user interface.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"get\",\n value: function get(url) {\n var _this3 = this;\n\n var resolution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers([_this3._headers[0]]) // Content type to JSON\n\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getText\",\n value: function getText(url) {\n return this.get(url, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name getRaw\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using an XMLHttpRequest, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getRaw\",\n value: function getRaw(url) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._xhrCall(url, 'GET', null).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name post\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as an Object.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"post\",\n value: function post(url, data) {\n var _this5 = this;\n\n var resolution = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(_this5._headers),\n // POST needs all previously defined headers\n body: JSON.stringify(data)\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name postText\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as a String.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postText\",\n value: function postText(url, data) {\n return this.post(url, data, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name postRaw\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postRaw\",\n value: function postRaw(url, data) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6._xhrCall(url, 'POST', JSON.stringify(data)).then(resolve)[\"catch\"](reject);\n });\n }\n }]);\n\n return Kom;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Kom);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Kom.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Kom = /*#__PURE__*/function () {\n /** @summary

    Server communication abstraction

    \n * @author Arthur Beaulieu\n * @since June 2020\n * @description
    This class is the main object to deal with when requesting something from the server.
    \n * It handle all urls calls (GET, POST), treat responses or handle errors using\n * Promise.
    Because it uses Promise, success and errors are to be handled in the caller\n * function, using .then() and .catch(). To properly deal with POST request,\n * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */\n function Kom() {\n _classCallCheck(this, Kom);\n\n /** @private\n * @member {string} - User session CSRF token to use in POST request */\n this._csrfToken = this._getCsrfCookie();\n /** @private\n * @member {array[]} - Array of HTTP headers to be used in HTTP calls */\n\n this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created\n\n this._checkValidity();\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getCsrfCookie\n * @private\n * @memberof Kom\n * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty\n * string by default. This method is required to be called on construction.
    \n * @return {string} - The CSRF token string */\n\n\n _createClass(Kom, [{\n key: \"_getCsrfCookie\",\n value: function _getCsrfCookie() {\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n\n for (var i = 0; i < cookies.length; ++i) {\n // Parse current cookie to extract its properties\n var cookie = cookies[i].split('=');\n\n if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) {\n // Found a matching cookie for csrftoken value, return as decoded string\n return decodeURIComponent(cookie[1]);\n }\n }\n } // Return empty string by default, POST calls may fail\n\n\n return '';\n }\n /** @method\n * @name _createRequestHeaders\n * @private\n * @memberof Kom\n * @description
    Fills Kom _headers private member array, to use in HTTP requests later on.\n * This method is required to be called on construction.
    \n * @return {array[]} - The headers array, length 3, to be used in HTTP requests */\n\n }, {\n key: \"_createRequestHeaders\",\n value: function _createRequestHeaders() {\n return [['Content-Type', 'application/json; charset=UTF-8'], ['Accept', 'application/json'], ['X-XSRF-TOKEN', this._csrfToken]];\n }\n /** @method\n * @async\n * @name _checkValidity\n * @private\n * @memberof Kom\n * @description
    Check the Kom instance validity to ensure its properties validity.
    */\n\n }, {\n key: \"_checkValidity\",\n value: function _checkValidity() {\n if (this._csrfToken !== '') {\n if (this._headers.length !== 3) {\n console.error('F_KOM_HEADERS_ERROR');\n }\n } else {\n console.error('F_KOM_NO_CSRF_TOKEN');\n }\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getErrorCodeFromHTTPStatus\n * @private\n * @memberof Kom\n * @description
    This method is called whenever a server request didn't went well. In case a request (from\n * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled\n * in the user interface (with notification, console or else).
    \n * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration\n * @return {string} The HTTP status as an error code */\n\n }, {\n key: \"_getErrorCodeFromHTTPStatus\",\n value: function _getErrorCodeFromHTTPStatus(code) {\n if (code === 404) {\n return 'B_KOM_NOT_FOUND';\n } else if (code === 403) {\n return 'B_KOM_ACCESS_FORBIDDEN';\n } else if (code === 500) {\n return 'B_KOM_INTERNAL_ERROR';\n } else {\n return \"B_KOM_UNKNOWN_ERROR\";\n }\n }\n /** @method\n * @async\n * @name _resolveAs\n * @private\n * @memberof Kom\n * @description
    Generic tool method used by private methods on fetch responses to format output in the provided\n * format. It must be either `json`, `text` or `raw`.
    \n * @param {String} type - The type of resolution, can be `json`, `text` or `raw`\n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAs\",\n value: function _resolveAs(type, response) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (response) {\n if (type === 'raw') {\n // Raw are made in XMLHttpRequest and need special handling\n if (response.status === 200) {\n resolve(response.responseText);\n } else {\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'json' || type === 'text') {\n // Call are made using fetch API\n if (response[type]) {\n resolve(response[type]());\n } else {\n // Fallback on standard error handling\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'dom') {\n response.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n } else {\n // Resolution type doesn't exists, resolving empty\n resolve();\n }\n } else {\n reject('F_KOM_MISSING_ARGUMENT');\n }\n });\n }\n /** @method\n * @async\n * @name _resolveAsJSON\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be\n * read in JavaScript code as objects.
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsJSON\",\n value: function _resolveAsJSON(response) {\n return this._resolveAs('json', response);\n }\n /** @method\n * @async\n * @name _resolveAsText\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as text to be\n * read in JavaScript code as string (mostly to parse HTML templates).
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsText\",\n value: function _resolveAsText(response) {\n return this._resolveAs('text', response);\n }\n }, {\n key: \"_resolveAsDom\",\n value: function _resolveAsDom(response) {\n return this._resolveAs('dom', response);\n }\n /** @method\n * @async\n * @name _resolveAsRaw\n * @private\n * @memberof Kom\n * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    \n * @param {Object} response - The XmlHTTPRequest response status object\n * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */\n\n }, {\n key: \"_resolveAsRaw\",\n value: function _resolveAsRaw(response) {\n return this._resolveAs('raw', response);\n }\n }, {\n key: \"_xhrCall\",\n value: function _xhrCall(url, verb, data) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open(verb, url, true);\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n xhr.onreadystatechange = function (response) {\n if (response.target.readyState === 4) {\n // Ready state changed has reach the response state\n _this2._resolveAsRaw(response.target).then(resolve)[\"catch\"](reject);\n }\n };\n\n xhr.onerror = function () {\n reject('F_KOM_XHR_ERROR');\n };\n\n xhr.send(data);\n });\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @async\n * @name get\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as an Object.
    reject returns an error key as a String.\n * It is meant to perform API call to access database through the user interface.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"get\",\n value: function get(url) {\n var _this3 = this;\n\n var resolution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers([_this3._headers[0]]) // Content type to JSON\n\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getText\",\n value: function getText(url) {\n return this.get(url, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getTemplate\",\n value: function getTemplate(url) {\n return this.get(url, this._resolveAsDom.bind(this));\n }\n /** @method\n * @async\n * @name getRaw\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using an XMLHttpRequest, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getRaw\",\n value: function getRaw(url) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._xhrCall(url, 'GET', null).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name post\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as an Object.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"post\",\n value: function post(url, data) {\n var _this5 = this;\n\n var resolution = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(_this5._headers),\n // POST needs all previously defined headers\n body: JSON.stringify(data)\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name postText\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as a String.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postText\",\n value: function postText(url, data) {\n return this.post(url, data, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name postRaw\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postRaw\",\n value: function postRaw(url, data) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6._xhrCall(url, 'POST', JSON.stringify(data)).then(resolve)[\"catch\"](reject);\n });\n }\n /* */\n\n }, {\n key: \"savePoint\",\n value: function savePoint(type, data) {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n _this7.post(\"http://localhost:8080/api/\".concat(type, \"/\"), data, null).then(resolve);\n });\n }\n }, {\n key: \"spotCreated\",\n value: function spotCreated(data) {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n _this8.savePoint('spot', data).then(resolve);\n });\n }\n }, {\n key: \"shopCreated\",\n value: function shopCreated(data) {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n _this9.savePoint('shop', data).then(resolve);\n });\n }\n }, {\n key: \"barCreated\",\n value: function barCreated(data) {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n _this10.savePoint('bar', data).then(resolve);\n });\n }\n }]);\n\n return Kom;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Kom);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Kom.js?"); /***/ }), @@ -76,7 +56,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"store\",\n value: function store(key) {\n return this._values.store[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"shop\",\n value: function shop(key) {\n return this._values.shop[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); /***/ }), @@ -106,7 +86,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac \*******************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.store.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getStores\",\n value: function getStores() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"STORE_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.shop.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getShops\",\n value: function getShops() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"SHOP_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); /***/ }), diff --git a/static/html/modal/editstore.html b/static/html/modal/editshop.html similarity index 51% rename from static/html/modal/editstore.html rename to static/html/modal/editshop.html index 8a3e583..881845e 100644 --- a/static/html/modal/editstore.html +++ b/static/html/modal/editshop.html @@ -1,12 +1,12 @@

    {MODAL_TITLE}

    - - - - - -
    + + + + + +
    rating-star rating-star rating-star @@ -14,7 +14,7 @@

    {MODAL_TITLE}

    rating-star
    - - + +
    diff --git a/static/html/modal/hideshow.html b/static/html/modal/hideshow.html index c4c1b69..6abc547 100644 --- a/static/html/modal/hideshow.html +++ b/static/html/modal/hideshow.html @@ -17,9 +17,9 @@

    {MODAL_TITLE}

    - show-stores - - + show-shops + +
    show-bars diff --git a/static/html/modal/newshop.html b/static/html/modal/newshop.html new file mode 100644 index 0000000..dbe8185 --- /dev/null +++ b/static/html/modal/newshop.html @@ -0,0 +1,19 @@ +
    + +

    {SHOP_TITLE}

    +

    {SHOP_SUBTITLE}

    + + + + + +
    + rating-star + rating-star + rating-star +
    +
    + + +
    +
    diff --git a/static/html/modal/newstore.html b/static/html/modal/newstore.html deleted file mode 100644 index 75eb0a4..0000000 --- a/static/html/modal/newstore.html +++ /dev/null @@ -1,19 +0,0 @@ -
    - -

    {STORE_TITLE}

    -

    {STORE_SUBTITLE}

    - - - - - -
    - rating-star - rating-star - rating-star -
    -
    - - -
    -
    diff --git a/static/html/popup/store.html b/static/html/popup/shop.html similarity index 81% rename from static/html/popup/store.html rename to static/html/popup/shop.html index 6f22fc6..c09de2f 100644 --- a/static/html/popup/store.html +++ b/static/html/popup/shop.html @@ -1,15 +1,15 @@
    - Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 18:34:38 GMT+0200 (Central European Summer Time) + Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 19:45:58 GMT+0200 (Central European Summer Time)
    diff --git a/front/doc/Kom.html b/front/doc/Kom.html index 481af7d..e4abc50 100644 --- a/front/doc/Kom.html +++ b/front/doc/Kom.html @@ -45,17 +45,19 @@

    new Kom

    Server communication abstraction

    +

    Server communication abstraction

    -
    This class is the main object to deal with when requesting something from the server.
    +
    +This class is the main object to deal with when requesting something from the server. It handle all urls calls (GET, POST), treat responses or handle errors using Promise.
    Because it uses Promise, success and errors are to be handled in the caller function, using .then() and .catch(). To properly deal with POST request, -the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    +the session must contain a csrf token in cookies. Otherwise, those POST call may fail. +
    @@ -76,7 +78,7 @@

    new KomSince: -
    • June 2020
    +
    • September 2022
    @@ -109,7 +111,7 @@

    new KomSource:
    @@ -213,7 +215,7 @@
    Type:
    Source:
    @@ -231,7 +233,7 @@
    Type:
    -

    (private) _headers :Array.<array>

    +

    (private) _headers :Array.<Array>

    @@ -246,7 +248,7 @@
    Type:
    • -Array.<array> +Array.<Array>
    • @@ -285,7 +287,7 @@
      Type:
      Source:
      @@ -313,7 +315,7 @@

      Methods

      -

      (async, private, static) _checkValidity()

      +

      (private, static) _checkValidity()

      @@ -321,7 +323,9 @@

      (async, priva
      -
      Check the Kom instance validity to ensure its properties validity.
      +
      +Check the Kom instance validity (eough headers) to ensure its properties validity. +
      @@ -341,6 +345,9 @@

      (async, priva +
      Since:
      +
      • September 2022
      + @@ -355,6 +362,13 @@

      (async, priva +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -365,7 +379,7 @@

      (async, priva
      Source:
      @@ -401,7 +415,7 @@

      (async, priva -

      (private, static) _createRequestHeaders() → {Array.<array>}

      +

      (private, static) _createRequestHeaders() → {Array.<Array>}

      @@ -409,8 +423,10 @@

      (priva
      -
      Fills Kom _headers private member array, to use in HTTP requests later on. -This method is required to be called on construction.
      +
      +Fills Kom _headers private member array, to use in HTTP requests later on. +This method is required to be called on construction. +
      @@ -430,6 +446,9 @@

      (priva +
      Since:
      +
      • September 2022
      + @@ -444,6 +463,13 @@

      (priva +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -454,7 +480,7 @@

      (priva
      Source:
      @@ -496,7 +522,7 @@
      Returns:
      -Array.<array> +Array.<Array>
      @@ -514,7 +540,7 @@
      Returns:
      -

      (private, static) _getCsrfCookie() → {string}

      +

      (private, static) _getCsrfCookie() → {String}

      @@ -522,8 +548,10 @@

      (private, sta
      -
      Extract CSRF token value from client cookies and returns it as a string. Returns an empty -string by default. This method is required to be called on construction.
      +
      +Extract CSRF token value from client cookies and returns it as a string. Returns an empty +string by default. This method is required to be called on construction. +
      @@ -543,6 +571,9 @@

      (private, sta +
      Since:
      +
      • September 2022
      + @@ -557,6 +588,13 @@

      (private, sta +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -567,7 +605,7 @@

      (private, sta
      Source:
      @@ -609,7 +647,7 @@
      Returns:
      -string +String
      @@ -627,7 +665,7 @@
      Returns:
      -

      (private, static) _getErrorCodeFromHTTPStatus(code) → {string}

      +

      (async, private, static) _resolveAs(type, response) → {Promise}

      @@ -635,9 +673,10 @@

      -
      This method is called whenever a server request didn't went well. In case a request (from -any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled -in the user interface (with notification, console or else).
      +
      +Generic tool method used by private methods on fetch responses to format output in the provided +format. It must be either `json`, `text`, `raw` or `dom`. +
      @@ -673,13 +712,36 @@
      Parameters:
      - code + type + + + + + +String + + + + + + + + + +

      The type of resolution, can be json, text, raw or dom

      + + + + + + + response -number +Object @@ -689,7 +751,7 @@
      Parameters:
      -

      The HTTP status code to handle, in supported ones from HttpStatusCode enumeration

      +

      The fetch response object

      @@ -706,6 +768,9 @@
      Parameters:
      +
      Since:
      +
      • September 2022
      + @@ -720,6 +785,13 @@
      Parameters:
      +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -730,7 +802,7 @@
      Parameters:
      Source:
      @@ -759,7 +831,7 @@
      Returns:
      -

      The HTTP status as an error code

      +

      The request Promise, format response as an object on resolve, as error code string on reject

      @@ -770,7 +842,7 @@
      Returns:
      -string +Promise
      @@ -788,7 +860,7 @@
      Returns:
      -

      (async, private, static) _resolveAs(type, response) → {Promise}

      +

      (async, private, static) _resolveAsDom(response) → {Promise}

      @@ -796,8 +868,10 @@

      (async, private,
      -
      Generic tool method used by private methods on fetch responses to format output in the provided -format. It must be either `json`, `text` or `raw`.
      +
      +Tool method used by public methods on fetch responses to format output data as DOM fragment to be +read in JavaScript code as HTML template. +
      @@ -831,29 +905,6 @@
      Parameters:
      - - - type - - - - - -String - - - - - - - - - -

      The type of resolution, can be json, text or raw

      - - - - response @@ -889,6 +940,9 @@
      Parameters:
      +
      Since:
      +
      • September 2022
      + @@ -903,6 +957,13 @@
      Parameters:
      +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -913,7 +974,7 @@
      Parameters:
      Source:
      @@ -942,7 +1003,7 @@
      Returns:
      -

      The request Promise, format response as an object on resolve, as error code string on reject

      +

      The request Promise, format response as a string on resolve, as error code string on reject

      @@ -979,8 +1040,10 @@

      (async, priva
      -
      Tool method used by public methods on fetch responses to format output data as JSON to be -read in JavaScript code as objects.
      +
      +Tool method used by public methods on fetch responses to format output data as JSON to be +read in JavaScript code as objects. +
      @@ -1049,6 +1112,9 @@
      Parameters:
      +
      Since:
      +
      • September 2022
      + @@ -1063,6 +1129,13 @@
      Parameters:
      +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -1073,7 +1146,7 @@
      Parameters:
      Source:
      @@ -1131,7 +1204,7 @@
      Returns:
      -

      (async, private, static) _resolveAsRaw(response) → {Promise}

      +

      (async, private, static) _resolveAsText(response) → {Promise}

      @@ -1139,7 +1212,10 @@

      (async, privat
      -
      Tool method used by XmlHTTPRequests to format server response as raw binary data.
      +
      +Tool method used by public methods on fetch responses to format output data as text to be +read in JavaScript code as string (mostly to parse HTML templates). +
      @@ -1191,7 +1267,7 @@
      Parameters:
      -

      The XmlHTTPRequest response status object

      +

      The fetch response object

      @@ -1208,6 +1284,9 @@
      Parameters:
      +
      Since:
      +
      • September 2022
      + @@ -1222,6 +1301,13 @@
      Parameters:
      +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -1232,7 +1318,7 @@
      Parameters:
      Source:
      @@ -1261,7 +1347,7 @@
      Returns:
      -

      The request Promise, doesn't format response on resolve, send error code string on reject

      +

      The request Promise, format response as a string on resolve, as error code string on reject

      @@ -1290,7 +1376,7 @@
      Returns:
      -

      (async, private, static) _resolveAsText(response) → {Promise}

      +

      (async, static) get(url) → {Promise}

      @@ -1298,8 +1384,11 @@

      (async, priva
      -
      Tool method used by public methods on fetch responses to format output data as text to be -read in JavaScript code as string (mostly to parse HTML templates).
      +
      +GET HTTP request using the fetch API.
      resolve returns the +response as an Object.
      reject returns an error key as a String. +It is meant to perform API call to access database through the user interface. +
      @@ -1335,13 +1424,13 @@
      Parameters:
      - response + url -Object +String @@ -1351,7 +1440,7 @@
      Parameters:
      -

      The fetch response object

      +

      The GET url to fetch data from, in supported back URLs

      @@ -1368,6 +1457,9 @@
      Parameters:
      +
      Since:
      +
      • September 2022
      + @@ -1382,6 +1474,13 @@
      Parameters:
      +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -1392,7 +1491,7 @@
      Parameters:
      Source:
      @@ -1421,7 +1520,7 @@
      Returns:
      -

      The request Promise, format response as a string on resolve, as error code string on reject

      +

      The request Promise

      @@ -1450,7 +1549,7 @@
      Returns:
      -

      (async, static) get(url) → {Promise}

      +

      (async, static) getText(url) → {Promise}

      @@ -1458,9 +1557,11 @@

      (async, static) g
      -
      GET HTTP request using the fetch API.
      resolve returns the -response as an Object.
      reject returns an error key as a String. -It is meant to perform API call to access database through the user interface.
      +
      +GET HTTP request using the fetch API.
      resolve returns the +response as a String.
      reject returns an error key as a String. It is +meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments. +
      @@ -1529,6 +1630,9 @@

      Parameters:
      +
      Since:
      +
      • September 2022
      + @@ -1543,6 +1647,13 @@
      Parameters:
      +
      Author:
      +
      +
        +
      • Arthur Beaulieu
      • +
      +
      + @@ -1553,7 +1664,7 @@
      Parameters:
      Source:
      @@ -1611,7 +1722,7 @@
      Returns:
      -

      (async, static) getRaw(url) → {Promise}

      +

      (async, static) getText(url) → {Promise}

      @@ -1619,9 +1730,11 @@

      (async, static) -
      GET HTTP request using an XMLHttpRequest, with an override -mime type hack to pass bytes through unprocessed.
      resolve returns the response as raw binary data.
      reject -returns an error code as a String.
      +
      +GET HTTP request using the fetch API.
      resolve returns the +response as a String.
      reject returns an error key as a String. It is +meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments. +

    @@ -1673,7 +1786,7 @@
    Parameters:
    -

    The url to fetch raw data from

    +

    The GET url to fetch data from, in supported back URLs

    @@ -1690,6 +1803,9 @@
    Parameters:
    +
    Since:
    +
    • September 2022
    + @@ -1704,6 +1820,13 @@
    Parameters:
    +
    Author:
    +
    +
      +
    • Arthur Beaulieu
    • +
    +
    + @@ -1714,7 +1837,7 @@
    Parameters:
    Source:
    @@ -1772,7 +1895,7 @@
    Returns:
    -

    (async, static) getText(url) → {Promise}

    +

    (async, static) post(url, data) → {Promise}

    @@ -1780,9 +1903,11 @@

    (async, static) -
    GET HTTP request using the fetch API.
    resolve returns the -response as a String.
    reject returns an error key as a String. It is -meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    +
    +POST HTTP request using the fetch API.
    Beware that the given options +object match the url expectations.
    resolve +returns the response as an Object.
    reject returns an error key as a String. +

    )CdQ3F!eKyF|9D2V!F-rhUpJ8J+l7g0OBBVM#THTI&O8)>EGR%u6Gd9D9pm5!S}%&6DxW}^f|7=Y zPoO3(pTZY#?(7(|!5}5Nn!D%DotZmlW)?smSMcEE<^aT$6gw#LlwubPI9BYTffL0! zyu-EPCnz{Y#ZR&1d{F!hr_NW!&#~mXis$jseXDo@U)-kR7sMBeUt-T&RQw9By@BF9 z3f?cpmw4m-R{RHncaC**(V--ipJ<~6LkW2fi6RVfh%vcYt9@z>&M0LBSf-Q|Et8wU zCt43_*JB)mHR71wb`K@~5Cizwp{`A2uuJ^_Bcl3k{7ree$8&@l?;^2nagS+NqCDBfkB?pJws=PbK~+A7|2 z{gCDJKI-i%m4LD$n{WIwWR|c+NRy`C1#)1sSBI7FiH6z-QkhY&Q_|%I3exQ zQ`X1M?cZH4^M&BSyr;2z$+^SZUMA*0001Z+HKHROw(}?!13=vX`$@Br+fGR zZ%e`5O6%Txi$Yrz0gF{}p>fY>OnlS0Uevf}oDXW;D{d2gcE<2)oFcV80@g$H)63L{HN*d{8kVzKVW(;E)$9N_%kx5Ku3R9WJbY?JW^G#k0Wdx>E$NBBVtKRLiL?sA*s%w`TdsNz1=+~FRNdB8&+@iBD0 zXFTC4C-8-Cwv(4U=LLQ~^Oa4^rG|OTr5?ItoaPMYxxh`%a*kVU z;HYGAjq6;IY{`*awo0DlOMw(hkrYdb(O28l;MYvSx*ChcQW4f^QL5UdE3HbqvbxB$pfSg`>Cj#;?~00;nMAg}==M6d%RaIhCe zARtS)01i=0um)3FSgr#ump{<1pq_<0a34Kp8x=7I1^|9 diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf58cb011a6b4bf3cb1612ce212608f7274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19836 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff b/front/doc/beercrackerz/0.0.1/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183dce4c7b452afc9e7799586fd285e146f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22660 zcmZsBb8u!&^yZs4wmESowrx9^*tTukn%K5&Yhv4(*qAukeD&L{+O67q>#5V{x##IV z{l`6h>vp@zi-`e10Npn{(tTN_YxCRmIVMn%D!3L|6nA35hpGpD)!9{ zef#*|AOyh!fQc)}D}8f^003Aa005ms>xd~NuB0La06>I)#{_(%EYB!BUtWox2>^hE z`}Xz!L*CzXKO-9h`)|(rTVDVG0AWyXSQL$1oe97DLHdqi_y!N<2n4sOy_wB7C-6PS z>$gpag7p+MGjRIWBJh02K>cqZnOS?7esdxKfFK_LU}yi!vWwQ-#K0H;kPrTjVg3di z2-xpH^KbH-Yy0*IzVQVPvfrVS zYieWQ{ynbJ^SADs2M~h(07BXt*q8tS%2?kqOW!$Cm?1=S+1oie0{|*F-`vZ0f57Xy z;#_-2lW(os#kVg0KirEDU$~hVe&?+2{p~~i2eTH%+HVW;4ZtLC!OVYloRu-^KRdOA z#p1qhq;IURzYA&z4S}R@s1G*qBrpj)V*H+W90)N0;J#j+A}jM-9BcHeljaJ;CZWY* zA0BA=y&k`bikBmz(zvjl#zZfM0XgNTDFX*3`2E}*s`jJlw1If96@D605R9|_vG zS&$Cj6Au`o6o)ET0%_FoG1XV#N^O&LG){ldbj>_7>UV^viY#ezHft8i%G$eP)w(MHlIZGb>OBVKBV_g#d2Z4ZfjiY@6`*P!L@TlmLz%OI&5gy4-HJ>-)t22%Fd#k)&OLVDMsL{u z3F+<^`fj#|YixitJqW%H-!Iw*Hpl=}(?_crz=|GZwd_D(-zD4B+}zvfYFuOk582X+ zV8T$LiFC)qQ{k>~RlY1+S8V22!LV~hvI}a}SY!wbMS#b{;bL(_xf&mKb6k~R4t0)c=88?Djji4{N` z4d82QUS>g#rR$As|4(!GJ)pT>$V}06?hqt)ci&$S9~J3=jao zzkxxRety?(C_|tUApj)zzh__);4R;V5CHn$9QE~0{q?aS#0bax#(;;6fiE<0^!`oQ zLBM!Y2;*C(MaFkC7GpTmDt)dI=cvQyo?H9op|AXKD*T7fL7uILb z$JxH@}Epi&2Fyp zIgEC<1*8)xbb9TcOBv1QD>kcb9_J}G+%4B@-EIWJic*$GACV#8YxI8_u((Va(U=*E zQiF6-l?Lk!)r=hR!?U&C2+PY|UiU~=>^9rI?w934gT!-r{2rbke}w+oc*4^3%<$@b zC6~F#==a7XY=w@)SsO`2h-gE{}l-5$Z>b zE9tk=kn`~cF&6jo1u`J7A3snuKQ$*wZmz&^CqxXoi>G*+!zxpXQH8>?_fsI`JdOEYRRl6HI%1ESG z9@HU*OZm=`FnMY8*C}7bkB+^+^@;t2wqvUMloqJXNh0Ic?A*VlwWnQ^t5Bco+%`Ol-MC0$)=$w6?23s6$mC$VY-D0 z;h7M>*l-@p1`9d}sIG8lI*OYi^otymNwn*AZH_t}xNaICC96;`YuxfP!d}x7Q(vj= zGbB%(T?a($mz`s>Z}^T2J#m{&1cdC>LbmG=jtja1wwf`UP1Is87f>wl^V6kNfq53j zkArR1Rjfb_*7=9xi1E&FqVq~rJeTEVDnGQZr3iZ5vEqoFs|IatR5y#QmYcm(SG_Gw z=Cjc15%$>MVYdwP2eZM`cXkM0E$l9x>Q1Q&$%2Sw`o91W6jqQZY0GPJgw-n-`x6BI z4%qvg6S7Ocd~z6BeCTK1I^vR0uf2G-I3{RUbTma$T!J>!c;B@mWn4ZAyNZ*~4#Qpk z8f!I&G8PR)6`WH`dc?N49$=EHsBTBiTfTUs+!?Rf3!6_Y^TN3XQ_6aThpi}6N+CA? zF1$brYeh4`xBn9as~I}fhTwu|X*G13?}_yTmMAp8sT-+If>H;4r|FN|Eq( z1L{kL`qmEw%_jjwbOPB~36&|v4#q!NF($Gvnf`Pmf9$ZTHLZKY-pZ4jB30awlYE@^ z@v~f8^-OwGoF>LPzSi?vW3+Fbejc@o2KXHdT%=S5dYUmI8G&%Z;tZ}193l+5z|o)I z_{qq9^}@qO9co;fXH6*))FebxwNIps>ex0+gyJ`IR=Ccuikn+oxEsde;m3xgVByAB z``!3Od-dsP#{)Q69I?p?*mTNDJ=;1)Ev8l^}PAUs+-lwl$ zUX$!mrrTtu+msiohytaMaTg01w1gmD&S;rYD`@2EksjyF#Jur~F+~tVvtIi|Pf|8-G3%;lO1qZ^?DVJMQ-{>8%qD9L7od)^pCO+Cbxa zUm%y5@7gdw_Tu=SY7A9^C{30Ix&Yu*_)AelLRmyKMc-dPnKoVh2Fmt%K-7lZBz`jb z4DM9nM$6DZ&zg^)=Z0i5)jv`3S|DOhzklR z2m9dHywCE_g2RDU?~8B;jVX1O&%ZZ;Z=agK9O}<5OJ{f*cgJ!zM_a6SmTP;?@}v6W z!sM~pk#p7mb)6HW@{VtG;oT2dd|gylrq+5pG~dqWnB~4KP!^y|GFUJ?4!?CVV~Yx63`Mc*A$;2-BlbC+fbrzi=_*lUHuu^I3+Dz^owT5w zr+%`zmmCNiYAMMGEXqh(0@E2i>Dq+ZPOELuk3boP=)QYQSPZ<7=+L;k*qYI+^*IT_tUr){! z#JU-j+$WQiVTq@6ify6Gu>;*nh_e0E09)1$V$<;2fGiKew4WkH0mNc??dgHwr-VU! zr1MdgicuGnLwVxW_|zxzmAO>|8z;}`&cxddLiW5uVf(M*H@e9)q7P=?h#is66tue# z!HjfdaCSWL)u;ztV%_>h2&cGps=BF@YbyTYqN8zBnW?i2&P%L0pDfil$I-?{)VHF) zL`nwM$sqQTwb}ymRm9uW?h7{VH>aiES$opcO^6Yd}u*{fWA!3404*!^q?x4So4i{fta|ye8;winh8S5weaR+NxM=vwv2JQhRlFm*vYbtQRLG8zrzrfj{Wlh z5c$2cf8tLo3%v_p(;STZ)3AlN+FWOIE?#oge)i5Eyvc*Ty3e2N`(??HiO!7h=hHs> z7GLh8)>#4YR%~?X?*g{hZ?AB^@XNfY?y4ksklPyya(RW(3E@%b>EXc!(W@!@E!ml5 zsB|%rkqx42xT-&_>G5{Y_A+6sT6f^j4?y6lm$ki#)g=%vdnHn_owL{HfZAeD2Mx^w zqcPaeQLONVQGt!h*--CN!7g#)qyYk1K~Q5gkiMr3_pAU^b*`V$0Jt{jU0XeKZv7!| zvdm$$VhIZTQR+MuN0Cxck6)al{wf%575k0M>{PkNJ`s-(Odl2o*KXt&elc{t_YwKv zhe9`XZXFEQ_w2O_T;}2_y|&!bk~D-~>Mbm6Gs#ts0X8w4oOI+>gvjq1c^(2` z7891C=<);1w}hK+mNNkdJ)djlT~B8})OaN#?ig_x}@KWeSM)qpO^AQ;Fp2h=hxn4qkfO!YJ(Ir8t>tXZNPm>JB* z%0;7&myJ*lZ1j6lI^6GDnW^j`y^}Bo-4mj_2zUf!MWa>HpnzZosbDIAQ|KLrYp1gy zisc|!;GyixC{jR-j#- zZGJson6dGxwq7ocrtH$)tIl{DPF*z5rx$i!@!4<0^Uv@)-(DK6sBQb+^pNXz=(>F+ zCL>0#t&-QNw4Hz6k`T~c{TmyDZba6bz{v|bg}}VCw4wx@dDD_=5IeHg3HLQH5O)RA zvYBaHI~rE8PiLlB-nSXhGD@VKcdCDkYp=Pu6y`H)jV3q6UEH!ZQ@A2BY9dFQ`c5 zjpOEz8Sm(h(fK`paiInDe56AP5X0gDfgbEHRQlzrvjcP+SH(m3y6@eyd!bc zzj-EO`xf;gR7X`|RmkW}Z1VjvhUG1{iw3@^BZLaPg~wtyUEdk@-F|3Z#Nfg8_w*ms zr85+{9K)I2&YShTt+Lo|*RvLG9j77T>TYsMb}!+J06q_7P2@VxI>D33`h40HMF>@6 zH4qMOc6$m@=2q_1iHc32-e1$}oj2;Gui98I@jASaC zWSyZa*B^V~kYvzR88I8Z*y?R{Xx*&WquAN5wr!ZC#3t{{_mhdY2@&%k*6-sXnc&38 z`46N!sTk%>-r$O#_hr@8rrX%S*MTCDaV2C{e65;j1 zA@7sgXU@A!87`(+mHy%tt4v!o$^IXnG(~U5qDbNdF!+|M(vd6i#9aB?ml5NuQ8RO~ z^YvE6MG(D=&f6!aO_dc<@QG3n9NSWqzMu{W2P_@V?c4bV1FTN zYilWMN6U;(ok*bAST-?}$pu<9!rVbiXFJ67kc0ZixD$>Y3Vg*>;Nw0Vg8%|x>zZ7vYWh(?fLf3Wdi@#(*n^@P_UsXwa{GkQ35A)nq%jZIe-~qL}`tv=0RN-s1UF!2P%dr2D`OfF7n9-rb;EL=veIOPSV+RFY_i88?R^4=L}4 ze(!k1NoaIen~AC|i6#ZXrU<*apPu+=sc=z%DHF3fi=C%f)RBQ-BNJJ^7Eu;53A}f` ztU7Kn`@EJ8#J&_91>OoROf;SZsy98CFhZgN#==`%J+W_Ob)H8z4o6wTU_-15VW+^l z6^IUc6n0xj|MjAJJ3jc(`@nlKQlGgzj|mNr;kj@N!}H1PJ=&k&ocy5j z3jPt_bI@N~(IhpV6-F5#lK1Be0zOEyx5( zpqAt*bQw%OF1&M%#aoMIRCu>jQ+}mU0cx*g&Y7>~h_Qh_eq=zZz!Q4+so&bIZfZ(o zIS*3SY=DfBOGyDQ;GHLJgy@I(-zRL2tD0A}llS1}*tgPwroq@;*om-b^io>RSu!c| zx-LXIQ-t(-u*#veDp!o(ZM^DxMF#vBy#lKqeLJf)?eq>=Qrf{-BpVN7PouS4qK`hZ?VRe^^;#P+$y)|DG*KV0NS0iJMJnE^JIeqvNdRxEwkdqs%3l0duP2V8`dyb{bBS; zm7++>sk6GA2al@5gCjZcBSRIV@|5#+c-xaFwFtbB&F^*jc41WXVCM@D%rgl3JV(1T zV?oNzL9@_6P52PDl8hmapm3Z>VG|SD>jWv`=Akl#bfC`BX`SB(GVVP>m$HrYLvKEL zxC!Hlq;~*38PY5OQcRy?DAn`G6_W&cpW-JBO~;~gL(4@S-9K~GXtqEEP^$<|evwj9 zpiDPWi@)ihRe(#{CwwiJEJ3MRujOj@adF)E$u7d_EVtR|4mm_={M`9+mBt%VUBJsH zn6oayJExDfu zTI+3&&t6N9UY)fXPpQWz?Y(%@+-+v3CDT!RDh)nId+UkdS=l6D_;9`Hxg5! z%L&tf4>_ZiK5b0N@fiM71peJlR5fmkgwdC4^_P=QF%>Ok>}T>PoFDy4uIJ;h(tQ5N zM(v!ugH&N%ZT-{U$_@uHt^vbt+_NT!_~1a0VT&;lHUuts+7@Ev;V5IxJ8;gO<9X|9 z7ZJX#O4?ErlXY&<{Y^>Bm2cbuLZ=wc|79O*TCQ=3iDZ~YXTA#7$gqlTslZ^jd(wEx z&dkY*@WS^rX6vDV8FSRRAor@o=||56T2g%2UkK~#!eVzz99wcKWQtAp{1NuCrq0|8Z>z-+@eHdTm>YBTDI>`SYDgc#ca)?TxV52)KXBAR+X-wtE~cUqa@kg1Gk+o!(XG8N2gk zK8wUT0}bKh2_hy6`)nSKO~Dk6eFvw9e#JH31~@z)$U2kq3V08sj6@t(5>DLjmWaKE z))kl2@9x5IAj!WL*iWzgNsNn5y%|&Ab9fyg{s%X7fC-*?5z0EwRfGv0m9m5yOQCXW zXgz{NcDjeD9i;yG1`e4!4%(1)47o(KdUffMcbWd%;&M2uy%vqr3vUwChqL1J$DWM? z$3+xN6NP?VKu?n)3Ln2kl)80@vFpDQ!h&e1;j|hQ-V_t2Mc`piX}iMJzBm-7dVghQevE3B|CX9ca(Z|ELQ$zHMQSa zK&kG}e}zi;>YwCayQoIGei0e1e0pwo?OrWgE*n?X?*5{5It;CjzHeDRwP1M6=j?Gx zzr9Kj3BXq`AwPJOT>VoMqFpPUJvA)#5+u-ft&Y+PVDPG zu>Bb~i!}n%;;|mYua7Orq}*%Mhsm0SQ`7h29#`p)qjgOOj&6zGu-M8^wEaK{q*pOGBOPnF0TFtcJBDz2%pR81 zykQwu>O9E1bIlo14l!!&{JHwqj$oYG3oORbEU5gY`sYbE!o{$d_2{LNPNgBr>1-?C zMMqEk8@+#+I^f(e$YsrAHW(cR<&LFWW|)Y$?JISC{VemI+!>tx`@m_cP;h`y8}8v`nRI7| z5mv!2bx(TY9=mVcA(Uy2k4#0!!!;9csV*x=a}encb@2EmokQhF{L!PmkAv||Ci5Rb zcVf22g57f^q;3hpoS*jdSw8k93}|<#%;(MFtnQ*_=iTP17kfA7WB(qk+57QmI%1>` z`LJinKaV?fons=6^kyrB?k=OPXP4W54PCZ_8y>DZTQ?a8TopK+c8)5woguahW?2246s9!*3G7<#u4WGvpmG_WKS?cBo#n1cXEi~qV;Om zI3U|Vg)L)c2_!2h5zlAe06(vyS}C(JL6*ZSi-*zp;3ywd4+Iyzk;JheiLNhuTIq-- zH^^MXyb0h3Ui!`vok!D=T#<*6Zk=BEn8QK7iwk`AM)T!-u}$Z+psL1`g?d}|5s*5u89-wVJPf|zDiUsjHW|czRY@KAlOZw-@BzNaO zs`if-)0;)))v35qI6 zz(g~cD9{TMnw7mr37uge3d6X5-NqH0hvf*RQAtNs3q(7e6E4mtC}m%|^t8*P)Adxs z^~u4VZ3?D_@NUbw;KJOyQNM$Xz@1_jqElIvJhGh*X94xuj%cOf47}16>DAFbO?0B#ZQ;@DgBXpfxl0h0d4_tlgntC(W2s-0$Eh}(I zDb`;M@0srB^;J9&vk!#!TED6ZQ(aR`V&f-GkzE);WF10=l>cqBTb+k?yqVf*X|=Kl zt~kiUj|4fdiJKAlBxLC}o%BWZ+g!Zm?jYtMy)CD}^K&`BPxyh)E&aooy%G>sUPmQ% zMJU&A|9z5qMNQ|-e!=6S#~B}Vuw$v$PVBa{jR&Xnl~7JDU$5ix02;f#OBI`HSvvyM zmAN8uB&bPgN32bG11OStOycK{H4r(_e0-k0&U}W)sP*>E#n4~+o|T*B`n;BN?HBXU z-pA?Rk=x@iopL|C>hX6te{K#VrV&7T`jQ=o{g{GzaUeF=Ms{+OF4OnOF+Tz=%Smng zS(L#nbg=pYblZCdX+IyS-%TF&r~aL`>pa>vm7kS;eV<5y-KPO1u3-t|SfnJt%@))y?S!gEp(0)>w))iBCI^N&OD2Pq z)S?uqO^LBngPbW2v^iL*n9J}>g2n0q<*cIvQ+u~YV+;40k;w^I+>B$uGk&ESI?&a%4qQ;Y1jNZq( zV^({6%}PoO9#trq*aHQwquUp$)*Bt|EUNGl;iohy#3oQbU=JPD@!Lc=^2lNOh`8A{*=T7JC3c~v+9L)7Rz644WToV5n9sb zb?_;!VCiumuign+8Kjz`+%B82r`Q4eg#$xb?G89;AU{hPJ^O$(%kosZ_(20ku;+u) z=4<@1n?E{}(5gt0DgV40k(+$97f`hDNRq!9auMLMQTNVXXjeyrQj)obZwhUX^2e`L(B{Gw zvW?p{htf1yNr<0jO??QTXuHiET@_uY`H?o^~!E#(2m$q*L^5Kl5dpv;6GdxV)Hy_Js zpn0fg%Cs@?cLgP7PUhV%iSwNFYK+pS4CY?*=*h-Iwb9SawiAgi>SvW38a^@Ur5ETE z2J9oZh9u`wa1lBjSYl}kMp_zGD;fy$a+H>E6^cjq3)hs0sJx_VLbvEh2F{yH!p>>s z+hLH5xwn}KhzDwlEhjBE{ih7XtA{U*oA?r0&FKjbCC7Mr8vNUDTFvPVf&ZHFQB zT?wa#7buc7vu{=)6k{-1%1}35OfBv`>#kpX$;&Xq_Q9x~ERGfruKC=*2Cxb6U-$1! z4u%qpNy~QvxmDGwiAlr{vZ}q*#>h{GVfhNLfk^hrnq!+OJ!nFvWR!*+LV{^z+sIT548+L@kWth6?0;YH z(t`RZ3~}a(sBuKWhwNYeB-}S*@ZIcgjFwKexlvKx>GbuW-bMOko^l(B#jB_+J!~HF z3T%xK}%igi$r{4ju z&HTnsFc_)wS*=<<434@y_06fl1VcY<$=r99%D5vQ=CC=(bMaM)SPi=f0O&M@4hRFZE495ocZXjRrPP>+?*~$z4xgh3sm(hL6$gl^#|O5Mi;cDI>KHov z2)nekq0#e=pD<{4j3@$h(twpEwjE$=2h~{q&Eyk=17<`ze%5QC3-@n3eB7Ihm;sQTfVAq;D3OzbqW0 zSIvd>XZOuRdyEx+fi;F-N$Ehof}gwf)GS|BPGqf&n+kR{hQVj$y@`!X5JNq^j?f%j zXgWU1m=3yKb`yEmpQr{K`POo&zbSUR#rtxg9f=jayrYW8r=ZNhIqHBF2%8bzoY;ph zYO0PPX z$QV|~=7#H^cur~*pD1r=9ndW*SSfZn{2nT!n~vm6FWVba_>+Zv>D0;1y@e5kti>%| zw&MLBp*Q!DW1evuW$EJ=4F{RN>BNb$Kx{!sgj{5Cu+QzWcVXQe_U=5wt<13FzaHJ- z;JS7>EUc}X4>8(*&JE`k`8s%KdsS@UP@L6y@kXk$AfryM4M*xAaxxmuLl?6bndUghRksjH-OG+ROnyaRE{$S4;DBL#GtDVoj&MD^B%WOh4yW9%f;BAf5UG0tY zy~#RRYc+YAuHxrf_kP-IC+M8ITOfJI?zpdJH{a?syS+*BD>(l8R$Z*%8#yj(*~gd9 zXA1Z+d8#LyG=d+(Mnf;?=h>kW>-o#7R*_b%2RFD#{1VWS=zmHDim(hQUIwDL9pd9kGp=k`W$MlNMr1rQkX8(ZI3&?+k1k5 zS*(~ADIoQVhQN?jAwuEd#-17Vm);?1mOh#rvG@k&{;6b^Ci4#y1R;e|{0|OuWv0ws&pD z6}uiHDf5x6P8XMEJs3>Y7&}EPo2~)CNyDd)3zQ#Ag}%tRM#01`BCd(a#nAr_2ex7;x4E#gzlD) z>nQ}yl1;bo3p;6wb|uuqb$gYyElPI8==^9%JM8I?UdqO{(+oJ@hOSTcX>ie(SHuEE z*U95o=N^VcZE)ZEP1t)S%?#EsB&n`dCt=ZC!jJ@4>(BlWSj6PoN^N)h*U5g9h0+u? z8O#-W9%p;SzZri*MgK08s4B~4Ln!rU1P(RoVo6iIy0Nwt2bl#|!Mwuc@4~63Vy$5g zQY}lOS4A?ZhoKJ_{mzgfiyAjns!rL?9-mQuOHkQW8)~3JK}B$pPiyz9!9xt=qO`Y& zUgrm)p)lX#ClWVe*FfKVlvQc(tfFwUuH6^S#Mjkp_9fsGdR6gbbe{BopVvL*94w*f zstb_6FD2V`rB)=jO?{If9Opx5|Oi zz{s(i8DeLVi$DEa{1$hy&0_Sid9OE}<+IY(khuTG^+ct~X}RWlJJHaojpxSKRC2#L zpKV2sNOh^3af+Rj%-^|`PH+GF1tOnW?{YWYP2kL98)T%BS#Mi&IAdCXl^VaRYvK3r z*7a*x8RXvU`rgvU<6G?%w*dDlG{XWc7C!H;60wykK2wIMIO2nAd!h2nsnBMqp~07* zK})tFmu7C~+UcwFxZ%uvA%7}E=XvE9X`|R>UbY`D)WQpu-8IHoE*c31?AI~-mymgO?xjU{r*J_Ut~OVlUBto9>hio;pK{ZL2<95 z`~m#Bf=X?LHV7jvxKxT%pg(-hS$CPa+HN~NCB#$YwKyD;bc;bNz2NeG7%xS@Uw;9- zr*m6j$Y?;gTDw_smyGi9()A_2%C5?~%?yn{B&EA!Wv{(6GtNu;++@2e({oYgzlf`t zJwkH3$Z-uhtNIz==Ff}~2h*JHhB0kDhQwp>L{kAx=8h-?`z6%@+mT%P98&VmRRfyj z2*<+_LwTy4lrT6n<;7gk&{*U}q($`rNFGNh2X%4cRui#06F?_uUr*7%Ro(#IF9W|n z`ZGwjkgK4eA6VAu==;)a(P;S`&`?*<(eYp!IORestiqToCs?hI?MbNn#Cd1w;3oF{ zBY$j9S%QAd>`uLlhWKKav+RJ{^Uot#CJ8=*tPwNUf{O(f76>SC8D=X&Kt^;|ZtibU zxd2`1K<EvttqCCi}SP~&$N3SnNr;btH zcL9yd)f&4jp3i)8h2-ze=fSKR-bh$=jJ~hF&_5ZUpxkk}8QT`8CxwsQxL3LcHz%R4r^@oV`)=)-RT2%uMTKy(gtVEh6!t}9TAPL>F!B;nf95G_w z2`YuGy+$yG0NP~UiI%{esDPxDHTWnJbg2sO@ zYJtc(P-D;(2Qkk?!UPdQJ>dB@U}~@`i{@ZXN+dOmCP`{&rnzaeQsvMWHd;iz=Ce9q z1q5=>vst!l&@>VVyGu-`<4v~v=X_hRMuW#GqgF=CCJaAx=^Ez**C+%%pjgou+!Z0k z%D0(lFuz_gwc_+bYlUKFnK3!=a&1Jf6W>1=oP4C624Uzi@AQKC4nCo47uGqcW@1 zFF3sscsc1w`z9BRGy7f?+DaO3c?ld*gqY%!B6@oUTKn7L(CZ3JF;81smQI_;H}SM( zSfguBnX{d`>|tkSWNZh&kcpn~xU?ia%rI!V<^>H?K<}N3;O5A~OqsQYnEgi0uprA; z(Loh-g7?8Z3O1KCrX#WX`q5vSD6B*}RPX89JwUGXYz*cCmOY=kGSsP_qG!mdrK+ul zULmc>?olQ@Zu!`!M)kC*k%}Vy=T45adTBJ5`0;PIlvAs9Kje-6`)E)HdLn z)q1r^%1UC4Gv}5luzy6;5^5q(8H}q_L#%rgs>RB^LosM-UAQzxIP~ikNyH ztInDtxtV#)Mpd11gtYXha{}<|zyoYWaRQth0>ahFW6e3uin+|ZwZp0=;q>ddIT>q| zyvZR5smj5(w^bP|XWsxpZvVpd!334!+Eg&%-VO{Zpo6XrkYo1A!s!n&MV3=1oK!Oo z=r8bO-F6iVPY;||z<46Bu;NC;Ge`PsxkvW6Pm>OA%y~S4TL@mxx(inG4yWRErqDFgm3bd?TAh=vc>#>?oNO~h$X<#=u zSr2MGFj}w8bL3?`R?k{#1s~fQeQ@`wZL8&<78iQ^IWPZgWw&Rek6##Bl5+febOdX& zr`!v-Q8#5IucX}jSM`2c$ZW~O=(4)#$@IQO(th~8$3worgTc;#ke_mUTQe{@bMiti zB25dEv-K&o-D;LBEprDKIgx1#9*+Xc?3w3k2rN}86D><=sTJi|?BvuI2eZLoL@uDp z+?BXAyy`wS`2zYvsNAwTBv91gj4^Z2pmD9}P^NmtJa*aYH~x)3np6ScS1p%G0=ZjV zoIv57bHcjQUr1UiwpN{~{NodH@w0RKT@Ks@cblhDJ3PO0`oO<`R6K>a7K5iDzS>P! zjN)!G(o5`yY#f=+h8otpOh-Z)sS#DJOc(XQnoUEy@j%tfERdT|L=>b$P!~^V`Sx{m zW4E))~py z()PrLy~#oI5tU!iCBD{NaR>Zj@23?q*b46BDcd`hGkyavmQXy^C zv^V@`0a^=*ZA=EZ)vN;&O<;Zd2S&be~?-d)Yl93ZO<(fOUEdqf8FxeIfmcF^* zIC}~ZoP71p&ejWeMt|YKlkLrtuoys#%<2U*P%i3< zmINH^{K0A<2&W~1QBKCP#O}< zZ0+vHkM0s)nzJH`C=cO|Prjg2JGL_N?znTAGYTXj2Fn7^AD~eFz{&Fm0+D55 zbVP@fETc+At^IA8KY)=$VDkLyLtEqzqD_(c1K!i4>PC)hU)4q(L}+y&+M7aT1vx)a;P#X1vW5?EC; z;OZa_!>`~v>voQ-yA4s~8*v3h0o`U?W%*ZeZO&r+E?m87DarpETu*{7SRb(XJZ*#< zkni1x%S23G~zFm&5x+zjEUcujwCoK+nhfpZN+$wLDbA#9tw zy&xV^)cykp7_^pf4Jup)G^Z2j{j`*%)?kf{PfdRV=W(3MC+_>cs^w5v+NJLyErp`; zClNeDQ#B#U}X6?(nuAWH>_No+lyMTq189Okz_8v$unQwoQqrB*_a z_&u+o-k_F{)Z_~mT0wGfNQ{q7ERQqf2AWP%R$V^ea47Aff{GLIEn&rkGBd4!9pX7I z@bv-KHvlVHU9$*SHI&^lnHorD84C5dv}G3&PiCnBKVf&4ieqIrzso5*(80)xDvDXf zy~EDxs|`57ig5%?!WZkXYx+DXNolF9%!0K}Ab#(ct03JcL4fKjh~eR>O<+E@TJbE7 zrPqJ@JN*hPAALGrSNJyl?zXQ+j_S2-;?)6XH$A<(VH)nfcWY4^<|09!Uuc6cEKi1dNP0t)Y&E=K%oq#{Y)^tCoez58hnGsr}vbR&X z*TkSRfwE+o8%5DqFw5^KiD*wThTBteTRtMTdZcB~iZR@?k_eF^&TQ8<-Q!M9Y7-xm z<;ntc>tuD`X=c^OnXd9VyuZp-UHcwFqYinJcnBT39Tt9u0F@nRn@eumx57%#Z%7oi z7*TbYrHZ^Pt#eD*vxYL*$?-hQ4#9?>MYSL4S76_eP-+d^`CG70!YYkB>~+Tr&A>hE z0;k`Eo^q4SQ%mpxy+cJnaYyL3v8wMJfy1fq5IbRtNIFT9Qo$6P;}*cNk`!fXDyS~wBh*EK)4OILqx_t1B;>XAq2 zKe}}<>QWdeB0p$9aDQ-m(=l{Hh zSF)7L^I7@4>uSq=mD5Hoz{aavW>n4`Gr#erJbbSIw5RIGMnCP?XX;bWsy$e}X5PMN z6Gp5JYryOQi#PqUXChgW_rZI+#s}y5FR^vuJsq0v-^KOBFm>m>j?n!~`q=?V=w5-4 za}z2lVa|=Nx%Hzm-1-se*l2@wt(rh8Lrox7Elm|t2zsWwZ;98esSK}#7=Ex4!Ykw& zgz#dnf$nB4DUnXhE%2&{z$-Z^KJItob<&2=yudYy4{52+dT{@`dM*a8e96V^`*{jl6+jPK;G=CO$TdS5ycu z-cO?HIl{0Ssjen)ZCb$6#zkZ)#tLf2!YaBn_N60PLXymjHhIqp*Z4Oyo+Jc3+R-q3R8PAtVhMF@LB`jhsb-LQ_(!NG^qmwS~9DFt5)xQKw6_2Z?7^pU;9uJg4;g) z0L!{5V(7vM6uyHZVmR<8)`d`VqAN8vmDQM99oDo|gM(Fmg|1Zcd0a7}4r#B}keFi4 zO~=EE>uWB2``rhBf50f}>gr_NclRc;r5<cAqJr$e+u?(l>o zr!&5M6YsxpE`tB6{*B;&4a71%0$szbZ|?8W@%Bolm>oB=oarR2j%#o=UgABa5zEWOBX*m8?Alhix+m1J=^N7{u+&Mm)8f57tBi{9?h<&_6dUk&mmac)G-hk9mE)AXHs4yzs)@XLu=xtMmRML6vb?!V1uQ=KD> zjp9XNANc=flzli#QLkuHCCJE2p~DrO242z0y6?wSH8>o0Rs_guI+L)=>0#G+da!Z+ zL|0wRJ@aM{TfD4dy7=v~hcenNUg#=Vv?Q1Ja!dhOS@L3Dx91KdH3t^pWDL@r1p)QB zN%fwR8*UcL7qaF~oN)h~@e}@dcd_4J+^sOTr*vTK?3rW7PM>U6LRwDmezZWng3E3{KP5LPDZVGEr^SecdIj0Hz# z`JmfUbNuG9rs*R(486T?N_MB{ai*!_C2y9uTlYE3;ak@pbC$Qf_a3#p+W!CJy>ble z^gHj;FBe9J@6w0ol;8cF()?VUZ~~X|yQz`_30S-9thrPZ{#TH~J_W$;%V!_Jpm>cj zV>{0+_6jFrhGQd0FuK`1;d{87KlwqM2lH!`Z3Q@w-JSeE?-c1!47)TLCw|CeUi)kU zCi6weE+h820BHd?xy7dxz)yOtcd`P0!f+rB9EWHo39Q+KZ4droH)`ao(>u=>3B#gs7BoWOckqskU-pb&a#K>o~V|$W#^Wt21hR%USTk|_UFJevOoHfGI z=Ff|8kbbbv$B+T6eWyT{8H)n@>;O^>E>rlk16ZvHGoJio0~}H6rv|WQaF5fIr+sQb zUT%R|h{mL0-dcJu-n3#K{a%)0laiu#3y!zmnm|f|Z@;#rztNYKW&M%$K7tRtTsni& z(H{cC(=dwi!V+1))3EZ)yn)F+)2vlGEGTNPo)OkQssiz280Q39b|`k~9FKum4 z0xiZ^UPupW&4UGxi+P<1ytcf+BjBlX&ynQwWY}q)Jp0eDpJ|vc>&}zU$z3%y!Of)O z0$NVa1<#R=!H#&>^5A*34|o;tKl(j-6yj?ZO^5sT`-pus-%)GZH)*x*R`7_#KG$Dl zU$AEqVQd>YneE|3wqtJNJ7oZ2w*}4(*kFqa;N6JemFpF7Zba>3D_`@)R*0QxA$Fvt zUSq}l+vrdwR)TsVvmP9RUmaH!Fr}q>*qsGwTE&}&oACzR265bWsb@jaCfERG9k^bK z*38CUQ6gT^>a!C$!U}G66;}vNb+#m4kT)peeTCmh5GE%1W;b?0P!bwZ#X3GTB6O*l zDh=}aFbzI*8`+N{_$=K6v}_E-q?(9X@R&)omb;_WYgZPtp za5L#%m2|d3Ek`1gsd*f`W9%jrn?2fn;>~}Q0}_^cjV{eb=>GwC+%CWX0C?JCU}Rum zV3eFSTV&(!cz&C&4DuWdAaM4ogb9rPSNTtXeI0u-kjufq1QG=RYH18{0C?JCU}Rw6 zNcy`LNHYAZ{8!DsjsYlw0zLo$kVOWx0C?JMlTTz^Q543%ckg|FR2Ef3q){;BrJz$5@AjAKh@&~T@aHXC^1ZKCXcM$I`yLlsdV zIa9#`=gQ6>y$-n3 zXt_fO-40r&PLdoSaeR!H%98Q;vH8LHBwGFqT3$f12u-`Ezc^Py#Vp|l^WK{efM3R_ z*+yVidDeBFV+Su;^Ds4S7Ld}L@tN6n*7(1oIYy*Ep-!!v5Owtix6C3Y`Oips*il}* zZqoKU@@t4BZaQ{-BsqGP`E8!_2xFYvH45-%FlNn3#vf?l z4)f=|9PX3b?<_tSFRTv(&>o{5SVgU}1>8P$5Zh|pi-K2q1dGsGTN zseyjS`%?${syOd_CAkZ5N)4$`IVbO-hXD$FTLtG4MlAAPK4L`BIij%Z&Cwg?sw(ef z74y!u^A*{fUM0+12h6jvs zOiWCZnAR~}Vfw{v#+=05#k`F981o|*1r`^U7M6RgGORhQCs^OH1+i^ld&DlqZp0qP zUdDcoqk>}#CmW{^XA9>B&TCw1Tz*_>TvNFAaoypT;P&F~;Xc5_#}mM_fad_uCtfMu z7~U@44ZL@F|M5xjS@9+CRq-w3SKwd4|3;ud;DDfj;5i`$As?X$LidFJ3D*dp5MdE1 z6L}))Cpt&;k(hy4jMxgX8{%T(PU0=%%f#PE7y)67#12U=$u!9|lJ}$%q$WuVNw-OF zkiI1SP9{gDO=geG6ImtM64?c^KjiG>667YyZIgQ?FD4%%KS4oAAxmM7!Z}4IMH|ID z#YKuwl&qAplx8WNQu?8+pzNVsq&!3Uj*5Val}d_ApUMH1XR2JPIjS>MkEni9lTmX~ zt5fGt&r(05VW2TjlR-00i$yC+YlAkMc7paS?Q=RTI#xO{Iy-a)bp3RDbkFHA=&9-D z>7CJ+&`;6dV!&YFVQ|3Uogs_i9wRfO7^6u>r;OQfKoMglV*_I!;|${-;|<2=OxR2u zOwvp`OjZHm5tDl+zf69anwc&#{b0spres!NcFEkxe2w`I0CXFPng9U+008g+LI4E- zJ^%#(0swjdhX8H>00A@r{Qv|20eIS-Q_C&{K@>eb?HSKlh=oPR%7WH2NJK>96(K@` zu(9dsX``9Z(%s^*_65Gd#xIBuU}NPIe1K1I>Q;HQ85^nG>QlGQxpnWYY5;wBfDNmq z6F@@K*unr;8W+%u8-s1k;nv_5jNrxKRt(|Y;5PJI9R|1K&Kfef1EbcX!CjcK-VE-> zL1Eb79^y-bd$C)1HTVgG_Nc+n@a%akBSMvy(XJ7q0*B^v?GpuvafU0_pjb!rI=H8m z;GswxH>ij)dRNJg$*VDrgC*jGYBl>3KgKCsY|$4IIoP596e+g3uHu|JpWFp{0%24* zC*+OO8dVM!sfnmkIjd~ErmTGQJ&Bo`Y?RIw?Wgin*DO*bv+7GGHL3jS67__>7>5l# z@TCezSXca(#hXY*Dq1Gl=&na{S|A?PeZ4+r=814CoP)1Erp&vsQ_Xv>?k%Ht784v7 zGFCJ=G|zo%6(n3 zcQ~eHuf($_xj&03@#w!~@&hCMrV%xx3>||Npk@hPSN6 z-JQW!fw7H_0>cTefspV9!Crvi8uS4OZox_58HWep6}t7u8~5_bU2>PZBZ`*zt-O6H6TNB#=lF$)u1<8tG(^Nfz1UkV_u<6i`SJ#gtG=D_YZrwzQ)? z9q33WI@5)&bfY^KG<2-kuv3PEaw_OSPkPatKJ=v@PF(b-5;qsKztm7)X`M`R%vxPkz=8(j&nYXNAml(yw zHZil28@!iT_Hu+@{Ny(WIL2LWbDUYsW(U>Wr-nP+<1r6-$Rj?6zxRwMJmmzw@XvPg zlIOg@&u6}}i8%zA%RFkSV;}X*r-2}igjm2r7V(M2ETM^|EN2-P+0RN=u!_}u;TxBD z#Ys+anb*AIjl@a3BuJtpNwTC!s-#J}WJsoDNj9fB!+9=nle3)T78^J!Ib7p9S0q>R zB%iH(mjWr2A}N*qGq^*+`sT!~_VKtP`-Ih%R;A6{ za<;Bp{{lIAr&0g_086+4$WmCb0RfI#xd;FV0AnDq0V71P10!&-7eyc-OSk|IQA@A} zQ(9QCG#jueSzu-$id9&!0wrOv0YzgYVz2@uM6wG31}d@)1_mm!6b1$=S+WEu2}M#w zvJ40ZDzOFuM6o0Rh*4OuK!{ke1_MN~CIN_1ShxfLh*+@(0Yq6@Sy{LN|Anvwjj;s) ML;wL%uV=LY00kR;TmS$7 diff --git a/front/doc/beercrackerz/0.0.1/global.html b/front/doc/beercrackerz/0.0.1/global.html deleted file mode 100644 index ea024b3..0000000 --- a/front/doc/beercrackerz/0.0.1/global.html +++ /dev/null @@ -1,561 +0,0 @@ - - - - - JSDoc: Global - - - - - - - - - - -

    @@ -1834,7 +1959,30 @@
    Parameters:
    -

    The GET url to fetch data from, in supported back URLs

    +

    The POST url to fetch data from

    + + + + + + + data + + + + + +Object + + + + + + + + + +

    The JSON object that contains POST parameters

    @@ -1851,6 +1999,9 @@
    Parameters:
    +
    Since:
    +
    • September 2022
    + @@ -1865,6 +2016,13 @@
    Parameters:
    +
    Author:
    +
    +
      +
    • Arthur Beaulieu
    • +
    +
    + @@ -1875,7 +2033,7 @@
    Parameters:
    Source:
    @@ -1933,7 +2091,7 @@
    Returns:
    -

    (async, static) getText(url) → {Promise}

    +

    (async, static) postText(url, data) → {Promise}

    @@ -1941,9 +2099,11 @@

    (async, static) -
    GET HTTP request using the fetch API.
    resolve returns the -response as a String.
    reject returns an error key as a String. It is -meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    +
    +POST HTTP request using the fetch API.
    Beware that the given options +object match the url expectations.
    resolve +returns the response as a String.
    reject returns an error key as a String. +

    @@ -1995,49 +2155,54 @@
    Parameters:
    -

    The GET url to fetch data from, in supported back URLs

    +

    The POST url to fetch data from

    - - + + + data + + + + + +Object + + + + -
    +

    The JSON object that contains POST parameters

    + + + - - - - - - +
    - +
    Since:
    +
    • September 2022
    - -
    Source:
    -
    @@ -2045,539 +2210,14 @@
    Parameters:
    -
    - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    The request Promise

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (async, static) post(url, data) → {Promise}

    - - - - - - -
    -
    POST HTTP request using the fetch API.
    Beware that the given options -object match the url expectations.
    resolve -returns the response as an Object.
    reject returns an error key as a String.
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    url - - -String - - - -

    The POST url to fetch data from

    data - - -Object - - - -

    The JSON object that contains POST parameters

    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    The request Promise

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - -
    -
    - - - - - - - - - - - - - -

    (async, static) postRaw(url, data) → {Promise}

    - - - - - - -
    -
    POST HTTP request using the fetch API.
    Beware that the given options -object match the url expectations.
    resolve, with an override -mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject -returns an error code as a String.
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    url - - -String - - - -

    The url to fetch raw data from

    data - - -Object - - - -

    The JSON object that contains POST parameters

    - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Source:
    -
    - - - - - - - -
    - - - - - - - - - - - - - - - -
    Returns:
    - - -
    -

    The request Promise

    -
    - - - -
    -
    - Type -
    -
    - -Promise - - +
    Author:
    +
    +
      +
    • Arthur Beaulieu
    • +
    -
    - - - - - - - - - - - - - -

    (async, static) postText(url, data) → {Promise}

    - - - - - - -
    -
    POST HTTP request using the fetch API.
    Beware that the given options -object match the url expectations.
    resolve -returns the response as a String.
    reject returns an error key as a String.
    -
    - - - - - - - - - -
    Parameters:
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescription
    url - - -String - - - -

    The POST url to fetch data from

    data - - -Object - - - -

    The JSON object that contains POST parameters

    - - - - - - -
    - - - - - - - - - - - - - - - - - @@ -2589,7 +2229,7 @@
    Parameters:
    Source:
    @@ -2657,13 +2297,13 @@
    Returns:

    - Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 18:34:38 GMT+0200 (Central European Summer Time) + Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 19:45:58 GMT+0200 (Central European Summer Time)
    diff --git a/front/doc/index.html b/front/doc/index.html index 6e5f431..bed03ab 100644 --- a/front/doc/index.html +++ b/front/doc/index.html @@ -60,13 +60,13 @@


    - Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 18:34:38 GMT+0200 (Central European Summer Time) + Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 19:45:58 GMT+0200 (Central European Summer Time)
    diff --git a/front/doc/js_core_Kom.js.html b/front/doc/js_core_Kom.js.html index 3b1eeeb..2a221f1 100644 --- a/front/doc/js_core_Kom.js.html +++ b/front/doc/js_core_Kom.js.html @@ -29,38 +29,56 @@

    Source: js/core/Kom.js

    class Kom {
     
     
    -  /** @summary <h1>Server communication abstraction</h1>
    +  /** 
    +   * @summary Server communication abstraction
        * @author Arthur Beaulieu
    -   * @since June 2020
    -   * @description <blockquote>This class is the main object to deal with when requesting something from the server.<br>
    +   * @since September 2022
    +   * @description
    +   * <blockquote>
    +   * This class is the main object to deal with when requesting something from the server.
        * It handle all urls calls (<code>GET</code>, <code>POST</code>), treat responses or handle errors using
        * <code>Promise</code>.<br>Because it uses <code>Promise</code>, success and errors are to be handled in the caller
        * function, using <code>.then()</code> and <code>.catch()</code>. To properly deal with <code>POST</code> request,
    -   * the session must contain a csrf token in cookies. Otherwise, those <code>POST</code> call may fail.</blockquote> */
    +   * the session must contain a csrf token in cookies. Otherwise, those <code>POST</code> call may fail.
    +   * </blockquote> 
    +   **/
       constructor() {
    -    /** @private
    -     * @member {string} - User session CSRF token to use in POST request */
    +    /** 
    +     * User session CSRF token to use in POST request
    +     * @type {string}
    +     * @private
    +     **/
         this._csrfToken = this._getCsrfCookie();
    -    /** @private
    -     * @member {array[]} - Array of HTTP headers to be used in HTTP calls */
    +    /** 
    +     * Array of HTTP headers to be used in HTTP calls
    +     * @type {Array[]}
    +     * @private
    +     **/
         this._headers = this._createRequestHeaders();
         // Check that CSRF token exists and that headers are properly created
         this._checkValidity();
       }
     
     
    -  /*  --------------------------------------------------------------------------------------------------------------- */
    -  /*  -------------------------------------------  CLASS INIT UTILS  -----------------------------------------------  */
    -  /*  --------------------------------------------------------------------------------------------------------------- */
    +  // ======================================================================== //
    +  // ------------------------- Class initialization ------------------------- //
    +  // ======================================================================== //
     
     
    -  /** @method
    +  /**
    +   * @method
        * @name _getCsrfCookie
        * @private
        * @memberof Kom
    -   * @description <blockquote>Extract CSRF token value from client cookies and returns it as a string. Returns an empty
    -   * string by default. This method is required to be called on construction.</blockquote>
    -   * @return {string} - The CSRF token string */
    +   * @author Arthur Beaulieu
    +   * @since September 2022
    +   * @description
    +   * <blockquote>
    +   * Extract CSRF token value from client cookies and returns it as a string. Returns an empty
    +   * string by default. This method is required to be called on construction.
    +   * </blockquote>
    +   * @return {String} - The CSRF token string 
    +   **/
       _getCsrfCookie() {
         if (document.cookie && document.cookie !== '') {
           const cookies = document.cookie.split(';');
    @@ -78,13 +96,20 @@ 

    Source: js/core/Kom.js

    } - /** @method + /** + * @method * @name _createRequestHeaders * @private * @memberof Kom - * @description <blockquote>Fills Kom <code>_headers</code> private member array, to use in HTTP requests later on. - * This method is required to be called on construction.</blockquote> - * @return {array[]} - The headers array, length 3, to be used in HTTP requests */ + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * Fills Kom <code>_headers</code> private member array, to use in HTTP requests later on. + * This method is required to be called on construction. + * </blockquote> + * @return {Array[]} - The headers array, length 3, to be used in HTTP requests + **/ _createRequestHeaders() { return [ ['Content-Type', 'application/json; charset=UTF-8'], @@ -94,12 +119,18 @@

    Source: js/core/Kom.js

    } - /** @method - * @async + /** + * @method * @name _checkValidity * @private * @memberof Kom - * @description <blockquote>Check the Kom instance validity to ensure its properties validity.</blockquote> */ + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * Check the Kom instance validity (eough headers) to ensure its properties validity. + * </blockquote> + **/ _checkValidity() { if (this._csrfToken !== '') { if (this._headers.length !== 3) { @@ -111,43 +142,28 @@

    Source: js/core/Kom.js

    } - /* --------------------------------------------------------------------------------------------------------------- */ - /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */ - /* --------------------------------------------------------------------------------------------------------------- */ + // ======================================================================== // + // ------------------------- Response formatting -------------------------- // + // ======================================================================== // - /** @method - * @name _getErrorCodeFromHTTPStatus - * @private - * @memberof Kom - * @description <blockquote>This method is called whenever a server request didn't went well. In case a request (from - * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled - * in the user interface (with notification, console or else).</blockquote> - * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration - * @return {string} The HTTP status as an error code */ - _getErrorCodeFromHTTPStatus(code) { - if (code === 404) { - return 'B_KOM_NOT_FOUND'; - } else if (code === 403) { - return 'B_KOM_ACCESS_FORBIDDEN'; - } else if (code === 500) { - return 'B_KOM_INTERNAL_ERROR'; - } else { - return `B_KOM_UNKNOWN_ERROR`; - } - } - - - /** @method + /** + * @method * @async * @name _resolveAs * @private * @memberof Kom - * @description <blockquote>Generic tool method used by private methods on fetch responses to format output in the provided - * format. It must be either `json`, `text` or `raw`.</blockquote> - * @param {String} type - The type of resolution, can be `json`, `text` or `raw` + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * Generic tool method used by private methods on fetch responses to format output in the provided + * format. It must be either `json`, `text`, `raw` or `dom`. + * </blockquote> + * @param {String} type - The type of resolution, can be `json`, `text`, `raw` or `dom` * @param {Object} response - The <code>fetch</code> response object - * @returns {Promise} The request <code>Promise</code>, format response as an object on resolve, as error code string on reject */ + * @returns {Promise} The request <code>Promise</code>, format response as an object on resolve, as error code string on reject + **/ _resolveAs(type, response) { return new Promise((resolve, reject) => { if (response) { @@ -155,13 +171,13 @@

    Source: js/core/Kom.js

    if (response.status === 200) { resolve(response.responseText); } else { - reject(this._getErrorCodeFromHTTPStatus(response.status)); + reject(response.status); } } else if (type === 'json' || type === 'text') { // Call are made using fetch API if (response[type]) { resolve(response[type]()); } else { // Fallback on standard error handling - reject(this._getErrorCodeFromHTTPStatus(response.status)); + reject(response.status); } } else if (type === 'dom') { response.text().then(html => { @@ -177,87 +193,92 @@

    Source: js/core/Kom.js

    } - /** @method + /** + * @method * @async * @name _resolveAsJSON * @private * @memberof Kom - * @description <blockquote>Tool method used by public methods on fetch responses to format output data as JSON to be - * read in JavaScript code as objects.</blockquote> + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * Tool method used by public methods on fetch responses to format output data as JSON to be + * read in JavaScript code as objects. + * </blockquote> * @param {Object} response - The <code>fetch</code> response object - * @returns {Promise} The request <code>Promise</code>, format response as an object on resolve, as error code string on reject */ + * @returns {Promise} The request <code>Promise</code>, format response as an object on resolve, as error code string on reject + **/ _resolveAsJSON(response) { return this._resolveAs('json', response); } - /** @method + /** + * @method * @async * @name _resolveAsText * @private * @memberof Kom - * @description <blockquote>Tool method used by public methods on fetch responses to format output data as text to be - * read in JavaScript code as string (mostly to parse HTML templates).</blockquote> + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * Tool method used by public methods on fetch responses to format output data as text to be + * read in JavaScript code as string (mostly to parse HTML templates). + * </blockquote> * @param {Object} response - The <code>fetch</code> response object - * @returns {Promise} The request <code>Promise</code>, format response as a string on resolve, as error code string on reject */ + * @returns {Promise} The request <code>Promise</code>, format response as a string on resolve, as error code string on reject + **/ _resolveAsText(response) { return this._resolveAs('text', response); } - _resolveAsDom(response) { - return this._resolveAs('dom', response); - } - - - /** @method + /** + * @method * @async - * @name _resolveAsRaw + * @name _resolveAsDom * @private * @memberof Kom - * @description <blockquote>Tool method used by XmlHTTPRequests to format server response as raw binary data.</blockquote> - * @param {Object} response - The <code>XmlHTTPRequest</code> response status object - * @returns {Promise} The request <code>Promise</code>, doesn't format response on resolve, send error code string on reject */ - _resolveAsRaw(response) { - return this._resolveAs('raw', response); + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * Tool method used by public methods on fetch responses to format output data as DOM fragment to be + * read in JavaScript code as HTML template. + * </blockquote> + * @param {Object} response - The <code>fetch</code> response object + * @returns {Promise} The request <code>Promise</code>, format response as a string on resolve, as error code string on reject + **/ + _resolveAsDom(response) { + return this._resolveAs('dom', response); } - _xhrCall(url, verb, data) { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.open(verb, url, true); - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = response => { - if (response.target.readyState === 4) { // Ready state changed has reach the response state - this._resolveAsRaw(response.target) - .then(resolve) - .catch(reject); - } - }; - xhr.onerror = () => { - reject('F_KOM_XHR_ERROR'); - }; - xhr.send(data); - }); - } - - /* --------------------------------------------------------------------------------------------------------------- */ - /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */ - /* --------------------------------------------------------------------------------------------------------------- */ + // ======================================================================== // + // --------------------------- GET server calls --------------------------- // + // ======================================================================== // - /** @method + /** + * @method * @async * @name get * @public * @memberof Kom - * @description <blockquote><code>GET</code> HTTP request using the fetch API.<br><code>resolve</code> returns the + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * <code>GET</code> HTTP request using the fetch API.<br><code>resolve</code> returns the * response as an <code>Object</code>.<br><code>reject</code> returns an error key as a <code>String</code>. - * It is meant to perform API call to access database through the user interface.</blockquote> + * It is meant to perform API call to access database through the user interface. + * </blockquote> * @param {String} url - The <code>GET</code> url to fetch data from, in supported back URLs - * @returns {Promise} The request <code>Promise</code> */ + * @returns {Promise} The request <code>Promise</code> + **/ get(url, resolution = this._resolveAsJSON.bind(this)) { return new Promise((resolve, reject) => { const options = { @@ -273,66 +294,73 @@

    Source: js/core/Kom.js

    } - /** @method + /** + * @method * @async * @name getText * @public * @memberof Kom - * @description <blockquote><code>GET</code> HTTP request using the fetch API.<br><code>resolve</code> returns the + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * <code>GET</code> HTTP request using the fetch API.<br><code>resolve</code> returns the * response as a <code>String</code>.<br><code>reject</code> returns an error key as a <code>String</code>. It is - * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.</blockquote> + * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments. + * </blockquote> * @param {String} url - The <code>GET</code> url to fetch data from, in supported back URLs - * @returns {Promise} The request <code>Promise</code> */ + * @returns {Promise} The request <code>Promise</code> + **/ getText(url) { return this.get(url, this._resolveAsText.bind(this)); } - /** @method + /** + * @method * @async * @name getText * @public * @memberof Kom - * @description <blockquote><code>GET</code> HTTP request using the fetch API.<br><code>resolve</code> returns the + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * <code>GET</code> HTTP request using the fetch API.<br><code>resolve</code> returns the * response as a <code>String</code>.<br><code>reject</code> returns an error key as a <code>String</code>. It is - * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.</blockquote> + * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments. + * </blockquote> * @param {String} url - The <code>GET</code> url to fetch data from, in supported back URLs - * @returns {Promise} The request <code>Promise</code> */ + * @returns {Promise} The request <code>Promise</code> + **/ getTemplate(url) { return this.get(url, this._resolveAsDom.bind(this)); } - /** @method - * @async - * @name getRaw - * @public - * @memberof Kom - * @description <blockquote><code>GET</code> HTTP request using an <code>XMLHttpRequest</code>, with an override - * mime type hack to pass bytes through unprocessed.<br><code>resolve</code> returns the response as raw binary data.<br><code>reject</code> - * returns an error code as a <code>String</code>.</blockquote> - * @param {String} url - The url to fetch raw data from - * @returns {Promise} The request <code>Promise</code> */ - getRaw(url) { - return new Promise((resolve, reject) => { - this._xhrCall(url, 'GET', null) - .then(resolve) - .catch(reject); - }); - } + // ======================================================================== // + // -------------------------- POST server calls --------------------------- // + // ======================================================================== // - /** @method + /** + * @method * @async * @name post * @public * @memberof Kom - * @description <blockquote><code>POST</code> HTTP request using the fetch API.<br>Beware that the given options + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * <code>POST</code> HTTP request using the fetch API.<br>Beware that the given options * object match the url expectations.<br><code>resolve</code> - * returns the response as an <code>Object</code>.<br><code>reject</code> returns an error key as a <code>String</code>.</blockquote> + * returns the response as an <code>Object</code>.<br><code>reject</code> returns an error key as a <code>String</code>. + * </blockquote> * @param {String} url - The <code>POST</code> url to fetch data from * @param {Object} data - The <code>JSON</code> object that contains <code>POST</code> parameters - * @returns {Promise} The request <code>Promise</code> */ + * @returns {Promise} The request <code>Promise</code> + **/ post(url, data, resolution = this._resolveAsJSON.bind(this)) { return new Promise((resolve, reject) => { const options = { @@ -349,65 +377,76 @@

    Source: js/core/Kom.js

    } - /** @method + /** + * @method * @async * @name postText * @public * @memberof Kom - * @description <blockquote><code>POST</code> HTTP request using the fetch API.<br>Beware that the given options + * @author Arthur Beaulieu + * @since September 2022 + * @description + * <blockquote> + * <code>POST</code> HTTP request using the fetch API.<br>Beware that the given options * object match the url expectations.<br><code>resolve</code> - * returns the response as a <code>String</code>.<br><code>reject</code> returns an error key as a <code>String</code>.</blockquote> + * returns the response as a <code>String</code>.<br><code>reject</code> returns an error key as a <code>String</code>. + * </blockquote> * @param {String} url - The <code>POST</code> url to fetch data from * @param {Object} data - The <code>JSON</code> object that contains <code>POST</code> parameters - * @returns {Promise} The request <code>Promise</code> */ + * @returns {Promise} The request <code>Promise</code> + **/ postText(url, data) { return this.post(url, data, this._resolveAsText.bind(this)); } - /** @method - * @async - * @name postRaw - * @public - * @memberof Kom - * @description <blockquote><code>POST</code> HTTP request using the fetch API.<br>Beware that the given options - * object match the url expectations.<br><code>resolve</code>, with an override - * mime type hack to pass bytes through unprocessed.<br><code>resolve</code> returns the response as raw binary data.<br><code>reject</code> - * returns an error code as a <code>String</code>.</blockquote> - * @param {String} url - The url to fetch raw data from - * @param {Object} data - The <code>JSON</code> object that contains <code>POST</code> parameters - * @returns {Promise} The request <code>Promise</code> */ - postRaw(url, data) { + // ======================================================================== // + // ------------------ BeerCrackerz server call shortcuts ------------------ // + // ======================================================================== // + + + _getPoints(type) { return new Promise((resolve, reject) => { - this._xhrCall(url, 'POST', JSON.stringify(data)) - .then(resolve) - .catch(reject); + this.get(`http://localhost:8080/api/${type}`).then(resolve).catch(reject); }); } - /* */ + getSpots() { + return this._getPoints('spot'); + } + + + getShops() { + return this._getPoints('shop'); + } - savePoint(type, data) { - return new Promise(resolve => { - this.post(`http://localhost:8080/api/${type}/`, data, null).then(resolve); + getBars() { + return this._getPoints('bar'); + } + + + _savePoint(type, data) { + return new Promise((resolve, reject) => { + // Send null to resolveAs to ensure nothing is done after post call + this.post(`http://localhost:8080/api/${type}/`, data, null).then(resolve).catch(reject); }); } spotCreated(data) { - return new Promise(resolve => { this.savePoint('spot', data).then(resolve); }); + return this._savePoint('spot', data); } shopCreated(data) { - return new Promise(resolve => { this.savePoint('shop', data).then(resolve); }); + return this._savePoint('shop', data); } barCreated(data) { - return new Promise(resolve => { this.savePoint('bar', data).then(resolve); }); + return this._savePoint('bar', data); } @@ -426,13 +465,13 @@

    Source: js/core/Kom.js


    - Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 18:34:38 GMT+0200 (Central European Summer Time) + Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 19:45:58 GMT+0200 (Central European Summer Time)
    diff --git a/front/doc/js_utils_Utils.js.html b/front/doc/js_utils_Utils.js.html index d630d73..a2b0a4f 100644 --- a/front/doc/js_utils_Utils.js.html +++ b/front/doc/js_utils_Utils.js.html @@ -32,60 +32,6 @@

    Source: js/utils/Utils.js

    constructor() { /* Not meant to be instantiated, all methods should be static */ } - static fetchTemplate(url) { - return new Promise((resolve, reject) => { - fetch(url).then(data => { - data.text().then(html => { - resolve(document.createRange().createContextualFragment(html)); - }).catch(reject); - }).catch(reject); - }); - } - - - static fetchFile(url) { - return new Promise((resolve, reject) => { - fetch(url).then(data => { - data.text().then(resolve).catch(reject); - }).catch(reject); - }); - } - - - static getReq(url) { - return new Promise((resolve, reject) => { - const options = { - method: 'GET', - headers: new Headers(), - mode: 'cors', - cache: 'default', - url: `http://localhost:8080` - }; - - fetch(url, options).then(data => { - data.json().then(resolve).catch(reject); - }).catch(reject); - }); - } - - - static postReq(url, data) { - return new Promise((resolve, reject) => { - const options = { - method: 'POST', - headers: new Headers(), - mode: 'cors', - cache: 'default', - body: data - }; - - fetch(url, options).then(data => { - data.json().then(resolve).catch(reject); - }).catch(reject); - }); - } - - static stripDom(html){ let doc = new DOMParser().parseFromString(html, 'text/html'); return doc.body.textContent || ''; @@ -216,31 +162,6 @@

    Source: js/utils/Utils.js

    } - /* Point getter and setter */ - - - static getPoints(type) { - return new Promise(resolve => { - Utils.getReq(`http://localhost:8080/api/${type}`).then(resolve); - }); - } - - - static getSpots() { - return new Promise(resolve => { Utils.getPoints('spot').then(resolve); }); - } - - - static getShops() { - return new Promise(resolve => { Utils.getPoints('shop').then(resolve); }); - } - - - static getBars() { - return new Promise(resolve => { Utils.getPoints('bar').then(resolve); }); - } - - /* Preference get set (DEPRECATED) */ @@ -316,7 +237,7 @@

    Source: js/utils/Utils.js

    static get SUPPORTED_LANGUAGE() { - return ['en', 'fr', 'es', 'de']; + return ['en', 'fr', 'es', 'de', 'pt']; } @@ -334,13 +255,13 @@

    Source: js/utils/Utils.js


    - Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 18:34:38 GMT+0200 (Central European Summer Time) + Documentation generated by JSDoc 3.6.11 on Sat Sep 17 2022 19:45:58 GMT+0200 (Central European Summer Time)
    diff --git a/front/src/BeerCrackerz.js b/front/src/BeerCrackerz.js index 48cec3b..19d0fd3 100644 --- a/front/src/BeerCrackerz.js +++ b/front/src/BeerCrackerz.js @@ -500,32 +500,20 @@ class BeerCrackerz extends MapHelper { }); }; - Utils.getSpots().then(spots => { + this._kom.getSpots().then(spots => { for (let i = 0; i < spots.length; ++i) { - // TODO @raph - spots[i].type = 'spot'; - spots[i].user = 'messmaker'; - spots[i].userId = 42; iterateMarkers(spots[i]); } }); - Utils.getShops().then(shops => { + this._kom.getShops().then(shops => { for (let i = 0; i < shops.length; ++i) { - // TODO @raph - shops[i].type = 'shop'; - shops[i].user = 'messmaker'; - shops[i].userId = 42; iterateMarkers(shops[i]); } }); - Utils.getBars().then(bars => { + this._kom.getBars().then(bars => { for (let i = 0; i < bars.length; ++i) { - // TODO @raph - bars[i].type = 'bar'; - bars[i].user = 'messmaker'; - bars[i].userId = 42; iterateMarkers(bars[i]); } }); @@ -705,7 +693,7 @@ class BeerCrackerz extends MapHelper { editMarkModal(options) { - Utils.fetchTemplate(`/static/html/modal/edit${options.type}.html`).then(dom => { + this._kom.getTemplate(`/static/html/modal/edit${options.type}.html`).then(dom => { const name = dom.querySelector(`#${options.type}-name`); const description = dom.querySelector(`#${options.type}-desc`); const submit = dom.querySelector(`#${options.type}-submit`); @@ -771,7 +759,7 @@ class BeerCrackerz extends MapHelper { * @param {Function} cb The function to callback with true or false depending on user's choice **/ deleteMarkModal(cb) { - Utils.fetchTemplate('/static/html/modal/deletemark.html').then(dom => { + this._kom.getTemplate('/static/html/modal/deletemark.html').then(dom => { // Update nls for template Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{MODAL_TITLE}`, this.nls.modal('deleteMarkTitle')); Utils.replaceString(dom.querySelector(`#nls-modal-desc`), `{MODAL_DESC}`, this.nls.modal('deleteMarkDesc')); @@ -807,7 +795,7 @@ class BeerCrackerz extends MapHelper { * **/ userProfileModal() { - Utils.fetchTemplate('/static/html/modal/user.html').then(dom => { + this._kom.getTemplate('/static/html/modal/user.html').then(dom => { // Update nls for template Utils.replaceString(dom.querySelector(`#nls-modal-title`), `{MODAL_TITLE}`, this.nls.modal('userTitle')); Utils.replaceString(dom.querySelector(`#nls-user-modal-accuracy`), `{ACCURACY_USER_MODAL}`, this.nls.modal('userAccuracyPref')); @@ -847,7 +835,7 @@ class BeerCrackerz extends MapHelper { * **/ hidShowModal() { - Utils.fetchTemplate('/static/html/modal/hideshow.html').then(dom => { + this._kom.getTemplate('/static/html/modal/hideshow.html').then(dom => { // Update template nls Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-title`), `{MODAL_TITLE}`, this.nls.modal('hideShowTitle')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-labels`), `{LABELS_HIDESHOW_MODAL}`, this.nls.modal('hideShowLabels')); diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index d6ec0b2..0e4accf 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -11,11 +11,6 @@ import Clusters from './js/utils/ClusterEnum.js'; import Utils from './js/utils/Utils.js'; -/** - * @class - * @constructor - * @public -**/ class BeerCrackerzAuth { @@ -127,6 +122,7 @@ class BeerCrackerzAuth { /** * @method + * @async * @name _initMap * @private * @memberof BeerCrackerzAuth @@ -139,7 +135,7 @@ class BeerCrackerzAuth { * * @returns {Promise} A Promise resolved when preferences are set **/ - _initMap() { + _initMap() { return new Promise(resolve => { // Use main div to inject OSM into this._map = window.L.map('beer-crakerz-map', { @@ -173,6 +169,7 @@ class BeerCrackerzAuth { /** * @method + * @async * @name _initGeolocation * @private * @memberof BeerCrackerzAuth @@ -187,7 +184,7 @@ class BeerCrackerzAuth { * * @returns {Promise} A Promise resolved when preferences are set **/ - _initGeolocation() { + _initGeolocation() { return new Promise(resolve => { if ('geolocation' in navigator) { this._watchId = navigator.geolocation.watchPosition(position => { @@ -211,6 +208,7 @@ class BeerCrackerzAuth { /** * @method + * @async * @name _initEvents * @private * @memberof BeerCrackerzAuth @@ -254,6 +252,7 @@ class BeerCrackerzAuth { /** * @method + * @async * @name _initMarkers * @private * @memberof BeerCrackerzAuth @@ -286,32 +285,20 @@ class BeerCrackerzAuth { }); }; - Utils.getSpots().then(spots => { + this._kom.getSpots().then(spots => { for (let i = 0; i < spots.length; ++i) { - // TODO @raph - spots[i].type = 'spot'; - spots[i].user = 'messmaker'; - spots[i].userId = 1; iterateMarkers(spots[i]); } }); - Utils.getShops().then(shops => { + this._kom.getShops().then(shops => { for (let i = 0; i < shops.length; ++i) { - // TODO @raph - shops[i].type = 'shop'; - shops[i].user = 'messmaker'; - shops[i].userId = 1; iterateMarkers(shops[i]); } }); - Utils.getBars().then(bars => { + this._kom.getBars().then(bars => { for (let i = 0; i < bars.length; ++i) { - // TODO @raph - bars[i].type = 'bar'; - bars[i].user = 'messmaker'; - bars[i].userId = 1; iterateMarkers(bars[i]); } }); @@ -356,6 +343,7 @@ class BeerCrackerzAuth { /** * @method + * @async * @name _loadAside * @private * @memberof BeerCrackerzAuth @@ -364,7 +352,7 @@ class BeerCrackerzAuth { * @description *
    * The _loadAside() method is a generic method to load an HTML template and replace - * the aside DOM content with that template, aswell as updating the document's class. + * the aside DOM content with that template, aswell as updating the document's class. *
    * @param {String} type - The aside to load in login/register/forgot-password * @returns {Promise} A Promise resolved when template is loaded and in DOM @@ -437,7 +425,7 @@ class BeerCrackerzAuth { _loadForgotPasswordAside() { this._loadAside('forgot-password').then(this._handleResetPasswordAside.bind(this)).catch(() => { console.error('Couldn\'t fetch or build the forgot password aside'); - }); + }); } @@ -604,10 +592,10 @@ class BeerCrackerzAuth { }, false); // Register event document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false); - document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false); + document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false); } - + /** * @method * @name _handleResetPasswordAside @@ -721,7 +709,7 @@ class BeerCrackerzAuth { * @param {Float} options.lat - The marker latitude * @param {Float} options.lng - The marker longitude * @param {HTMLElement} [options.dom] - The marker popup content - * @return {HTMLElement} The Leaflet marker extended with option properties + * @returns {HTMLElement} The Leaflet marker extended with option properties **/ _createMarker(options) { let icon = Markers.black; @@ -754,6 +742,7 @@ class BeerCrackerzAuth { /** * @method + * @async * @name _markPopupFactory * @private * @memberof BeerCrackerzAuth @@ -771,7 +760,7 @@ class BeerCrackerzAuth { * @param {String} options.user - The user that discovered the marker * @param {String} options.description - The marker description * @param {Float} options.rate - The marker rate - * @return {Promise} A promise resolved with the popup DOM element + * @returns {Promise} A promise resolved with the popup DOM element **/ _markPopupFactory(options) { return new Promise(resolve => { diff --git a/front/src/js/core/Kom.js b/front/src/js/core/Kom.js index 15abca6..231c7f9 100644 --- a/front/src/js/core/Kom.js +++ b/front/src/js/core/Kom.js @@ -1,38 +1,56 @@ class Kom { - /** @summary

    Server communication abstraction

    + /** + * @summary Server communication abstraction * @author Arthur Beaulieu - * @since June 2020 - * @description
    This class is the main object to deal with when requesting something from the server.
    + * @since September 2022 + * @description + *
    + * This class is the main object to deal with when requesting something from the server. * It handle all urls calls (GET, POST), treat responses or handle errors using * Promise.
    Because it uses Promise, success and errors are to be handled in the caller * function, using .then() and .catch(). To properly deal with POST request, - * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */ + * the session must contain a csrf token in cookies. Otherwise, those POST call may fail. + *
    + **/ constructor() { - /** @private - * @member {string} - User session CSRF token to use in POST request */ + /** + * User session CSRF token to use in POST request + * @type {string} + * @private + **/ this._csrfToken = this._getCsrfCookie(); - /** @private - * @member {array[]} - Array of HTTP headers to be used in HTTP calls */ + /** + * Array of HTTP headers to be used in HTTP calls + * @type {Array[]} + * @private + **/ this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created this._checkValidity(); } - /* --------------------------------------------------------------------------------------------------------------- */ - /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */ - /* --------------------------------------------------------------------------------------------------------------- */ + // ======================================================================== // + // ------------------------- Class initialization ------------------------- // + // ======================================================================== // - /** @method + /** + * @method * @name _getCsrfCookie * @private * @memberof Kom - * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty - * string by default. This method is required to be called on construction.
    - * @return {string} - The CSRF token string */ + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Extract CSRF token value from client cookies and returns it as a string. Returns an empty + * string by default. This method is required to be called on construction. + *
    + * @return {String} - The CSRF token string + **/ _getCsrfCookie() { if (document.cookie && document.cookie !== '') { const cookies = document.cookie.split(';'); @@ -50,13 +68,20 @@ class Kom { } - /** @method + /** + * @method * @name _createRequestHeaders * @private * @memberof Kom - * @description
    Fills Kom _headers private member array, to use in HTTP requests later on. - * This method is required to be called on construction.
    - * @return {array[]} - The headers array, length 3, to be used in HTTP requests */ + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Fills Kom _headers private member array, to use in HTTP requests later on. + * This method is required to be called on construction. + *
    + * @return {Array[]} - The headers array, length 3, to be used in HTTP requests + **/ _createRequestHeaders() { return [ ['Content-Type', 'application/json; charset=UTF-8'], @@ -66,12 +91,18 @@ class Kom { } - /** @method - * @async + /** + * @method * @name _checkValidity * @private * @memberof Kom - * @description
    Check the Kom instance validity to ensure its properties validity.
    */ + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Check the Kom instance validity (eough headers) to ensure its properties validity. + *
    + **/ _checkValidity() { if (this._csrfToken !== '') { if (this._headers.length !== 3) { @@ -83,43 +114,28 @@ class Kom { } - /* --------------------------------------------------------------------------------------------------------------- */ - /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */ - /* --------------------------------------------------------------------------------------------------------------- */ + // ======================================================================== // + // ------------------------- Response formatting -------------------------- // + // ======================================================================== // - /** @method - * @name _getErrorCodeFromHTTPStatus - * @private - * @memberof Kom - * @description
    This method is called whenever a server request didn't went well. In case a request (from - * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled - * in the user interface (with notification, console or else).
    - * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration - * @return {string} The HTTP status as an error code */ - _getErrorCodeFromHTTPStatus(code) { - if (code === 404) { - return 'B_KOM_NOT_FOUND'; - } else if (code === 403) { - return 'B_KOM_ACCESS_FORBIDDEN'; - } else if (code === 500) { - return 'B_KOM_INTERNAL_ERROR'; - } else { - return `B_KOM_UNKNOWN_ERROR`; - } - } - - - /** @method + /** + * @method * @async * @name _resolveAs * @private * @memberof Kom - * @description
    Generic tool method used by private methods on fetch responses to format output in the provided - * format. It must be either `json`, `text` or `raw`.
    - * @param {String} type - The type of resolution, can be `json`, `text` or `raw` + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Generic tool method used by private methods on fetch responses to format output in the provided + * format. It must be either `json`, `text`, `raw` or `dom`. + *
    + * @param {String} type - The type of resolution, can be `json`, `text`, `raw` or `dom` * @param {Object} response - The fetch response object - * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */ + * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject + **/ _resolveAs(type, response) { return new Promise((resolve, reject) => { if (response) { @@ -127,13 +143,13 @@ class Kom { if (response.status === 200) { resolve(response.responseText); } else { - reject(this._getErrorCodeFromHTTPStatus(response.status)); + reject(response.status); } } else if (type === 'json' || type === 'text') { // Call are made using fetch API if (response[type]) { resolve(response[type]()); } else { // Fallback on standard error handling - reject(this._getErrorCodeFromHTTPStatus(response.status)); + reject(response.status); } } else if (type === 'dom') { response.text().then(html => { @@ -149,87 +165,92 @@ class Kom { } - /** @method + /** + * @method * @async * @name _resolveAsJSON * @private * @memberof Kom - * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be - * read in JavaScript code as objects.
    + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Tool method used by public methods on fetch responses to format output data as JSON to be + * read in JavaScript code as objects. + *
    * @param {Object} response - The fetch response object - * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */ + * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject + **/ _resolveAsJSON(response) { return this._resolveAs('json', response); } - /** @method + /** + * @method * @async * @name _resolveAsText * @private * @memberof Kom - * @description
    Tool method used by public methods on fetch responses to format output data as text to be - * read in JavaScript code as string (mostly to parse HTML templates).
    + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Tool method used by public methods on fetch responses to format output data as text to be + * read in JavaScript code as string (mostly to parse HTML templates). + *
    * @param {Object} response - The fetch response object - * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */ + * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject + **/ _resolveAsText(response) { return this._resolveAs('text', response); } - _resolveAsDom(response) { - return this._resolveAs('dom', response); - } - - - /** @method + /** + * @method * @async - * @name _resolveAsRaw + * @name _resolveAsDom * @private * @memberof Kom - * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    - * @param {Object} response - The XmlHTTPRequest response status object - * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */ - _resolveAsRaw(response) { - return this._resolveAs('raw', response); + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * Tool method used by public methods on fetch responses to format output data as DOM fragment to be + * read in JavaScript code as HTML template. + *
    + * @param {Object} response - The fetch response object + * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject + **/ + _resolveAsDom(response) { + return this._resolveAs('dom', response); } - _xhrCall(url, verb, data) { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.open(verb, url, true); - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - xhr.onreadystatechange = response => { - if (response.target.readyState === 4) { // Ready state changed has reach the response state - this._resolveAsRaw(response.target) - .then(resolve) - .catch(reject); - } - }; - xhr.onerror = () => { - reject('F_KOM_XHR_ERROR'); - }; - xhr.send(data); - }); - } - - /* --------------------------------------------------------------------------------------------------------------- */ - /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */ - /* --------------------------------------------------------------------------------------------------------------- */ + // ======================================================================== // + // --------------------------- GET server calls --------------------------- // + // ======================================================================== // - /** @method + /** + * @method * @async * @name get * @public * @memberof Kom - * @description
    GET HTTP request using the fetch API.
    resolve returns the + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * GET HTTP request using the fetch API.
    resolve returns the * response as an Object.
    reject returns an error key as a String. - * It is meant to perform API call to access database through the user interface.
    + * It is meant to perform API call to access database through the user interface. + *
    * @param {String} url - The GET url to fetch data from, in supported back URLs - * @returns {Promise} The request Promise */ + * @returns {Promise} The request Promise + **/ get(url, resolution = this._resolveAsJSON.bind(this)) { return new Promise((resolve, reject) => { const options = { @@ -245,66 +266,73 @@ class Kom { } - /** @method + /** + * @method * @async * @name getText * @public * @memberof Kom - * @description
    GET HTTP request using the fetch API.
    resolve returns the + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * GET HTTP request using the fetch API.
    resolve returns the * response as a String.
    reject returns an error key as a String. It is - * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    + * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments. + *
    * @param {String} url - The GET url to fetch data from, in supported back URLs - * @returns {Promise} The request Promise */ + * @returns {Promise} The request Promise + **/ getText(url) { return this.get(url, this._resolveAsText.bind(this)); } - /** @method + /** + * @method * @async * @name getText * @public * @memberof Kom - * @description
    GET HTTP request using the fetch API.
    resolve returns the + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * GET HTTP request using the fetch API.
    resolve returns the * response as a String.
    reject returns an error key as a String. It is - * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    + * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments. + *
    * @param {String} url - The GET url to fetch data from, in supported back URLs - * @returns {Promise} The request Promise */ + * @returns {Promise} The request Promise + **/ getTemplate(url) { return this.get(url, this._resolveAsDom.bind(this)); } - /** @method - * @async - * @name getRaw - * @public - * @memberof Kom - * @description
    GET HTTP request using an XMLHttpRequest, with an override - * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject - * returns an error code as a String.
    - * @param {String} url - The url to fetch raw data from - * @returns {Promise} The request Promise */ - getRaw(url) { - return new Promise((resolve, reject) => { - this._xhrCall(url, 'GET', null) - .then(resolve) - .catch(reject); - }); - } + // ======================================================================== // + // -------------------------- POST server calls --------------------------- // + // ======================================================================== // - /** @method + /** + * @method * @async * @name post * @public * @memberof Kom - * @description
    POST HTTP request using the fetch API.
    Beware that the given options + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * POST HTTP request using the fetch API.
    Beware that the given options * object match the url expectations.
    resolve - * returns the response as an Object.
    reject returns an error key as a String.
    + * returns the response as an Object.
    reject returns an error key as a String. + *
    * @param {String} url - The POST url to fetch data from * @param {Object} data - The JSON object that contains POST parameters - * @returns {Promise} The request Promise */ + * @returns {Promise} The request Promise + **/ post(url, data, resolution = this._resolveAsJSON.bind(this)) { return new Promise((resolve, reject) => { const options = { @@ -321,65 +349,76 @@ class Kom { } - /** @method + /** + * @method * @async * @name postText * @public * @memberof Kom - * @description
    POST HTTP request using the fetch API.
    Beware that the given options + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * POST HTTP request using the fetch API.
    Beware that the given options * object match the url expectations.
    resolve - * returns the response as a String.
    reject returns an error key as a String.
    + * returns the response as a String.
    reject returns an error key as a String. + *
    * @param {String} url - The POST url to fetch data from * @param {Object} data - The JSON object that contains POST parameters - * @returns {Promise} The request Promise */ + * @returns {Promise} The request Promise + **/ postText(url, data) { return this.post(url, data, this._resolveAsText.bind(this)); } - /** @method - * @async - * @name postRaw - * @public - * @memberof Kom - * @description
    POST HTTP request using the fetch API.
    Beware that the given options - * object match the url expectations.
    resolve, with an override - * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject - * returns an error code as a String.
    - * @param {String} url - The url to fetch raw data from - * @param {Object} data - The JSON object that contains POST parameters - * @returns {Promise} The request Promise */ - postRaw(url, data) { + // ======================================================================== // + // ------------------ BeerCrackerz server call shortcuts ------------------ // + // ======================================================================== // + + + _getPoints(type) { return new Promise((resolve, reject) => { - this._xhrCall(url, 'POST', JSON.stringify(data)) - .then(resolve) - .catch(reject); + this.get(`http://localhost:8080/api/${type}`).then(resolve).catch(reject); }); } - /* */ + getSpots() { + return this._getPoints('spot'); + } + + + getShops() { + return this._getPoints('shop'); + } - savePoint(type, data) { - return new Promise(resolve => { - this.post(`http://localhost:8080/api/${type}/`, data, null).then(resolve); + getBars() { + return this._getPoints('bar'); + } + + + _savePoint(type, data) { + return new Promise((resolve, reject) => { + // Send null to resolveAs to ensure nothing is done after post call + this.post(`http://localhost:8080/api/${type}/`, data, null).then(resolve).catch(reject); }); } spotCreated(data) { - return new Promise(resolve => { this.savePoint('spot', data).then(resolve); }); + return this._savePoint('spot', data); } shopCreated(data) { - return new Promise(resolve => { this.savePoint('shop', data).then(resolve); }); + return this._savePoint('shop', data); } barCreated(data) { - return new Promise(resolve => { this.savePoint('bar', data).then(resolve); }); + return this._savePoint('bar', data); } diff --git a/front/src/js/core/LangManager.js b/front/src/js/core/LangManager.js index f8865b9..d611bba 100644 --- a/front/src/js/core/LangManager.js +++ b/front/src/js/core/LangManager.js @@ -4,6 +4,17 @@ import Utils from '../utils/Utils.js'; class LangManager { + /** + * @summary Handle i18n for BeerCrackerz + * @author Arthur Beaulieu + * @since September 2022 + * @description + *
    + * This class will fetch and store all i18n keys for a given language to be used in BeerCrackerz. + *
    + * @param {String} lang - The selected language to fetch + * @param {Function} cb - The callback to call once i18n keys are loaded + **/ constructor(lang, cb) { this._lang = (Utils.SUPPORTED_LANGUAGE.indexOf(lang) !== -1) ? lang : 'en'; this._values = {}; @@ -13,9 +24,11 @@ class LangManager { _init() { return new Promise((resolve, reject) => { - Utils.fetchFile(`/static/nls/${this._lang}.json`).then(lang => { - this._values = JSON.parse(lang); - resolve(); + fetch(`/static/nls/${this._lang}.json`).then(data => { + data.text().then(nls => { + this._values = JSON.parse(nls); + resolve(); + }).catch(reject); }).catch(reject); }); } diff --git a/front/src/js/ui/MapHelper.js b/front/src/js/ui/MapHelper.js index 7645024..210f115 100644 --- a/front/src/js/ui/MapHelper.js +++ b/front/src/js/ui/MapHelper.js @@ -139,7 +139,7 @@ class MapHelper { defineMarkFactory(type, options) { - Utils.fetchTemplate(`/static/html/modal/new${type}.html`).then(dom => { + this._kom.getTemplate(`/static/html/modal/new${type}.html`).then(dom => { const name = dom.querySelector(`#${type}-name`); const description = dom.querySelector(`#${type}-desc`); const rating = new Rating(dom.querySelector(`#${type}-rating`)); @@ -206,7 +206,7 @@ class MapHelper { markPopupFactory(options) { return new Promise(resolve => { - Utils.fetchTemplate(`/static/html/popup/${options.type}.html`).then(dom => { + this._kom.getTemplate(`/static/html/popup/${options.type}.html`).then(dom => { const element = document.createElement('DIV'); element.appendChild(dom); const user = options.user || this.user.username; diff --git a/front/src/js/utils/Utils.js b/front/src/js/utils/Utils.js index 98aa2c5..334239f 100644 --- a/front/src/js/utils/Utils.js +++ b/front/src/js/utils/Utils.js @@ -4,60 +4,6 @@ class Utils { constructor() { /* Not meant to be instantiated, all methods should be static */ } - static fetchTemplate(url) { - return new Promise((resolve, reject) => { - fetch(url).then(data => { - data.text().then(html => { - resolve(document.createRange().createContextualFragment(html)); - }).catch(reject); - }).catch(reject); - }); - } - - - static fetchFile(url) { - return new Promise((resolve, reject) => { - fetch(url).then(data => { - data.text().then(resolve).catch(reject); - }).catch(reject); - }); - } - - - static getReq(url) { - return new Promise((resolve, reject) => { - const options = { - method: 'GET', - headers: new Headers(), - mode: 'cors', - cache: 'default', - url: `http://localhost:8080` - }; - - fetch(url, options).then(data => { - data.json().then(resolve).catch(reject); - }).catch(reject); - }); - } - - - static postReq(url, data) { - return new Promise((resolve, reject) => { - const options = { - method: 'POST', - headers: new Headers(), - mode: 'cors', - cache: 'default', - body: data - }; - - fetch(url, options).then(data => { - data.json().then(resolve).catch(reject); - }).catch(reject); - }); - } - - static stripDom(html){ let doc = new DOMParser().parseFromString(html, 'text/html'); return doc.body.textContent || ''; @@ -188,31 +134,6 @@ class Utils { } - /* Point getter and setter */ - - - static getPoints(type) { - return new Promise(resolve => { - Utils.getReq(`http://localhost:8080/api/${type}`).then(resolve); - }); - } - - - static getSpots() { - return new Promise(resolve => { Utils.getPoints('spot').then(resolve); }); - } - - - static getShops() { - return new Promise(resolve => { Utils.getPoints('shop').then(resolve); }); - } - - - static getBars() { - return new Promise(resolve => { Utils.getPoints('bar').then(resolve); }); - } - - /* Preference get set (DEPRECATED) */ @@ -288,7 +209,7 @@ class Utils { static get SUPPORTED_LANGUAGE() { - return ['en', 'fr', 'es', 'de']; + return ['en', 'fr', 'es', 'de', 'pt']; } diff --git a/static/dist/BeerCrackerz.bundle.css b/static/dist/BeerCrackerz.bundle.css index ac52940..db743c9 100644 --- a/static/dist/BeerCrackerz.bundle.css +++ b/static/dist/BeerCrackerz.bundle.css @@ -1,4 +1 @@ -/*!******************************************************************************************************************************************************************************************************************!*\ - !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerz.scss ***! - \******************************************************************************************************************************************************************************************************************/ @-webkit-keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes flashing-logo{0%{-webkit-text-fill-color:transparent;background:linear-gradient(60deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}15%{-webkit-text-fill-color:transparent;background:linear-gradient(120deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0}58%{-webkit-text-fill-color:transparent;background:-webkit-gradient(linear,left top,left bottom,from(#97ea9b),color-stop(80%,#ad7fe6));background:linear-gradient(180deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:1;-webkit-transform:scale(1.1);transform:scale(1.1)}to{-webkit-text-fill-color:transparent;background:linear-gradient(240deg,#97ea9b,#ad7fe6 80%);-webkit-background-clip:text;background-clip:text;opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes drop-nav-link{0%{margin-bottom:20rem;-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}to{margin-bottom:0;-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes beating{0%{-webkit-transform:scale(1);transform:scale(1)}10%{-webkit-transform:scale(1.01);transform:scale(1.01)}20%{-webkit-transform:scale(1);transform:scale(1)}80%{-webkit-transform:scale(1);transform:scale(1)}90%{-webkit-transform:scale(1.02);transform:scale(1.02)}to{-webkit-transform:scale(1);transform:scale(1)}}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{background:#181818;color:#d4d4d4;font-family:sans-serif;position:relative}h1{color:#181818;font-size:2.8rem;margin-bottom:1.2rem}h2{font-size:2.4rem}a{color:#a1ff86}a,label,p{font-size:1.2rem;margin-bottom:1.2rem}label,p{color:#2e2e2e}label{font-style:italic}input,textarea{border:1px solid #424242;border-radius:.5rem;display:block;margin:.5rem auto 1.2rem;padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{border-color:#ff5454}button{background-color:hsla(0,0%,91%,.667);border:1px solid #424242;border-radius:.5rem;cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s;transition:background-color .2s;width:100%}button:active,button:focus,button:hover{background-color:hsla(0,0%,85%,.667)}button.validate{background-color:rgba(161,255,134,.667)}button.cancel{background-color:hsla(0,100%,80%,.667)}main.beer-crakerz-map{height:100%;width:100%;z-index:10}main.beer-crakerz-map .new-poi{text-align:center}main.beer-crakerz-map .new-poi p{font-size:1.6rem;font-weight:700}main.beer-crakerz-map .new-poi button{margin:1.2rem 0}main.beer-crakerz-map .marker-tooltip{font-style:italic;text-align:center}nav{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;position:absolute;right:1rem;top:1rem;width:4.8rem;z-index:20}nav img{border-radius:50%;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;cursor:pointer;width:100%}nav .cmd-bar .cmd-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin:1rem 0;padding:.2rem}nav .cmd-bar .cmd-wrapper:first-child{margin-top:0}nav .cmd-bar .cmd-wrapper img{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-transition:all .2s;transition:all .2s}nav .cmd-bar .cmd-wrapper img:active,nav .cmd-bar .cmd-wrapper img:focus,nav .cmd-bar .cmd-wrapper img:hover{border:1px solid #b9b9b9;border-radius:.5rem;-webkit-filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);filter:invert(70%) sepia(67%) saturate(455%) hue-rotate(67deg) brightness(163%) contrast(85%);padding:.2rem}nav .cmd-bar .cmd-wrapper img[class$=-on]{-webkit-filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%);filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%)}nav .cmd-bar .cmd-wrapper.logo img{padding:.1rem}nav .cmd-bar .cmd-wrapper.logo img:active,nav .cmd-bar .cmd-wrapper.logo img:focus,nav .cmd-bar .cmd-wrapper.logo img:hover{-webkit-filter:inherit;filter:inherit}.overlay{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:hsla(0,0%,100%,.8);display:none;height:100%;justify-content:center;opacity:0;position:absolute;top:0;-webkit-transition:opacity .3s;transition:opacity .3s;width:100%;z-index:30}.overlay [class$=-modal]{background:hsla(0,0%,100%,.8);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;padding:3rem 4rem;position:relative;text-align:center}.overlay [class$=-modal] h1{margin-bottom:3rem}.overlay [class$=-modal] button{margin-top:3rem}.overlay [class$=-modal] .modal-close{color:#999;cursor:pointer;font-size:2.2rem;font-weight:700;line-height:1.4rem;position:absolute;right:1rem;top:1rem}.overlay [class$=-modal] .button-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center}.overlay [class$=-modal] .button-wrapper button{margin-left:1rem;margin-right:1rem}.overlay .edit-mark-modal,.overlay .new-mark-modal{width:calc(100% - 2rem)}.overlay .edit-mark-modal h1,.overlay .edit-mark-modal p,.overlay .new-mark-modal h1,.overlay .new-mark-modal p{text-align:center}.overlay .edit-mark-modal .rating,.overlay .new-mark-modal .rating{margin-bottom:1.2rem}.overlay .edit-mark-modal .rating img,.overlay .new-mark-modal .rating img{cursor:pointer;height:2.5rem;margin:0 .25rem;width:2.5rem}.overlay .edit-mark-modal .rating img.active,.overlay .new-mark-modal .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.overlay .edit-mark-modal .rating img.active.selected,.overlay .new-mark-modal .rating img.active.selected{-webkit-filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%);filter:invert(75%) sepia(9%) saturate(4002%) hue-rotate(67deg) brightness(81%) contrast(83%)}.overlay .hide-show-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:15rem}.overlay .hide-show-modal .item img{height:2rem;margin-right:2rem}.overlay .hide-show-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .hide-show-modal .item input{margin:0;width:auto}.overlay .user-profile-modal{height:calc(100% - 2rem);width:calc(100% - 2rem)}.overlay .user-profile-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:25rem}.overlay .user-profile-modal .item img{height:2rem;margin-right:2rem}.overlay .user-profile-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .user-profile-modal .item input{margin:0;width:auto}.debug-container{background-color:hsla(0,0%,100%,.8);border-radius:.5rem;color:#000;left:1rem;padding:1rem;position:absolute;top:1rem;z-index:20}.debug-container p{margin-bottom:.2rem}.popup h1,.popup h2,.popup p{margin:0;text-align:center}.popup h1{font-size:2rem;margin-bottom:1.2rem}.popup .rating{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;width:100%}.popup .rating img{height:1.2rem}.popup .rating img.active{-webkit-filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%);filter:invert(95%) sepia(39%) saturate(3136%) hue-rotate(323deg) brightness(96%) contrast(115%)}.popup .rating p{font-style:inherit;margin-left:.5rem}.popup p{font-style:italic}.popup h2{font-size:1.3rem;font-weight:inherit;margin-top:1.2rem}.popup footer{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin-top:1.2rem;position:relative}.popup footer img{cursor:pointer;height:2rem;margin-left:.5rem}.cluster-icon-wrapper{position:relative}.cluster-icon-wrapper .cluster-icon{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);height:50px;line-height:50px;margin-left:-21px;margin-top:-13px;-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s;width:auto}.cluster-icon-wrapper .cluster-icon:active,.cluster-icon-wrapper .cluster-icon:focus,.cluster-icon-wrapper .cluster-icon:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8);-webkit-transform:scale(1.066);transform:scale(1.066)}.cluster-icon-wrapper .cluster-label{background-color:#fff;border:1px solid #000;border-radius:.75rem;color:#000;font-size:1.1rem;font-weight:700;left:15px;padding:.1rem .4rem;top:-15px}.cluster-icon-wrapper .cluster-label,.notification-wrapper{-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;position:absolute}.notification-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background-color:hsla(0,0%,100%,.8);border-radius:.5rem;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:3rem;justify-content:center;left:calc(50% - 15rem);opacity:0;top:-4rem;-webkit-transition:top .3s,opacity .2s ease-out;transition:top .3s,opacity .2s ease-out;width:30rem;z-index:40}.notification-wrapper.opened{opacity:1;top:1rem}.notification-wrapper .notification-message{font-style:italic;margin:0}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .3s,opacity .2s ease-out;transition:right .3s,opacity .2s ease-out;width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:calc(var(--aside-width) + 1rem)}.zoom-slider p{cursor:pointer;font-size:1.6rem;font-weight:700;margin:.5rem 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider .slider-wrapper{border-radius:.5rem;-webkit-box-shadow:0 0 10px #424242;box-shadow:0 0 10px #424242;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:lime;bottom:0;position:absolute;-webkit-transition:height .2s;transition:height .2s;width:100%}.leaflet-control-layers.leaflet-control{-webkit-transition:all .2s;transition:all .2s}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)}@media (min-width:720px){.overlay [class$=-modal]{max-width:50%}} diff --git a/static/dist/BeerCrackerz.bundle.js b/static/dist/BeerCrackerz.bundle.js index 714ad30..e81308b 100644 --- a/static/dist/BeerCrackerz.bundle.js +++ b/static/dist/BeerCrackerz.bundle.js @@ -1,187 +1 @@ -/* - * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). - * This devtool is neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/BeerCrackerz.js": -/*!*****************************!*\ - !*** ./src/BeerCrackerz.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerz_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerz.scss */ \"./src/BeerCrackerz.scss\");\n/* harmony import */ var _js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/MapHelper.js */ \"./src/js/MapHelper.js\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, \"prototype\", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } else if (call !== void 0) { throw new TypeError(\"Derived constructors may only return object or undefined\"); } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n\n\n\n\n/**\n * @class\n * @constructor\n * @public\n * @extends MapHelper\n**/\n\nvar BeerCrackerz = /*#__PURE__*/function (_MapHelper) {\n _inherits(BeerCrackerz, _MapHelper);\n\n var _super = _createSuper(BeerCrackerz);\n\n /**\n * @summary The BeerCrackerz main component\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerz() {\n var _this;\n\n _classCallCheck(this, BeerCrackerz);\n\n _this = _super.call(this);\n /**\n * The core Leaflet.js map\n * @type {Object}\n * @private\n **/\n\n _this._map = null;\n /**\n * The zoom slider handler\n * @type {Object}\n * @private\n **/\n\n _this._zoomSlider = null;\n /**\n * The notification handler\n * @type {Object}\n * @private\n **/\n\n _this._notification = null;\n /**\n * The user object holds everything useful to ensure a proper session\n * @type {Object}\n * @private\n **/\n\n _this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0,\n // Accuracy in meter given by geolocation API\n marker: null,\n // The user marker on map\n circle: null,\n // The accuracy circle around the user marker\n range: null,\n // The range in which user can add a new marker\n color: _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].USER_COLOR,\n // The color to use for circle (match the user marker color)\n id: -1,\n username: ''\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n\n _this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n _this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The temporary marker for new marks only\n * @type {Object}\n * @private\n **/\n\n _this._newMarker = null;\n /**\n * The debug DOM object\n * @type {Object}\n * @private\n **/\n\n _this._debugElement = null;\n /**\n * ID for geolocation watch callback\n * @type {Number}\n * @private\n **/\n\n _this._watchId = null;\n /**\n * Flag to know if a zoom action is occuring on map\n * @type {Boolean}\n * @private\n **/\n\n _this._isZooming = false;\n /**\n * The communication manager to process all server call\n * @type {Object}\n * @private\n **/\n\n _this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"]();\n /**\n * The LangManager must be instantiated to handle nls accross the app\n * @type {Object}\n * @private\n **/\n // The BeerCrackerz app is only initialized once nls are set up\n\n _this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](window.navigator.language.substring(0, 2), _this._init.bind(_assertThisInitialized(_this)));\n return _this;\n } // ======================================================================== //\n // ----------------- Application initialization sequence ------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method is designed to properly configure the user session, according\n * to its saved preferences and its position. It first build the debug interface,\n * then loads the user preferences, then create the map and finally, events are listened.\n *
    \n **/\n\n\n _createClass(BeerCrackerz, [{\n key: \"_init\",\n value: function _init() {\n this._debugElement = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].initDebugInterface();\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]();\n\n this._initUser().then(this._initPreferences.bind(this)).then(this._initGeolocation.bind(this)).then(this._initMap.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n }\n /**\n * @method\n * @name _initUser\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _init() method initialize the user object according to its information\n * and statistic so the UI can be properly built.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initUser\",\n value: function _initUser() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n // TODO fill user information from server @Raph\n _this2._user.id = 1;\n _this2._user.username = 'messmaker';\n resolve();\n });\n }\n /**\n * @method\n * @name _initPreferences\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initPreferences() will initialize user preference if they are not set yet,\n * it will also update the UI according to user preferences ; debug DOM visible,\n * update the command classList for selected ones.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initPreferences\",\n value: function _initPreferences() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-spot') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-spot', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-shop') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-shop', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-bar') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-bar', true);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-plan-layer') === null) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-plan-layer', true);\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('app-debug') === 'true') {\n window.DEBUG = true; // Ensure to set global flag if preference comes from local storage\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('app-debug', true); // Ensure to set local storage preference if debug flag was added to the url\n\n _this3.addDebugUI();\n } // Update icon class if center on preference is set to true\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true') {\n document.getElementById('center-on').classList.add('lock-center-on');\n }\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].OPTIMIZED_ACCURACY;\n _this4._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this4._user.lat = position.coords.latitude;\n _this4._user.lng = position.coords.longitude;\n _this4._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this4._map) {\n _this4.drawUserMarker();\n\n _this4.updateMarkerCirclesVisibility(); // Update map position if focus lock is active\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true' && !_this4._isZooming) {\n _this4._map.setView(_this4._user);\n } // Updating debug info\n\n\n _this4.updateDebugUI();\n }\n\n resolve();\n }, resolve, options);\n } else {\n _this4._notification.raise(_this4.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([_this5._user.lat, _this5._user.lng], 18); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this5.nls.map('planLayerOSM'), \"

    \")] = osm; //baseMaps[`

    ${this.nls.map('planLayerGeo')}

    `] = plan;\n\n baseMaps[\"

    \".concat(_this5.nls.map('satLayerEsri'), \"

    \")] = esri; //baseMaps[`

    ${this.nls.map('satLayerGeo')}

    `] = geo;\n // Append layer depending on user preference\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-plan-layer')) {\n switch (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-plan-layer')) {\n case _this5.nls.map('planLayerOSM'):\n osm.addTo(_this5._map);\n break;\n\n /*case this.nls.map('planLayerGeo'):\n plan.addTo(this._map);\n break;*/\n\n case _this5.nls.map('satLayerEsri'):\n esri.addTo(_this5._map);\n break;\n\n /*case this.nls.map('satLayerGeo'):\n geo.addTo(this._map);\n break;*/\n\n default:\n osm.addTo(_this5._map);\n break;\n }\n } else {\n // No saved pref, fallback on OSM base map\n osm.addTo(_this5._map);\n } // Add layer switch radio on bottom right of the map\n\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n // Command events\n document.getElementById('user-profile').addEventListener('click', _this6.userProfileModal.bind(_this6));\n document.getElementById('hide-show').addEventListener('click', _this6.hidShowModal.bind(_this6));\n document.getElementById('center-on').addEventListener('click', _this6.toggleFocusLock.bind(_this6));\n document.getElementById('overlay').addEventListener('click', _this6.closeModal.bind(_this6)); // Subscribe to click event on map to react\n\n _this6._map.on('click', _this6.mapClicked.bind(_this6)); // Map is dragged by user mouse/finger\n\n\n _this6._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this6._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].MAP_BOUNDS, {\n animate: true\n }); // Disable lock focus if user drags the map\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this6.toggleFocusLock();\n }\n }); // Map events\n\n\n _this6._map.on('zoomstart', function () {\n _this6._isZooming = true;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _this6.setMarkerCircles(_this6._marks.spot, false);\n\n _this6.setMarkerCircles(_this6._marks.shop, false);\n\n _this6.setMarkerCircles(_this6._marks.bar, false);\n\n _this6.setMarkerCircles([_this6._user], false);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], false);\n }\n });\n\n _this6._map.on('zoomend', function () {\n _this6._isZooming = false;\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n if (_this6._map.getZoom() >= 15) {\n _this6.setMarkerCircles(_this6._marks.spot, true);\n\n _this6.setMarkerCircles(_this6._marks.shop, true);\n\n _this6.setMarkerCircles(_this6._marks.bar, true);\n\n _this6.setMarkerCircles([_this6._user], true);\n\n _this6.setMarkerCircles([{\n circle: _this6._user.range\n }], true);\n }\n } // Auto hide labels if zoom level is too high (and restore it when needed)\n\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-marker-label') === 'true') {\n if (_this6._map.getZoom() < 15) {\n _this6.setMarkerLabels(_this6._marks.spot, false);\n\n _this6.setMarkerLabels(_this6._marks.shop, false);\n\n _this6.setMarkerLabels(_this6._marks.bar, false);\n } else {\n _this6.setMarkerLabels(_this6._marks.spot, true);\n\n _this6.setMarkerLabels(_this6._marks.shop, true);\n\n _this6.setMarkerLabels(_this6._marks.bar, true);\n }\n } // Updating debug info\n\n\n _this6.updateDebugUI();\n });\n\n _this6._map.on('baselayerchange', function (event) {\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-plan-layer', _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].stripDom(event.name));\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this7._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.shop = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this7._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n })); // Append clusters to the map depending on user preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-spot\") === 'true') {\n _this7._map.addLayer(_this7._clusters.spot);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-shop\") === 'true') {\n _this7._map.addLayer(_this7._clusters.shop);\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-bar\") === 'true') {\n _this7._map.addLayer(_this7._clusters.bar);\n } // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this7.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this7.placeMarker(mark);\n\n _this7._marks[mark.type].push(mark);\n\n _this7._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 42;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n // TODO @raph\n shops[i].type = 'shop';\n shops[i].user = 'messmaker';\n shops[i].userId = 42;\n iterateMarkers(shops[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 42;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n } // ======================================================================== //\n // ------------------------- Toggle for map items ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name toggleFocusLock\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleFocusLock() method will, depending on user preference, lock or unlock\n * the map centering around the user marker at each position refresh. This way the user\n * can roam while the map is following its position.\n *
    \n **/\n\n }, {\n key: \"toggleFocusLock\",\n value: function toggleFocusLock() {\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-center-on-user') === 'true') {\n this._notification.raise(this.nls.notif(\"unlockFocusOn\"));\n\n document.getElementById('center-on').classList.remove('lock-center-on');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-center-on-user', 'false');\n } else {\n this._notification.raise(this.nls.notif(\"lockFocusOn\"));\n\n document.getElementById('center-on').classList.add('lock-center-on');\n\n this._map.flyTo([this._user.lat, this._user.lng], 18);\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-center-on-user', 'true');\n }\n }\n /**\n * @method\n * @name toggleLabel\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleLabel() method will, depending on user preference, display or not\n * the labels attached to spots/shops/bars marks. This label is basically the\n * mark name given by its creator.\n *
    \n **/\n\n }, {\n key: \"toggleLabel\",\n value: function toggleLabel() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-marker-label') === 'true');\n this.setMarkerLabels(this._marks.spot, visible);\n this.setMarkerLabels(this._marks.shop, visible);\n this.setMarkerLabels(this._marks.bar, visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-marker-label', visible);\n }\n /**\n * @method\n * @name toggleCircle\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleCircle() method will, depending on user preference, display or not\n * the circles around the spots/shops/bars marks. This circle indicates the minimal\n * distance which allow the user to make updates on the mark information\n *
    \n **/\n\n }, {\n key: \"toggleCircle\",\n value: function toggleCircle() {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true');\n this.setMarkerCircles(this._marks.spot, visible);\n this.setMarkerCircles(this._marks.shop, visible);\n this.setMarkerCircles(this._marks.bar, visible);\n this.setMarkerCircles([this._user], visible);\n this.setMarkerCircles([{\n circle: this._user.range\n }], visible);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('poi-show-circle', visible);\n }\n /**\n * @method\n * @name toggleMarkers\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleMarkers() method will, depending on user preference, display or not\n * a given mark type. This way, the user can fine tune what is displayed on the map.\n * A mark type in spots/shops/bars must be given as an argument\n *
    \n * @param {String} type The mark type in spots/tores/bars\n **/\n\n }, {\n key: \"toggleMarkers\",\n value: function toggleMarkers(type) {\n var visible = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference(\"poi-show-\".concat(type)) === 'true');\n\n if (visible === true) {\n this._map.addLayer(this._clusters[type]);\n } else {\n this._map.removeLayer(this._clusters[type]);\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference(\"poi-show-\".concat(type), visible);\n }\n /**\n * @method\n * @name toggleHighAccuracy\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleHighAccuracy() method will, depending on user preference, update the\n * geolocation accuracy between optimized and high. The high settings might cause\n * more memory and processing consumption, but gives better results. It will clear\n * any previous position watch on the geolocation API so it can subscribe a new one\n * with the new accuracy parameters (see Utils for values)\n *
    \n **/\n\n }, {\n key: \"toggleHighAccuracy\",\n value: function toggleHighAccuracy() {\n var high = !(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('map-high-accuracy', high);\n navigator.geolocation.clearWatch(this._watchId);\n\n this._initGeolocation().then(this.updateDebugUI.bind(this));\n }\n /**\n * @method\n * @name toggleDebug\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The toggleDebug() method will, depending on user preference, add or remove\n * the debug DOM element to the user interface. The debug DOM display several\n * useful information to identify an issue with the geolocation API\n *
    \n **/\n\n }, {\n key: \"toggleDebug\",\n value: function toggleDebug() {\n var visible = !window.DEBUG;\n window.DEBUG = visible;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference('app-debug', visible);\n\n if (visible) {\n this.addDebugUI();\n } else {\n this.removeDebugUI();\n }\n } // ======================================================================== //\n // ----------------- App modals display and interaction ------------------- //\n // ======================================================================== //\n\n }, {\n key: \"newMarkModal\",\n value: function newMarkModal(dom) {\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n }\n }, {\n key: \"editMarkModal\",\n value: function editMarkModal(options) {\n var _this8 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate(\"/static/html/modal/edit\".concat(options.type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(options.type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(options.type, \"-desc\"));\n var submit = dom.querySelector(\"#\".concat(options.type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(options.type, \"-cancel\"));\n var rate = dom.querySelector(\"#\".concat(options.type, \"-rating\"));\n var rating = new _js_ui_Rating_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"](rate, options.rate); // Update nls for template\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this8.nls.modal(\"\".concat(options.type, \"EditTitle\")));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-name\")), \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _this8.nls[options.type]('nameLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-desc\")), \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), _this8.nls[options.type]('descLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(options.type, \"-rate\")), \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), _this8.nls[options.type]('rateLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(submit, \"{\".concat(options.type.toUpperCase(), \"_SUBMIT}\"), _this8.nls.nav('add'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(cancel, \"{\".concat(options.type.toUpperCase(), \"_CANCEL}\"), _this8.nls.nav('cancel'));\n name.value = options.name;\n description.value = options.description;\n submit.addEventListener('click', function () {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n for (var i = 0; i < _this8._marks[options.type].length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === _this8._marks[options.type][i].lat && options.lng === _this8._marks[options.type][i].lng) {\n _this8._marks[options.type][i].name = name.value;\n _this8._marks[options.type][i].description = description.value;\n _this8._marks[options.type][i].rate = rating.currentRate;\n options.tooltip.removeFrom(_this8.map);\n\n _this8.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker.setPopupContent(options.dom);\n });\n\n break;\n }\n } // Format marks to be saved and then update user preference with\n\n\n var formattedMarks = [];\n\n for (var _i = 0; _i < _this8._marks[options.type].length; ++_i) {\n formattedMarks.push(_this8.formatSavedMarker(_this8._marks[options.type][_i]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this8._notification.raise(_this8.nls.notif(\"\".concat(options.type, \"Deleted\")));\n\n _this8.closeModal(null, true);\n });\n cancel.addEventListener('click', _this8.closeModal.bind(_this8, null, true));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex';\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name deleteMarkModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * The deleteMarkModal() method will request the mark delete modal, which prompts\n * the user a confirmation to actually delete the mark\n *
    \n * @param {Function} cb The function to callback with true or false depending on user's choice\n **/\n\n }, {\n key: \"deleteMarkModal\",\n value: function deleteMarkModal(cb) {\n var _this9 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate('/static/html/modal/deletemark.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this9.nls.modal('deleteMarkTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-desc\"), \"{MODAL_DESC}\", _this9.nls.modal('deleteMarkDesc'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#cancel-close\"), \"{MODAL_CANCEL}\", _this9.nls.nav('cancel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#delete-close\"), \"{MODAL_DELETE}\", _this9.nls.nav('delete'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Setup callback for confirm/cancel buttons\n\n document.getElementById('cancel-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(false);\n }, false);\n document.getElementById('delete-close').addEventListener('click', function (e) {\n _this9.closeModal(e);\n\n cb(true);\n }, false);\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name userProfileModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The userProfileModal() method will request the user modal, which contains\n * the user preferences, and the user profile information\n *
    \n **/\n\n }, {\n key: \"userProfileModal\",\n value: function userProfileModal() {\n var _this10 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate('/static/html/modal/user.html').then(function (dom) {\n // Update nls for template\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-modal-title\"), \"{MODAL_TITLE}\", _this10.nls.modal('userTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-accuracy\"), \"{ACCURACY_USER_MODAL}\", _this10.nls.modal('userAccuracyPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-user-modal-debug\"), \"{DEBUG_USER_MODAL}\", _this10.nls.modal('userDebugPref'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-about-desc\"), \"{BEERCRACKERZ_DESC}\", _this10.nls.modal('aboutDesc'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true') {\n document.getElementById('high-accuracy-toggle').checked = true;\n }\n\n if (window.DEBUG === true || _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('app-debug') === 'true') {\n document.getElementById('debug-toggle').checked = true;\n }\n\n document.getElementById('high-accuracy-toggle').addEventListener('change', _this10.toggleHighAccuracy.bind(_this10));\n document.getElementById('debug-toggle').addEventListener('change', _this10.toggleDebug.bind(_this10));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name hidShowModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The hidShowModal() method will request the hide show modal, which all\n * toggles for map elements ; labels/circles/spots/shops/bars\n *
    \n **/\n\n }, {\n key: \"hidShowModal\",\n value: function hidShowModal() {\n var _this11 = this;\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].fetchTemplate('/static/html/modal/hideshow.html').then(function (dom) {\n // Update template nls\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-title\"), \"{MODAL_TITLE}\", _this11.nls.modal('hideShowTitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-labels\"), \"{LABELS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowLabels'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-circles\"), \"{CIRCLES_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowCircles'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-spots\"), \"{SPOTS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowSpots'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-shops\"), \"{SHOPS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowShops'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#nls-hideshow-modal-bars\"), \"{BARS_HIDESHOW_MODAL}\", _this11.nls.modal('hideShowBars'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].replaceString(dom.querySelector(\"#modal-close-button\"), \"{MODAL_CLOSE}\", _this11.nls.nav('close'));\n document.getElementById('overlay').appendChild(dom);\n document.getElementById('overlay').style.display = 'flex'; // Init modal checkbox state according to local storage preferences\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-marker-label') === 'true') {\n document.getElementById('label-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n document.getElementById('circle-toggle').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-spot') === 'true') {\n document.getElementById('show-spots').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-shop') === 'true') {\n document.getElementById('show-shops').checked = true;\n }\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-bar') === 'true') {\n document.getElementById('show-bars').checked = true;\n }\n\n document.getElementById('label-toggle').addEventListener('change', _this11.toggleLabel.bind(_this11));\n document.getElementById('circle-toggle').addEventListener('change', _this11.toggleCircle.bind(_this11));\n document.getElementById('show-spots').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'spot'));\n document.getElementById('show-shops').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'shop'));\n document.getElementById('show-bars').addEventListener('change', _this11.toggleMarkers.bind(_this11, 'bar'));\n setTimeout(function () {\n return document.getElementById('overlay').style.opacity = 1;\n }, 50);\n });\n }\n /**\n * @method\n * @name closeModal\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The closeModal() method will close any opened modal if the click event is\n * targeted on the modal overlay or on close buttons\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"closeModal\",\n value: function closeModal(event, force) {\n if (force === true || event.target.id === 'overlay' || event.target.id.indexOf('close') !== -1) {\n document.getElementById('overlay').style.opacity = 0;\n setTimeout(function () {\n document.getElementById('overlay').style.display = 'none';\n document.getElementById('overlay').innerHTML = '';\n }, 300);\n }\n } // ======================================================================== //\n // -------------------------- Map interaction ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n * @param {Event} event The click event\n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked(event) {\n if (this._newMarker && this._newMarker.popupClosed) {\n // Avoid to open new marker right after popup closing\n this._newMarker = null;\n } else if (this._newMarker === null || !this._newMarker.isBeingDefined) {\n // Only create new marker if none is in progress, and that click is max range to add a marker\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getDistanceBetweenCoords([this._user.lat, this._user.lng], [event.latlng.lat, event.latlng.lng]);\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].NEW_MARKER_RANGE) {\n this._newMarker = this.definePOI(event.latlng, this._markerSaved.bind(this));\n } else {\n this._notification.raise(this.nls.notif('newMarkerOutside'));\n }\n }\n }\n /**\n * @method\n * @name _markerSaved\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _markerSaved() method is the callback used when a marker is created and added\n * to the map. It is the last method of a new marker proccess.\n *
    \n * @param {Object} options The new marker options\n **/\n\n }, {\n key: \"_markerSaved\",\n value: function _markerSaved(options) {\n // Save marke in marks and clusters for the map\n this._marks[options.type].push(options);\n\n this._clusters[options.type].addLayer(options.marker); // Notify user that new marker has been saved\n\n\n this._notification.raise(this.nls.notif(\"\".concat(options.type, \"Added\"))); // Update marker circles visibility according to user position\n\n\n this.updateMarkerCirclesVisibility(); // Clear new marker to let user add other stuff\n\n this._newMarker = null; // Save new marker in local storage, later to be sent to the server\n\n this._kom[\"\".concat(options.type, \"Created\")](this.formatSavedMarker(options));\n }\n /**\n * @method\n * @name updateMarkerCirclesVisibility\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateMarkerCirclesVisibility() method will update the circle visibility for\n * all mark types (spots/shops/bars) and for the user marker\n *
    \n **/\n\n }, {\n key: \"updateMarkerCirclesVisibility\",\n value: function updateMarkerCirclesVisibility() {\n var _this12 = this;\n\n var _updateByType = function _updateByType(data) {\n // Check spots in user's proximity\n for (var i = 0; i < data.length; ++i) {\n // Only update circles that are in user view\n if (_this12._map.getBounds().contains(data[i].marker.getLatLng())) {\n var marker = data[i].marker;\n var distance = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getDistanceBetweenCoords([_this12._user.lat, _this12._user.lng], [marker.getLatLng().lat, marker.getLatLng().lng]); // Only show if user distance to marker is under circle radius\n\n if (distance < _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].CIRCLE_RADIUS && !data[i].circle.visible) {\n data[i].circle.visible = true;\n data[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } else if (distance >= _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].CIRCLE_RADIUS && data[i].circle.visible) {\n data[i].circle.visible = false;\n data[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n }\n }\n }\n };\n\n if (_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('poi-show-circle') === 'true') {\n _updateByType(this._marks.spot);\n\n _updateByType(this._marks.shop);\n\n _updateByType(this._marks.bar);\n\n _updateByType([this._user]);\n }\n } // ======================================================================== //\n // -------------------------- Marker edition ------------------------------ //\n // ======================================================================== //\n\n /**\n * @method\n * @name formatSavedMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method formats a mark returned from MapHelper so it can be parsed\n * using JSON.parse (in order to store it in local storage/database)\n *
    \n * @param {Object} mark The mark options from internal this._marks[type]\n **/\n\n }, {\n key: \"formatSavedMarker\",\n value: function formatSavedMarker(mark) {\n return {\n userId: mark.userId || this.user.id,\n name: mark.name,\n description: mark.description,\n lat: mark.lat,\n lng: mark.lng,\n rate: mark.rate\n };\n }\n /**\n * @method\n * @name editMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will open a mark edition modal\n *
    \n * @param {Object} options The mark options to edit\n **/\n\n }, {\n key: \"editMarker\",\n value: function editMarker(options) {\n this._map.closePopup();\n\n this.editMarkModal(options);\n }\n /**\n * @method\n * @name deleteMarker\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since February 2022\n * @description\n *
    \n * This method will delete a mark after prompting the user if he trully wants to\n *
    \n * @param {Object} options The mark options to delete\n **/\n\n }, {\n key: \"deleteMarker\",\n value: function deleteMarker(options) {\n var _this13 = this;\n\n this.deleteMarkModal(function (confirm) {\n if (confirm === true) {\n // Iterate through marks to find matching one (by coord as marks coordinates are unique)\n var marks = _this13._marks[options.type];\n\n for (var i = 0; i < marks.length; ++i) {\n // We found, remove circle, label and marker from map/clusters\n if (options.lat === marks[i].lat && options.lng === marks[i].lng) {\n _this13.setMarkerCircles([marks[i]], false);\n\n _this13.setMarkerLabels([marks[i]], false);\n\n _this13._clusters[options.type].removeLayer(marks[i].marker);\n\n marks.splice(i, 1);\n break;\n }\n } // Update internal marks array\n\n\n _this13._marks[options.type] = marks; // Format marks to be saved and then update user preference with\n\n var formattedMarks = [];\n\n for (var _i2 = 0; _i2 < _this13._marks[options.type].length; ++_i2) {\n formattedMarks.push(_this13.formatSavedMarker(_this13._marks[options.type][_i2]));\n }\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].setPreference(\"saved-\".concat(options.type), JSON.stringify(formattedMarks)); // Notify user through UI that marker has been successfully deleted\n\n _this13._notification.raise(_this13.nls.notif(\"\".concat(options.type, \"Deleted\")));\n }\n });\n } // ======================================================================== //\n // ---------------------------- Debug methods ----------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name addDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The addDebugUI() method appends the debug DOM element to the document body\n *
    \n **/\n\n }, {\n key: \"addDebugUI\",\n value: function addDebugUI() {\n document.body.appendChild(this._debugElement);\n }\n /**\n * @method\n * @name removeDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The removeDebugUI() method remove the debug DOM element from the document body\n *
    \n **/\n\n }, {\n key: \"removeDebugUI\",\n value: function removeDebugUI() {\n document.body.removeChild(this._debugElement);\n }\n /**\n * @method\n * @name updateDebugUI\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The updateDebugUI() method will update informations held in the debug DOM\n *
    \n **/\n\n }, {\n key: \"updateDebugUI\",\n value: function updateDebugUI() {\n var options = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('map-high-accuracy') === 'true' ? _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].HIGH_ACCURACY : _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].OPTIMIZED_ACCURACY;\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].updateDebugInterface(this._debugElement, this._user, options);\n }\n /**\n * @method\n * @name downloadData\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since August 2022\n * @description\n *
    \n * The downloadData() method will save to user disk the saved spots as a JSON file\n *
    \n **/\n\n }, {\n key: \"downloadData\",\n value: function downloadData() {\n var dataString = \"data:text/json;charset=utf-8,\".concat(encodeURIComponent(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getPreference('saved-spot')));\n var link = document.createElement('A');\n link.setAttribute('href', dataString);\n link.setAttribute('download', 'BeerCrackerzData.json');\n link.click();\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n }, {\n key: \"kom\",\n get: function get() {\n return this._kom;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerz;\n}(_js_MapHelper_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerz);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.js?"); - -/***/ }), - -/***/ "./src/js/MapHelper.js": -/*!*****************************!*\ - !*** ./src/js/MapHelper.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ui/Rating.js */ \"./src/js/ui/Rating.js\");\n/* harmony import */ var _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\nvar MapHelper = /*#__PURE__*/function () {\n function MapHelper() {\n /* Mixin to be extended from the BeerCrackerz main class */\n\n _classCallCheck(this, MapHelper);\n } // ======================================================================== //\n // --------------------------- Marker helpers ----------------------------- //\n // ======================================================================== //\n\n\n _createClass(MapHelper, [{\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this = this;\n\n var icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].black;\n\n if (options.type === 'shop') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Disable center on lock if previously set to true\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('map-center-on-user') === 'true') {\n _this.toggleFocusLock();\n } // Actual fly to the marker\n\n\n _this.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/shop/bar should be appended to the map\n\n\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user); // Append circle around marker for accuracy and range for new marker\n\n this.user.radius = this.user.accuracy;\n this.user.circle = this.drawCircle(this.user);\n this.user.range = this.drawCircle({\n lat: this.user.lat,\n lng: this.user.lng,\n radius: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].NEW_MARKER_RANGE,\n color: _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].RANGE_COLOR\n }); // Update circle opacity if pref is at true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-show-circle') === 'true') {\n this.user.circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n this.user.range.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n } // Callback on marker clicked to add marker on user position\n\n\n this.user.marker.on('click', this.mapClicked.bind(this));\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n this.user.range.setLatLng(this.user);\n this.user.circle.setLatLng(this.user);\n this.user.circle.setRadius(this.user.accuracy);\n }\n }\n }, {\n key: \"definePOI\",\n value: function definePOI(options, callback) {\n var _this2 = this;\n\n var dom = {\n wrapper: document.createElement('DIV'),\n title: document.createElement('P'),\n spot: document.createElement('BUTTON'),\n shop: document.createElement('BUTTON'),\n bar: document.createElement('BUTTON')\n }; // Update class and inner HTMl content according to user's nls\n\n dom.wrapper.className = 'new-poi';\n dom.title.innerHTML = this.nls.map('newTitle');\n dom.spot.innerHTML = this.nls.map('newSpot');\n dom.shop.innerHTML = this.nls.map('newShop');\n dom.bar.innerHTML = this.nls.map('newBar'); // Atach data type to each button (to be used in clicked callback)\n\n dom.spot.dataset.type = 'spot';\n dom.shop.dataset.type = 'shop';\n dom.bar.dataset.type = 'bar'; // DOM chaining\n\n dom.wrapper.appendChild(dom.title);\n dom.wrapper.appendChild(dom.spot);\n dom.wrapper.appendChild(dom.shop);\n dom.wrapper.appendChild(dom.bar); // Update popup content with DOM elements\n\n options.dom = dom.wrapper; // Create temporary mark with wrapper content and open it to offer user the creation menu\n\n var marker = this.placeMarker(options).openPopup();\n options.marker = marker; // Attach marker to option so it can be manipulated in clicked callbacks\n\n options.addedCallback = callback; // Attach callback to be called when marker addition is done\n // Callback on button clicked (to open modal and define a new mark)\n\n var _prepareNewMark = function _prepareNewMark(e) {\n marker.isBeingDefined = true;\n marker.closePopup();\n\n _this2.defineMarkFactory(e.target.dataset.type, options);\n }; // Buttons click events\n\n\n dom.spot.addEventListener('click', _prepareNewMark);\n dom.shop.addEventListener('click', _prepareNewMark);\n dom.bar.addEventListener('click', _prepareNewMark); // Listen to clicks outside of popup to close new mark\n\n marker.on('popupclose', function () {\n if (!marker.isBeingDefined) {\n marker.popupClosed = true;\n marker.removeFrom(_this2.map);\n }\n });\n return marker;\n } // ======================================================================== //\n // ---------------------- New mark in modal helper ------------------------ //\n // ======================================================================== //\n\n }, {\n key: \"defineMarkFactory\",\n value: function defineMarkFactory(type, options) {\n var _this3 = this;\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/modal/new\".concat(type, \".html\")).then(function (dom) {\n var name = dom.querySelector(\"#\".concat(type, \"-name\"));\n var description = dom.querySelector(\"#\".concat(type, \"-desc\"));\n var rating = new _ui_Rating_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"](dom.querySelector(\"#\".concat(type, \"-rating\")));\n var submit = dom.querySelector(\"#\".concat(type, \"-submit\"));\n var cancel = dom.querySelector(\"#\".concat(type, \"-cancel\"));\n var close = dom.querySelector('#modal-close'); // Update nls for template\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-title\")), \"{\".concat(type.toUpperCase(), \"_TITLE}\"), _this3.nls[type]('title'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-subtitle\")), \"{\".concat(type.toUpperCase(), \"_SUBTITLE}\"), _this3.nls[type]('subtitle'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-name\")), \"{\".concat(type.toUpperCase(), \"_NAME}\"), _this3.nls[type]('nameLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-desc\")), \"{\".concat(type.toUpperCase(), \"_DESC}\"), _this3.nls[type]('descLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(dom.querySelector(\"#nls-\".concat(type, \"-rate\")), \"{\".concat(type.toUpperCase(), \"_RATE}\"), _this3.nls[type]('rateLabel'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(submit, \"{\".concat(type.toUpperCase(), \"_SUBMIT}\"), _this3.nls.nav('add'));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(cancel, \"{\".concat(type.toUpperCase(), \"_CANCEL}\"), _this3.nls.nav('cancel')); // Method to clear modal and hide it, and remove temporary marker on the map\n\n var _cleanDefineUI = function _cleanDefineUI() {\n options.marker.isBeingDefined = false;\n options.marker.removeFrom(_this3.map); // Clear temporary black marker\n\n _this3.closeModal(null, true);\n }; // Submit or cancel event subscriptions\n\n\n submit.addEventListener('click', function () {\n if (name.value === '') {\n _this3._notification.raise(_this3.nls.notif('markNameEmpty'));\n } else {\n _cleanDefineUI();\n\n options.type = type;\n options.name = name.value, options.description = description.value;\n options.rate = rating.currentRate;\n\n _this3.markPopupFactory(options).then(function (dom) {\n options.dom = dom;\n options.marker = _this3.placeMarker(options); // Create final marker\n\n options.addedCallback(options);\n });\n }\n });\n cancel.addEventListener('click', _cleanDefineUI);\n close.addEventListener('click', _cleanDefineUI);\n\n _this3.newMarkModal(dom);\n });\n }\n }, {\n key: \"defineNewSpot\",\n value: function defineNewSpot(options) {\n this.defineMarkFactory('spot', options);\n }\n }, {\n key: \"defineNewShop\",\n value: function defineNewShop(options) {\n this.defineMarkFactory('shop', options);\n }\n }, {\n key: \"defineNewBar\",\n value: function defineNewBar(options) {\n this.defineMarkFactory('bar', options);\n } // ======================================================================== //\n // ------------------------- Mark popup helper ---------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this4 = this;\n\n return new Promise(function (resolve) {\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fetchTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this4.user.username;\n\n var desc = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.description) || _this4.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].stripDom(options.name));\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this4.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove picture icon if user is not in range\n\n\n var distance = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getDistanceBetweenCoords([_this4.user.lat, _this4.user.lng], [options.lat, options.lng]);\n\n if (distance > _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS) {\n console.log('Too far'); //element.removeChild(element.querySelector(''));\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n if (user !== _this4.user.username) {\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n } else {\n element.querySelector('#edit-mark').addEventListener('click', _this4.editMarker.bind(_this4, options), false);\n element.querySelector('#delete-mark').addEventListener('click', _this4.deleteMarker.bind(_this4, options), false);\n } // Append circle around marker\n\n\n options.color = _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")];\n options.circle = _this4.drawCircle(options); // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options.circle.getLatLng()); // Only make it visible if preference is to true\n\n if (_utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getPreference('poi-marker-label') === 'true') {\n options.tooltip.addTo(_this4.map);\n } // Send back the popup\n\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"drawCircle\",\n value: function drawCircle(options) {\n return window.L.circle(options, {\n color: options.color,\n fillColor: options.color,\n opacity: 0,\n // This needs to be updated according to user proximity\n fillOpacity: 0,\n // Same for this parameter\n radius: options.radius ? options.radius : _utils_Utils_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CIRCLE_RADIUS\n }).addTo(this.map);\n }\n }, {\n key: \"setMarkerCircles\",\n value: function setMarkerCircles(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n // Here we update both opacity and add/remove circle from map\n if (visible) {\n marks[i].circle.setStyle({\n opacity: 1,\n fillOpacity: 0.1\n });\n marks[i].circle.addTo(this.map);\n } else {\n marks[i].circle.setStyle({\n opacity: 0,\n fillOpacity: 0\n });\n marks[i].circle.removeFrom(this.map);\n }\n }\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n }]);\n\n return MapHelper;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MapHelper);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/MapHelper.js?"); - -/***/ }), - -/***/ "./src/js/ui/Notification.js": -/*!***********************************!*\ - !*** ./src/js/ui/Notification.js ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); - -/***/ }), - -/***/ "./src/js/ui/Rating.js": -/*!*****************************!*\ - !*** ./src/js/ui/Rating.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Rating = /*#__PURE__*/function () {\n function Rating(domList, rate) {\n _classCallCheck(this, Rating);\n\n this._container = null;\n this._items = [];\n this._currentRate = rate || 0; // Mostly for hover operations\n\n this._clicked = rate || -1; // To know when user clicked on a given star\n\n this._init(domList);\n\n this._events();\n }\n\n _createClass(Rating, [{\n key: \"_init\",\n value: function _init(domList) {\n this._container = domList;\n\n for (var i = 0; i < domList.children.length; ++i) {\n this._items.push(domList.children[i]);\n } // Init Rating with given rate\n\n\n for (var _i = 0; _i < this._currentRate + 1; ++_i) {\n this._items[_i].classList.add('active');\n\n this._items[_i].classList.add('selected');\n }\n }\n }, {\n key: \"_events\",\n value: function _events() {\n this._container.addEventListener('mouseover', this._containerHovered.bind(this), false);\n\n this._container.addEventListener('mouseout', this._pointerExit.bind(this), false);\n\n for (var i = 0; i < this._items.length; ++i) {\n this._items[i].addEventListener('click', this._starClicked.bind(this), false);\n }\n }\n }, {\n key: \"_containerHovered\",\n value: function _containerHovered(event) {\n if (event.target.tagName === 'IMG') {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }\n }, {\n key: \"_pointerExit\",\n value: function _pointerExit() {\n this._currentRate = this._clicked === -1 ? 0 : this._clicked;\n this._container.dataset.rate = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"_starClicked\",\n value: function _starClicked(event) {\n this._currentRate = parseInt(event.target.dataset.id);\n this._container.dataset.rate = this._currentRate;\n this._clicked = this._currentRate;\n this.updateStars();\n }\n }, {\n key: \"updateStars\",\n value: function updateStars() {\n for (var i = 0; i < this._items.length; ++i) {\n if (i <= this._currentRate) {\n this._items[i].classList.add('active');\n\n if (i <= this._clicked) {\n this._items[i].classList.add('selected');\n }\n } else {\n this._items[i].classList.remove('active');\n\n this._items[i].classList.remove('selected');\n }\n }\n }\n }, {\n key: \"currentRate\",\n get: function get() {\n return this._currentRate;\n }\n }]);\n\n return Rating;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Rating);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Rating.js?"); - -/***/ }), - -/***/ "./src/js/ui/ZoomSlider.js": -/*!*********************************!*\ - !*** ./src/js/ui/ZoomSlider.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); - -/***/ }), - -/***/ "./src/js/utils/Kom.js": -/*!*****************************!*\ - !*** ./src/js/utils/Kom.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Kom = /*#__PURE__*/function () {\n /** @summary

    Server communication abstraction

    \n * @author Arthur Beaulieu\n * @since June 2020\n * @description
    This class is the main object to deal with when requesting something from the server.
    \n * It handle all urls calls (GET, POST), treat responses or handle errors using\n * Promise.
    Because it uses Promise, success and errors are to be handled in the caller\n * function, using .then() and .catch(). To properly deal with POST request,\n * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */\n function Kom() {\n _classCallCheck(this, Kom);\n\n /** @private\n * @member {string} - User session CSRF token to use in POST request */\n this._csrfToken = this._getCsrfCookie();\n /** @private\n * @member {array[]} - Array of HTTP headers to be used in HTTP calls */\n\n this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created\n\n this._checkValidity();\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getCsrfCookie\n * @private\n * @memberof Kom\n * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty\n * string by default. This method is required to be called on construction.
    \n * @return {string} - The CSRF token string */\n\n\n _createClass(Kom, [{\n key: \"_getCsrfCookie\",\n value: function _getCsrfCookie() {\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n\n for (var i = 0; i < cookies.length; ++i) {\n // Parse current cookie to extract its properties\n var cookie = cookies[i].split('=');\n\n if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) {\n // Found a matching cookie for csrftoken value, return as decoded string\n return decodeURIComponent(cookie[1]);\n }\n }\n } // Return empty string by default, POST calls may fail\n\n\n return '';\n }\n /** @method\n * @name _createRequestHeaders\n * @private\n * @memberof Kom\n * @description
    Fills Kom _headers private member array, to use in HTTP requests later on.\n * This method is required to be called on construction.
    \n * @return {array[]} - The headers array, length 3, to be used in HTTP requests */\n\n }, {\n key: \"_createRequestHeaders\",\n value: function _createRequestHeaders() {\n return [['Content-Type', 'application/json; charset=UTF-8'], ['Accept', 'application/json'], ['X-XSRF-TOKEN', this._csrfToken]];\n }\n /** @method\n * @async\n * @name _checkValidity\n * @private\n * @memberof Kom\n * @description
    Check the Kom instance validity to ensure its properties validity.
    */\n\n }, {\n key: \"_checkValidity\",\n value: function _checkValidity() {\n if (this._csrfToken !== '') {\n if (this._headers.length !== 3) {\n console.error('F_KOM_HEADERS_ERROR');\n }\n } else {\n console.error('F_KOM_NO_CSRF_TOKEN');\n }\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getErrorCodeFromHTTPStatus\n * @private\n * @memberof Kom\n * @description
    This method is called whenever a server request didn't went well. In case a request (from\n * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled\n * in the user interface (with notification, console or else).
    \n * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration\n * @return {string} The HTTP status as an error code */\n\n }, {\n key: \"_getErrorCodeFromHTTPStatus\",\n value: function _getErrorCodeFromHTTPStatus(code) {\n if (code === 404) {\n return 'B_KOM_NOT_FOUND';\n } else if (code === 403) {\n return 'B_KOM_ACCESS_FORBIDDEN';\n } else if (code === 500) {\n return 'B_KOM_INTERNAL_ERROR';\n } else {\n return \"B_KOM_UNKNOWN_ERROR\";\n }\n }\n /** @method\n * @async\n * @name _resolveAs\n * @private\n * @memberof Kom\n * @description
    Generic tool method used by private methods on fetch responses to format output in the provided\n * format. It must be either `json`, `text` or `raw`.
    \n * @param {String} type - The type of resolution, can be `json`, `text` or `raw`\n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAs\",\n value: function _resolveAs(type, response) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (response) {\n if (type === 'raw') {\n // Raw are made in XMLHttpRequest and need special handling\n if (response.status === 200) {\n resolve(response.responseText);\n } else {\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'json' || type === 'text') {\n // Call are made using fetch API\n if (response[type]) {\n resolve(response[type]());\n } else {\n // Fallback on standard error handling\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'dom') {\n response.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n } else {\n // Resolution type doesn't exists, resolving empty\n resolve();\n }\n } else {\n reject('F_KOM_MISSING_ARGUMENT');\n }\n });\n }\n /** @method\n * @async\n * @name _resolveAsJSON\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be\n * read in JavaScript code as objects.
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsJSON\",\n value: function _resolveAsJSON(response) {\n return this._resolveAs('json', response);\n }\n /** @method\n * @async\n * @name _resolveAsText\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as text to be\n * read in JavaScript code as string (mostly to parse HTML templates).
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsText\",\n value: function _resolveAsText(response) {\n return this._resolveAs('text', response);\n }\n }, {\n key: \"_resolveAsDom\",\n value: function _resolveAsDom(response) {\n return this._resolveAs('dom', response);\n }\n /** @method\n * @async\n * @name _resolveAsRaw\n * @private\n * @memberof Kom\n * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    \n * @param {Object} response - The XmlHTTPRequest response status object\n * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */\n\n }, {\n key: \"_resolveAsRaw\",\n value: function _resolveAsRaw(response) {\n return this._resolveAs('raw', response);\n }\n }, {\n key: \"_xhrCall\",\n value: function _xhrCall(url, verb, data) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open(verb, url, true);\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n xhr.onreadystatechange = function (response) {\n if (response.target.readyState === 4) {\n // Ready state changed has reach the response state\n _this2._resolveAsRaw(response.target).then(resolve)[\"catch\"](reject);\n }\n };\n\n xhr.onerror = function () {\n reject('F_KOM_XHR_ERROR');\n };\n\n xhr.send(data);\n });\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @async\n * @name get\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as an Object.
    reject returns an error key as a String.\n * It is meant to perform API call to access database through the user interface.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"get\",\n value: function get(url) {\n var _this3 = this;\n\n var resolution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers([_this3._headers[0]]) // Content type to JSON\n\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getText\",\n value: function getText(url) {\n return this.get(url, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getTemplate\",\n value: function getTemplate(url) {\n return this.get(url, this._resolveAsDom.bind(this));\n }\n /** @method\n * @async\n * @name getRaw\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using an XMLHttpRequest, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getRaw\",\n value: function getRaw(url) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._xhrCall(url, 'GET', null).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name post\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as an Object.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"post\",\n value: function post(url, data) {\n var _this5 = this;\n\n var resolution = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(_this5._headers),\n // POST needs all previously defined headers\n body: JSON.stringify(data)\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name postText\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as a String.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postText\",\n value: function postText(url, data) {\n return this.post(url, data, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name postRaw\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postRaw\",\n value: function postRaw(url, data) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6._xhrCall(url, 'POST', JSON.stringify(data)).then(resolve)[\"catch\"](reject);\n });\n }\n /* */\n\n }, {\n key: \"savePoint\",\n value: function savePoint(type, data) {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n _this7.post(\"http://localhost:8080/api/\".concat(type, \"/\"), data, null).then(resolve);\n });\n }\n }, {\n key: \"spotCreated\",\n value: function spotCreated(data) {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n _this8.savePoint('spot', data).then(resolve);\n });\n }\n }, {\n key: \"shopCreated\",\n value: function shopCreated(data) {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n _this9.savePoint('shop', data).then(resolve);\n });\n }\n }, {\n key: \"barCreated\",\n value: function barCreated(data) {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n _this10.savePoint('bar', data).then(resolve);\n });\n }\n }]);\n\n return Kom;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Kom);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Kom.js?"); - -/***/ }), - -/***/ "./src/js/utils/LangManager.js": -/*!*************************************!*\ - !*** ./src/js/utils/LangManager.js ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"shop\",\n value: function shop(key) {\n return this._values.shop[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); - -/***/ }), - -/***/ "./src/js/utils/MarkerEnum.js": -/*!************************************!*\ - !*** ./src/js/utils/MarkerEnum.js ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-blue.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-gold.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-red.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-green.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-orange.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-yellow.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-violet.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-grey.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-black.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: '/static/img/marker/user-position.png',\n shadowUrl: '/static/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); - -/***/ }), - -/***/ "./src/js/utils/ProviderEnum.js": -/*!**************************************!*\ - !*** ./src/js/utils/ProviderEnum.js ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); - -/***/ }), - -/***/ "./src/js/utils/Utils.js": -/*!*******************************!*\ - !*** ./src/js/utils/Utils.js ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.shop.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getShops\",\n value: function getShops() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"SHOP_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); - -/***/ }), - -/***/ "./src/BeerCrackerz.scss": -/*!*******************************!*\ - !*** ./src/BeerCrackerz.scss ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerz.scss?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerz.js"); -/******/ window.BeerCrackerz = __webpack_exports__["default"]; -/******/ -/******/ })() -; \ No newline at end of file +!function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};function n(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:this._resolveAsJSON.bind(this);return new Promise((function(r,a){var o={method:"GET",headers:new Headers([t._headers[0]])};fetch(e,o).then(n).then(r).catch(a)}))}},{key:"getText",value:function(e){return this.get(e,this._resolveAsText.bind(this))}},{key:"getTemplate",value:function(e){return this.get(e,this._resolveAsDom.bind(this))}},{key:"post",value:function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._resolveAsJSON.bind(this);return new Promise((function(a,o){var i={method:"POST",headers:new Headers(n._headers),body:JSON.stringify(t)};fetch(e,i).then(r).then(a).catch(o)}))}},{key:"postText",value:function(e,t){return this.post(e,t,this._resolveAsText.bind(this))}},{key:"_getPoints",value:function(e){var t=this;return new Promise((function(n,r){t.get("http://localhost:8080/api/".concat(e)).then(n).catch(r)}))}},{key:"getSpots",value:function(){return this._getPoints("spot")}},{key:"getShops",value:function(){return this._getPoints("shop")}},{key:"getBars",value:function(){return this._getPoints("bar")}},{key:"_savePoint",value:function(e,t){var n=this;return new Promise((function(r,a){n.post("http://localhost:8080/api/".concat(e,"/"),t,null).then(r).catch(a)}))}},{key:"spotCreated",value:function(e){return this._savePoint("spot",e)}},{key:"shopCreated",value:function(e){return this._savePoint("shop",e)}},{key:"barCreated",value:function(e){return this._savePoint("bar",e)}}],r&&n(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}(),a=r;function o(e,t){for(var n=0;n : -"),r.innerHTML="".concat(e("lng")," : -"),a.innerHTML="".concat(e("updates")," : 0"),o.innerHTML="".concat(e("accuracy")," : -"),i.innerHTML="".concat(e("highAccuracy")," : -"),c.innerHTML="".concat(e("posAge")," : -"),s.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(n),t.appendChild(r),t.appendChild(a),t.appendChild(o),t.appendChild(i),t.appendChild(c),t.appendChild(s),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,n,r){if(!0===window.DEBUG){var a=window.BeerCrackerz,o=a.nls.debug.bind(a.nls),i=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,c=a.marks.spot.length+a.marks.shop.length+a.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(o("lat")," : ").concat(n.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(o("lng")," : ").concat(n.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(o("updates")," : ").concat(i,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(o("accuracy")," : ").concat(e.precisionRound(n.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(o("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?o("enabled"):o("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(o("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(o("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(o("zoom")," : ").concat(a.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(o("marks")," : ").concat(c,"\n ")}}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"SHOP_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de","pt"]}}],null&&o(t.prototype,null),n&&o(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function c(e,t){for(var n=0;ni.CIRCLE_RADIUS&&console.log("Too far"),o!==t.user.username?a.querySelector("#popup-edit").parentNode.removeChild(a.querySelector("#popup-edit")):(a.querySelector("#edit-mark").addEventListener("click",t.editMarker.bind(t,e),!1),a.querySelector("#delete-mark").addEventListener("click",t.deleteMarker.bind(t,e),!1)),e.color=i["".concat(e.type.toUpperCase(),"_COLOR")],e.circle=t.drawCircle(e),e.tooltip=window.L.tooltip({permanent:!0,direction:"center",className:"marker-tooltip",interactive:!0}).setContent(e.name).setLatLng(e.circle.getLatLng()),"true"===i.getPreference("poi-marker-label")&&e.tooltip.addTo(t.map),n(a)}))}))}},{key:"drawCircle",value:function(e){return window.L.circle(e,{color:e.color,fillColor:e.color,opacity:0,fillOpacity:0,radius:e.radius?e.radius:i.CIRCLE_RADIUS}).addTo(this.map)}},{key:"setMarkerCircles",value:function(e,t){for(var n=0;nOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})});function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function v(e,t){for(var n=0;n".concat(e.nls.map("planLayerOSM"),"

    ")]=n,a["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=r,i.getPreference("map-plan-layer"))switch(i.getPreference("map-plan-layer")){case e.nls.map("planLayerOSM"):n.addTo(e._map);break;case e.nls.map("satLayerEsri"):r.addTo(e._map);break;default:n.addTo(e._map)}else n.addTo(e._map);window.L.control.layers(a,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new g(e._map),t()}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){document.getElementById("user-profile").addEventListener("click",e.userProfileModal.bind(e)),document.getElementById("hide-show").addEventListener("click",e.hidShowModal.bind(e)),document.getElementById("center-on").addEventListener("click",e.toggleFocusLock.bind(e)),document.getElementById("overlay").addEventListener("click",e.closeModal.bind(e)),e._map.on("click",e.mapClicked.bind(e)),e._map.on("drag",(function(){e._map.panInsideBounds(i.MAP_BOUNDS,{animate:!0}),"true"===i.getPreference("map-center-on-user")&&e.toggleFocusLock()})),e._map.on("zoomstart",(function(){e._isZooming=!0,"true"===i.getPreference("poi-show-circle")&&(e.setMarkerCircles(e._marks.spot,!1),e.setMarkerCircles(e._marks.shop,!1),e.setMarkerCircles(e._marks.bar,!1),e.setMarkerCircles([e._user],!1),e.setMarkerCircles([{circle:e._user.range}],!1))})),e._map.on("zoomend",(function(){e._isZooming=!1,"true"===i.getPreference("poi-show-circle")&&e._map.getZoom()>=15&&(e.setMarkerCircles(e._marks.spot,!0),e.setMarkerCircles(e._marks.shop,!0),e.setMarkerCircles(e._marks.bar,!0),e.setMarkerCircles([e._user],!0),e.setMarkerCircles([{circle:e._user.range}],!0)),"true"===i.getPreference("poi-marker-label")&&(e._map.getZoom()<15?(e.setMarkerLabels(e._marks.spot,!1),e.setMarkerLabels(e._marks.shop,!1),e.setMarkerLabels(e._marks.bar,!1)):(e.setMarkerLabels(e._marks.spot,!0),e.setMarkerLabels(e._marks.shop,!0),e.setMarkerLabels(e._marks.bar,!0))),e.updateDebugUI()})),e._map.on("baselayerchange",(function(e){i.setPreference("map-plan-layer",i.stripDom(e.name))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){var n={animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1};e._clusters.spot=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.shop=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),e._clusters.bar=new window.L.MarkerClusterGroup(Object.assign(n,{iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})),"true"===i.getPreference("poi-show-spot")&&e._map.addLayer(e._clusters.spot),"true"===i.getPreference("poi-show-shop")&&e._map.addLayer(e._clusters.shop),"true"===i.getPreference("poi-show-bar")&&e._map.addLayer(e._clusters.bar);var r=function(t){e.markPopupFactory(t).then((function(n){t.dom=n,t.marker=e.placeMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};e._kom.getSpots().then((function(e){for(var t=0;t=i.CIRCLE_RADIUS&&t[n].circle.visible&&(t[n].circle.visible=!1,t[n].circle.setStyle({opacity:0,fillOpacity:0}))}};"true"===i.getPreference("poi-show-circle")&&(t(this._marks.spot),t(this._marks.shop),t(this._marks.bar),t([this._user]))}},{key:"formatSavedMarker",value:function(e){return{userId:e.userId||this.user.id,name:e.name,description:e.description,lat:e.lat,lng:e.lng,rate:e.rate}}},{key:"editMarker",value:function(e){this._map.closePopup(),this.editMarkModal(e)}},{key:"deleteMarker",value:function(e){var t=this;this.deleteMarkModal((function(n){if(!0===n){for(var r=t._marks[e.type],a=0;a { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/BeerCrackerzAuth.js": -/*!*********************************!*\ - !*** ./src/BeerCrackerzAuth.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/utils/ProviderEnum.js */ \"./src/js/utils/ProviderEnum.js\");\n/* harmony import */ var _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/ui/ZoomSlider.js */ \"./src/js/ui/ZoomSlider.js\");\n/* harmony import */ var _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/utils/LangManager.js */ \"./src/js/utils/LangManager.js\");\n/* harmony import */ var _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/Notification.js */ \"./src/js/ui/Notification.js\");\n/* harmony import */ var _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/MarkerEnum.js */ \"./src/js/utils/MarkerEnum.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/Kom.js */ \"./src/js/utils/Kom.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n this._aside = null;\n this._isAsideExpanded = true;\n this._kom = new _js_utils_Kom_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"](); // The BeerCrackerz app is only initialized once nls are set up\n // By default, the template contains the login aside, no need to fetch it\n\n this._lang = new _js_utils_LangManager_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"](window.navigator.language.substring(0, 2), this._init.bind(this));\n }\n\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n this._handleLoginAside();\n\n this._notification = new _js_ui_Notification_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]();\n\n this._initMap().then(this._initGeolocation.bind(this)).then(this._initEvents.bind(this)).then(this._initMarkers.bind(this));\n } // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this = this;\n\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.login('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_SUBTITLE}', this.nls.login('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_HIDDEN_ERROR}', this.nls.login('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_USERNAME_LABEL}', this.nls.login('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_USERNAME_PASSWORD}', this.nls.login('password'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_FORGOT_PASSWORD}', this.nls.login('forgot'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_BUTTON}', this.nls.login('login'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_NOT_REGISTERED}', this.nls.login('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{LOGIN_REGISTER}', this.nls.login('register'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('login-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this._kom.post('/api/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this.nls.login('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this2 = this;\n\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_SUBTITLE}', this.nls.register('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_HIDDEN_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_USERNAME_LABEL}', this.nls.register('username'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_MAIL_LABEL}', this.nls.register('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_USERNAME_PASSWORD_1}', this.nls.register('password1'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_USERNAME_PASSWORD_2}', this.nls.register('password2'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_BUTTON}', this.nls.register('register'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_ALREADY_DONE}', this.nls.register('notRegistered'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{REGISTER_LOGIN}', this.nls.register('login'));\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('fieldEmpty');\n\n if (username.value === '') {\n username.classList.add('error');\n }\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n if (password1.value === '') {\n password1.classList.add('error');\n }\n\n if (password2.value === '') {\n password2.classList.add('error');\n }\n\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('register-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this2._kom.post('/api/register/submit', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this2.nls.register('serverError');\n });\n }\n }, false); // Register event\n\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAdise\",\n value: function _handleResetPasswordAdise() {\n var _this3 = this;\n\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_SUBTITLE}', this.nls.forgotPassword('subtitle'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_ERROR}', this.nls.register('hiddenError'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_MAIL_LABEL}', this.nls.forgotPassword('mail'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_BUTTON}', this.nls.forgotPassword('submit'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_LOGIN_LABEL}', this.nls.forgotPassword('loginLabel'));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(aside, '{FORGOT_PASSWORD_LOGIN}', this.nls.forgotPassword('login'));\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail'); // useful login method for field check and server response check\n\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.forgotPassword('fieldEmpty');\n\n if (mail.value === '') {\n mail.classList.add('error');\n }\n\n return false;\n }\n\n return true;\n };\n\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response); // If all front and back tests are ok, redirect to auth\n // If the user ma nually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n\n window.location = 'authindex.html';\n }; // Submit click event\n\n\n document.getElementById('forgot-password-submit').addEventListener('click', function () {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n\n if (_frontFieldValidation()) {\n _this3._kom.post('/api/password/reset', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this3.nls.forgotPassword('serverError');\n });\n }\n }, false);\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._kom.getTemplate(\"/static/html/aside/\".concat(type, \".html\")).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n\n _this4._aside = document.getElementById('aside');\n _this4._aside.innerHTML = ''; // Clear HTML content\n\n _this4._aside.appendChild(dom); // Replace with current aside dom\n\n\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the login aside');\n });\n }\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the register aside');\n });\n }\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside() {\n this._loadAside('forgot-password').then(this._handleResetPasswordAdise.bind(this))[\"catch\"](function () {\n console.error('Couldn\\'t fetch or build the forgot password aside');\n });\n }\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n }\n } // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _initMap\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this5 = this;\n\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this5._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12); // Add meter and feet scale on map\n\n window.L.control.scale().addTo(_this5._map); // Place user marker on the map\n\n _this5.drawUserMarker(); // Add OSM credits to the map next to leaflet credits\n\n\n var osm = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].planOsm; //const plan = Providers.planGeo;\n\n var esri = _js_utils_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"].satEsri; //const geo = Providers.satGeo;\n // Prevent panning outside of the world's edge\n\n _this5._map.setMaxBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS); // Add layer group to interface\n\n\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this5.nls.map('planLayerOSM'), \"

    \")] = osm;\n baseMaps[\"

    \".concat(_this5.nls.map('satLayerEsri'), \"

    \")] = esri; // Append layer depending on user preference\n\n osm.addTo(_this5._map); // Add layer switch radio on bottom right of the map\n\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this5._map); // Init zoom slider when map has been created\n\n _this5._zoomSlider = new _js_ui_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"](_this5._map);\n resolve();\n });\n }\n /**\n * @method\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this6._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this6._user.lat = position.coords.latitude;\n _this6._user.lng = position.coords.longitude;\n _this6._user.accuracy = position.coords.accuracy; // Only draw marker if map is already created\n\n if (_this6._map) {\n _this6.drawUserMarker();\n }\n }, null, _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].HIGH_ACCURACY);\n resolve();\n } else {\n _this6._notification.raise(_this6.nls.notif('geolocationError'));\n\n resolve();\n }\n });\n }\n /**\n * @method\n * @name _initEvents\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n // Subscribe to click event on map to react\n _this7._map.on('click', _this7.mapClicked.bind(_this7)); // Map is dragged by user mouse/finger\n\n\n _this7._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this7._map.panInsideBounds(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].MAP_BOUNDS, {\n animate: true\n });\n }); // Map events\n\n\n _this7._map.on('zoomstart', function () {\n _this7._isZooming = true;\n });\n\n _this7._map.on('zoomend', function () {\n _this7._isZooming = false; // Auto hide labels if zoom level is too high (and restore it when needed)\n\n if (_this7._map.getZoom() < 15) {\n _this7.setMarkerLabels(_this7._marks.spot, false);\n\n _this7.setMarkerLabels(_this7._marks.shop, false);\n\n _this7.setMarkerLabels(_this7._marks.bar, false);\n } else {\n _this7.setMarkerLabels(_this7._marks.spot, true);\n\n _this7.setMarkerLabels(_this7._marks.shop, true);\n\n _this7.setMarkerLabels(_this7._marks.bar, true);\n }\n });\n\n resolve();\n });\n }\n /**\n * @method\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n var clusterOptions = {\n animateAddingMarkers: true,\n disableClusteringAtZoom: 18,\n spiderfyOnMaxZoom: false\n };\n _this8._clusters.spot = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this8._clusters.shop = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n _this8._clusters.bar = new window.L.MarkerClusterGroup(Object.assign(clusterOptions, {\n iconCreateFunction: function iconCreateFunction(cluster) {\n return window.L.divIcon({\n className: 'cluster-icon-wrapper',\n html: \"\\n \\n \".concat(cluster.getChildCount(), \"\\n \")\n });\n }\n }));\n\n _this8._map.addLayer(_this8._clusters.spot);\n\n _this8._map.addLayer(_this8._clusters.shop);\n\n _this8._map.addLayer(_this8._clusters.bar); // Load data from local storage, later to be fetched from server\n\n\n var iterateMarkers = function iterateMarkers(mark) {\n _this8.markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this8.placeMarker(mark);\n\n _this8._marks[mark.type].push(mark);\n\n _this8._clusters[mark.type].addLayer(mark.marker);\n });\n };\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n // TODO @raph\n spots[i].type = 'spot';\n spots[i].user = 'messmaker';\n spots[i].userId = 1;\n iterateMarkers(spots[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n // TODO @raph\n shops[i].type = 'shop';\n shops[i].user = 'messmaker';\n shops[i].userId = 1;\n iterateMarkers(shops[i]);\n }\n });\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n // TODO @raph\n bars[i].type = 'bar';\n bars[i].user = 'messmaker';\n bars[i].userId = 1;\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n }, {\n key: \"drawUserMarker\",\n value: function drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this.placeMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n }, {\n key: \"placeMarker\",\n value: function placeMarker(options) {\n var _this9 = this;\n\n var icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].black;\n\n if (options.type === 'shop') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].blue;\n } else if (options.type === 'spot') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].green;\n } else if (options.type === 'bar') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].user;\n }\n\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this9.map.flyTo([options.lat, options.lng], 18);\n });\n\n if (options.dom) {\n marker.bindPopup(options.dom);\n } // All markers that are not spot/shop/bar should be appended to the map\n\n\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n\n return marker;\n }\n }, {\n key: \"markPopupFactory\",\n value: function markPopupFactory(options) {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n _this10._kom.getTemplate(\"/static/html/popup/\".concat(options.type, \".html\")).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user || _this10.user.username;\n\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(options.description) || _this10.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_NAME}\"), _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].stripDom(options.name));\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FINDER}\"), user);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_RATE}\"), options.rate + 1);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_DESC}\"), desc);\n _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].replaceString(element, \"{\".concat(options.type.toUpperCase(), \"_FOUND_BY}\"), _this10.nls.popup(\"\".concat(options.type, \"FoundBy\"))); // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n\n\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit')); // Append circle around marker\n\n options.color = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"][\"\".concat(options.type.toUpperCase(), \"_COLOR\")]; // Create label for new marker\n\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Make tooltip visible if preference is to true\n\n options.tooltip.addTo(_this10.map); // Send back the popup\n\n resolve(element);\n });\n });\n }\n }, {\n key: \"setMarkerLabels\",\n value: function setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n /**\n * @method\n * @name mapClicked\n * @public\n * @memberof BeerCrackerz\n * @author Arthur Beaulieu\n * @since January 2022\n * @description\n *
    \n * The mapClicked() method is the callback used when the user clicked on the Leaflet.js map\n *
    \n **/\n\n }, {\n key: \"mapClicked\",\n value: function mapClicked() {// Let this empty\n } // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n\n return BeerCrackerzAuth;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); - -/***/ }), - -/***/ "./src/js/ui/Notification.js": -/*!***********************************!*\ - !*** ./src/js/ui/Notification.js ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Notification = /*#__PURE__*/function () {\n function Notification() {\n _classCallCheck(this, Notification);\n\n this._container = document.querySelector('#notification-wrapper');\n this._message = document.querySelector('#notification-message');\n this._timeoutId = null;\n }\n\n _createClass(Notification, [{\n key: \"raise\",\n value: function raise(message) {\n var _this = this;\n\n clearTimeout(this._timeoutId);\n this._message.innerHTML = message;\n\n this._container.classList.add('opened');\n\n this._timeoutId = setTimeout(function () {\n _this._container.classList.remove('opened');\n\n _this._message.innerHTML = '';\n }, 2000);\n }\n }]);\n\n return Notification;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notification);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/Notification.js?"); - -/***/ }), - -/***/ "./src/js/ui/ZoomSlider.js": -/*!*********************************!*\ - !*** ./src/js/ui/ZoomSlider.js ***! - \*********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar ZoomSlider = /*#__PURE__*/function () {\n function ZoomSlider(map) {\n _classCallCheck(this, ZoomSlider);\n\n this._map = map;\n this._container = document.querySelector('#zoom-slider');\n this._slider = document.querySelector('#slider-position');\n this._zoomRange = this._map.getMaxZoom() - this._map.getMinZoom();\n this._timeoutId = -1;\n\n this._events();\n }\n\n _createClass(ZoomSlider, [{\n key: \"_events\",\n value: function _events() {\n var _this = this;\n\n this._map.on('zoomstart', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n _this._container.classList.add('opened');\n });\n\n this._map.on('zoomend', function () {\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._map.on('zoom', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n\n var correctedZoom = _this._map.getZoom() - _this._map.getMinZoom();\n\n _this._slider.style.height = \"\".concat(correctedZoom * 100 / _this._zoomRange, \"%\");\n });\n\n this._container.addEventListener('mouseover', function () {\n clearTimeout(_this._timeoutId);\n _this._timeoutId = -1;\n });\n\n this._container.addEventListener('mouseleave', function () {\n _this._timeoutId = setTimeout(function () {\n return _this._container.classList.remove('opened');\n }, 1500);\n });\n\n this._container.querySelector('#zoom-more').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() + 1);\n });\n\n this._container.querySelector('#zoom-less').addEventListener('click', function () {\n _this._map.setZoom(_this._map.getZoom() - 1);\n });\n }\n }]);\n\n return ZoomSlider;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ZoomSlider);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/ui/ZoomSlider.js?"); - -/***/ }), - -/***/ "./src/js/utils/Kom.js": -/*!*****************************!*\ - !*** ./src/js/utils/Kom.js ***! - \*****************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Kom = /*#__PURE__*/function () {\n /** @summary

    Server communication abstraction

    \n * @author Arthur Beaulieu\n * @since June 2020\n * @description
    This class is the main object to deal with when requesting something from the server.
    \n * It handle all urls calls (GET, POST), treat responses or handle errors using\n * Promise.
    Because it uses Promise, success and errors are to be handled in the caller\n * function, using .then() and .catch(). To properly deal with POST request,\n * the session must contain a csrf token in cookies. Otherwise, those POST call may fail.
    */\n function Kom() {\n _classCallCheck(this, Kom);\n\n /** @private\n * @member {string} - User session CSRF token to use in POST request */\n this._csrfToken = this._getCsrfCookie();\n /** @private\n * @member {array[]} - Array of HTTP headers to be used in HTTP calls */\n\n this._headers = this._createRequestHeaders(); // Check that CSRF token exists and that headers are properly created\n\n this._checkValidity();\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- CLASS INIT UTILS ----------------------------------------------- */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getCsrfCookie\n * @private\n * @memberof Kom\n * @description
    Extract CSRF token value from client cookies and returns it as a string. Returns an empty\n * string by default. This method is required to be called on construction.
    \n * @return {string} - The CSRF token string */\n\n\n _createClass(Kom, [{\n key: \"_getCsrfCookie\",\n value: function _getCsrfCookie() {\n if (document.cookie && document.cookie !== '') {\n var cookies = document.cookie.split(';');\n\n for (var i = 0; i < cookies.length; ++i) {\n // Parse current cookie to extract its properties\n var cookie = cookies[i].split('=');\n\n if (cookie !== undefined && cookie[0].toLowerCase().includes('srf')) {\n // Found a matching cookie for csrftoken value, return as decoded string\n return decodeURIComponent(cookie[1]);\n }\n }\n } // Return empty string by default, POST calls may fail\n\n\n return '';\n }\n /** @method\n * @name _createRequestHeaders\n * @private\n * @memberof Kom\n * @description
    Fills Kom _headers private member array, to use in HTTP requests later on.\n * This method is required to be called on construction.
    \n * @return {array[]} - The headers array, length 3, to be used in HTTP requests */\n\n }, {\n key: \"_createRequestHeaders\",\n value: function _createRequestHeaders() {\n return [['Content-Type', 'application/json; charset=UTF-8'], ['Accept', 'application/json'], ['X-XSRF-TOKEN', this._csrfToken]];\n }\n /** @method\n * @async\n * @name _checkValidity\n * @private\n * @memberof Kom\n * @description
    Check the Kom instance validity to ensure its properties validity.
    */\n\n }, {\n key: \"_checkValidity\",\n value: function _checkValidity() {\n if (this._csrfToken !== '') {\n if (this._headers.length !== 3) {\n console.error('F_KOM_HEADERS_ERROR');\n }\n } else {\n console.error('F_KOM_NO_CSRF_TOKEN');\n }\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* ------------------------------------------- PRIVATE METHODS ------------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @name _getErrorCodeFromHTTPStatus\n * @private\n * @memberof Kom\n * @description
    This method is called whenever a server request didn't went well. In case a request (from\n * any type) fails, its HTTP status code have to be handle in the method, so it returns an error code can be handled\n * in the user interface (with notification, console or else).
    \n * @param {number} code - The HTTP status code to handle, in supported ones from HttpStatusCode enumeration\n * @return {string} The HTTP status as an error code */\n\n }, {\n key: \"_getErrorCodeFromHTTPStatus\",\n value: function _getErrorCodeFromHTTPStatus(code) {\n if (code === 404) {\n return 'B_KOM_NOT_FOUND';\n } else if (code === 403) {\n return 'B_KOM_ACCESS_FORBIDDEN';\n } else if (code === 500) {\n return 'B_KOM_INTERNAL_ERROR';\n } else {\n return \"B_KOM_UNKNOWN_ERROR\";\n }\n }\n /** @method\n * @async\n * @name _resolveAs\n * @private\n * @memberof Kom\n * @description
    Generic tool method used by private methods on fetch responses to format output in the provided\n * format. It must be either `json`, `text` or `raw`.
    \n * @param {String} type - The type of resolution, can be `json`, `text` or `raw`\n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAs\",\n value: function _resolveAs(type, response) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (response) {\n if (type === 'raw') {\n // Raw are made in XMLHttpRequest and need special handling\n if (response.status === 200) {\n resolve(response.responseText);\n } else {\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'json' || type === 'text') {\n // Call are made using fetch API\n if (response[type]) {\n resolve(response[type]());\n } else {\n // Fallback on standard error handling\n reject(_this._getErrorCodeFromHTTPStatus(response.status));\n }\n } else if (type === 'dom') {\n response.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n } else {\n // Resolution type doesn't exists, resolving empty\n resolve();\n }\n } else {\n reject('F_KOM_MISSING_ARGUMENT');\n }\n });\n }\n /** @method\n * @async\n * @name _resolveAsJSON\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as JSON to be\n * read in JavaScript code as objects.
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as an object on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsJSON\",\n value: function _resolveAsJSON(response) {\n return this._resolveAs('json', response);\n }\n /** @method\n * @async\n * @name _resolveAsText\n * @private\n * @memberof Kom\n * @description
    Tool method used by public methods on fetch responses to format output data as text to be\n * read in JavaScript code as string (mostly to parse HTML templates).
    \n * @param {Object} response - The fetch response object\n * @returns {Promise} The request Promise, format response as a string on resolve, as error code string on reject */\n\n }, {\n key: \"_resolveAsText\",\n value: function _resolveAsText(response) {\n return this._resolveAs('text', response);\n }\n }, {\n key: \"_resolveAsDom\",\n value: function _resolveAsDom(response) {\n return this._resolveAs('dom', response);\n }\n /** @method\n * @async\n * @name _resolveAsRaw\n * @private\n * @memberof Kom\n * @description
    Tool method used by XmlHTTPRequests to format server response as raw binary data.
    \n * @param {Object} response - The XmlHTTPRequest response status object\n * @returns {Promise} The request Promise, doesn't format response on resolve, send error code string on reject */\n\n }, {\n key: \"_resolveAsRaw\",\n value: function _resolveAsRaw(response) {\n return this._resolveAs('raw', response);\n }\n }, {\n key: \"_xhrCall\",\n value: function _xhrCall(url, verb, data) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var xhr = new XMLHttpRequest();\n xhr.open(verb, url, true);\n xhr.overrideMimeType('text/plain; charset=x-user-defined');\n\n xhr.onreadystatechange = function (response) {\n if (response.target.readyState === 4) {\n // Ready state changed has reach the response state\n _this2._resolveAsRaw(response.target).then(resolve)[\"catch\"](reject);\n }\n };\n\n xhr.onerror = function () {\n reject('F_KOM_XHR_ERROR');\n };\n\n xhr.send(data);\n });\n }\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /* --------------------------------------- HTTP SERVER CALLS METHODS ------------------------------------------ */\n\n /* --------------------------------------------------------------------------------------------------------------- */\n\n /** @method\n * @async\n * @name get\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as an Object.
    reject returns an error key as a String.\n * It is meant to perform API call to access database through the user interface.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"get\",\n value: function get(url) {\n var _this3 = this;\n\n var resolution = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers([_this3._headers[0]]) // Content type to JSON\n\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getText\",\n value: function getText(url) {\n return this.get(url, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name getText\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using the fetch API.
    resolve returns the\n * response as a String.
    reject returns an error key as a String. It is\n * meant to perform API call to get HTML templates as string to be parsed as documents/documents fragments.
    \n * @param {String} url - The GET url to fetch data from, in supported back URLs\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getTemplate\",\n value: function getTemplate(url) {\n return this.get(url, this._resolveAsDom.bind(this));\n }\n /** @method\n * @async\n * @name getRaw\n * @public\n * @memberof Kom\n * @description
    GET HTTP request using an XMLHttpRequest, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"getRaw\",\n value: function getRaw(url) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._xhrCall(url, 'GET', null).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name post\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as an Object.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"post\",\n value: function post(url, data) {\n var _this5 = this;\n\n var resolution = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this._resolveAsJSON.bind(this);\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(_this5._headers),\n // POST needs all previously defined headers\n body: JSON.stringify(data)\n };\n fetch(url, options).then(resolution).then(resolve)[\"catch\"](reject);\n });\n }\n /** @method\n * @async\n * @name postText\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve\n * returns the response as a String.
    reject returns an error key as a String.
    \n * @param {String} url - The POST url to fetch data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postText\",\n value: function postText(url, data) {\n return this.post(url, data, this._resolveAsText.bind(this));\n }\n /** @method\n * @async\n * @name postRaw\n * @public\n * @memberof Kom\n * @description
    POST HTTP request using the fetch API.
    Beware that the given options\n * object match the url expectations.
    resolve, with an override\n * mime type hack to pass bytes through unprocessed.
    resolve returns the response as raw binary data.
    reject\n * returns an error code as a String.
    \n * @param {String} url - The url to fetch raw data from\n * @param {Object} data - The JSON object that contains POST parameters\n * @returns {Promise} The request Promise */\n\n }, {\n key: \"postRaw\",\n value: function postRaw(url, data) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n _this6._xhrCall(url, 'POST', JSON.stringify(data)).then(resolve)[\"catch\"](reject);\n });\n }\n /* */\n\n }, {\n key: \"savePoint\",\n value: function savePoint(type, data) {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n _this7.post(\"http://localhost:8080/api/\".concat(type, \"/\"), data, null).then(resolve);\n });\n }\n }, {\n key: \"spotCreated\",\n value: function spotCreated(data) {\n var _this8 = this;\n\n return new Promise(function (resolve) {\n _this8.savePoint('spot', data).then(resolve);\n });\n }\n }, {\n key: \"shopCreated\",\n value: function shopCreated(data) {\n var _this9 = this;\n\n return new Promise(function (resolve) {\n _this9.savePoint('shop', data).then(resolve);\n });\n }\n }, {\n key: \"barCreated\",\n value: function barCreated(data) {\n var _this10 = this;\n\n return new Promise(function (resolve) {\n _this10.savePoint('bar', data).then(resolve);\n });\n }\n }]);\n\n return Kom;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Kom);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Kom.js?"); - -/***/ }), - -/***/ "./src/js/utils/LangManager.js": -/*!*************************************!*\ - !*** ./src/js/utils/LangManager.js ***! - \*************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Utils.js */ \"./src/js/utils/Utils.js\");\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\n\n\nvar LangManager = /*#__PURE__*/function () {\n function LangManager(lang, cb) {\n _classCallCheck(this, LangManager);\n\n this._lang = _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].SUPPORTED_LANGUAGE.indexOf(lang) !== -1 ? lang : 'en';\n this._values = {};\n\n this._init().then(cb);\n }\n\n _createClass(LangManager, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _Utils_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].fetchFile(\"/static/nls/\".concat(_this._lang, \".json\")).then(function (lang) {\n _this._values = JSON.parse(lang);\n resolve();\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"debug\",\n value: function debug(key) {\n return this._values.debug[key] || '';\n }\n }, {\n key: \"notif\",\n value: function notif(key) {\n return this._values.notif[key] || '';\n }\n }, {\n key: \"nav\",\n value: function nav(key) {\n return this._values.nav[key] || '';\n }\n }, {\n key: \"map\",\n value: function map(key) {\n return this._values.map[key] || '';\n }\n }, {\n key: \"spot\",\n value: function spot(key) {\n return this._values.spot[key] || '';\n }\n }, {\n key: \"shop\",\n value: function shop(key) {\n return this._values.shop[key] || '';\n }\n }, {\n key: \"bar\",\n value: function bar(key) {\n return this._values.bar[key] || '';\n }\n }, {\n key: \"popup\",\n value: function popup(key) {\n return this._values.popup[key] || '';\n }\n }, {\n key: \"modal\",\n value: function modal(key) {\n return this._values.modal[key] || '';\n }\n }, {\n key: \"login\",\n value: function login(key) {\n return this._values.auth.login[key] || '';\n }\n }, {\n key: \"register\",\n value: function register(key) {\n return this._values.auth.register[key] || '';\n }\n }, {\n key: \"forgotPassword\",\n value: function forgotPassword(key) {\n return this._values.auth.forgotPassword[key] || '';\n }\n }]);\n\n return LangManager;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LangManager);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/LangManager.js?"); - -/***/ }), - -/***/ "./src/js/utils/MarkerEnum.js": -/*!************************************!*\ - !*** ./src/js/utils/MarkerEnum.js ***! - \************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n blue: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-blue.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n gold: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-gold.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n red: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-red.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n green: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-green.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n orange: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-orange.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n yellow: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-yellow.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n violet: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-violet.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n grey: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-grey.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n black: new window.L.Icon({\n iconUrl: '/static/img/marker/marker-icon-black.png',\n shadowUrl: '/static/img/marker/marker-shadow.png',\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowSize: [41, 41]\n }),\n user: new window.L.Icon({\n iconUrl: '/static/img/marker/user-position.png',\n shadowUrl: '/static/img/marker/user-position-shadow.png',\n iconSize: [32, 32],\n iconAnchor: [16, 16],\n popupAnchor: [1, -34],\n shadowSize: [32, 32]\n })\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/MarkerEnum.js?"); - -/***/ }), - -/***/ "./src/js/utils/ProviderEnum.js": -/*!**************************************!*\ - !*** ./src/js/utils/ProviderEnum.js ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Object.freeze({\n planOsm: window.L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {\n attribution: '© OpenStreetMap',\n maxZoom: 21,\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n minZoom: 2 // Don't allow dezooming too far from map so it always stay fully visible\n\n }),\n\n /*planGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/png',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21,\n }),*/\n satEsri: window.L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', {\n attribution: '© Esri Imagery',\n minZoom: 2,\n // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19,\n // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21\n })\n /*satGeo: window.L.tileLayer('https://wxs.ign.fr/{apikey}/geoportail/wmts?REQUEST=GetTile&SERVICE=WMTS&VERSION=1.0.0&STYLE={style}&TILEMATRIXSET=PM&FORMAT={format}&LAYER=ORTHOIMAGERY.ORTHOPHOTOS&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}', {\n attribution: '© Geoportail France',\n apikey: 'choisirgeoportail',\n format: 'image/jpeg',\n style: 'normal',\n minZoom: 2, // Don't allow dezooming too far from map so it always stay fully visible\n maxNativeZoom: 19, // To ensure tiles are not unloaded when zooming after 19\n maxZoom: 21 \n })*/\n\n}));\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/ProviderEnum.js?"); - -/***/ }), - -/***/ "./src/js/utils/Utils.js": -/*!*******************************!*\ - !*** ./src/js/utils/Utils.js ***! - \*******************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\n\nvar Utils = /*#__PURE__*/function () {\n function Utils() {\n /* Not meant to be instantiated, all methods should be static */\n\n _classCallCheck(this, Utils);\n }\n\n _createClass(Utils, null, [{\n key: \"fetchTemplate\",\n value: function fetchTemplate(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(function (html) {\n resolve(document.createRange().createContextualFragment(html));\n })[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"fetchFile\",\n value: function fetchFile(url) {\n return new Promise(function (resolve, reject) {\n fetch(url).then(function (data) {\n data.text().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"getReq\",\n value: function getReq(url) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'GET',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n url: \"http://localhost:8080\"\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"postReq\",\n value: function postReq(url, data) {\n return new Promise(function (resolve, reject) {\n var options = {\n method: 'POST',\n headers: new Headers(),\n mode: 'cors',\n cache: 'default',\n body: data\n };\n fetch(url, options).then(function (data) {\n data.json().then(resolve)[\"catch\"](reject);\n })[\"catch\"](reject);\n });\n }\n }, {\n key: \"stripDom\",\n value: function stripDom(html) {\n var doc = new DOMParser().parseFromString(html, 'text/html');\n return doc.body.textContent || '';\n }\n }, {\n key: \"replaceString\",\n value: function replaceString(element, string, value) {\n element.innerHTML = element.innerHTML.replace(string, value);\n }\n }, {\n key: \"getDistanceBetweenCoords\",\n value: function getDistanceBetweenCoords(from, to) {\n // return distance in meters\n var lon1 = from[1] * Math.PI / 180,\n lat1 = from[0] * Math.PI / 180,\n lon2 = to[1] * Math.PI / 180,\n lat2 = to[0] * Math.PI / 180;\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n var a = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(deltaLon / 2), 2);\n var c = 2 * Math.asin(Math.sqrt(a));\n var EARTH_RADIUS = 6371;\n return c * EARTH_RADIUS * 1000;\n }\n /** @method\n * @name precisionRound\n * @public\n * @memberof Utils\n * @author Arthur Beaulieu\n * @since September 2018\n * @description Do a Math.round with a given precision (ie amount of integers after the coma)\n * @param {nunmber} value - The value to precisely round\n * @param {number} precision - The number of integers after the coma\n * @return {number} - The rounded value */\n\n }, {\n key: \"precisionRound\",\n value: function precisionRound(value, precision) {\n var multiplier = Math.pow(10, precision || 0);\n return Math.round(value * multiplier) / multiplier;\n }\n }, {\n key: \"initDebugInterface\",\n value: function initDebugInterface() {\n var lang = window.BeerCrackerz.nls.debug.bind(window.BeerCrackerz.nls);\n var debugContainer = document.createElement('DIV');\n var userLat = document.createElement('P');\n var userLng = document.createElement('P');\n var updatesAmount = document.createElement('P');\n var userAccuracy = document.createElement('P');\n var highAccuracy = document.createElement('P');\n var maxAge = document.createElement('P');\n var posTimeout = document.createElement('P');\n var zoomLevel = document.createElement('P');\n var marks = document.createElement('P');\n var exportData = document.createElement('BUTTON');\n debugContainer.classList.add('debug-container');\n userLat.classList.add('debug-user-lat');\n userLng.classList.add('debug-user-lng');\n updatesAmount.classList.add('debug-updates-amount');\n userAccuracy.classList.add('debug-user-accuracy');\n highAccuracy.classList.add('debug-high-accuracy');\n maxAge.classList.add('debug-pos-max-age');\n posTimeout.classList.add('debug-pos-timeout');\n zoomLevel.classList.add('debug-zoom-level');\n marks.classList.add('debug-marks-amount');\n exportData.classList.add('debug-export-data');\n userLat.innerHTML = \"\".concat(lang('lat'), \" : -\");\n userLng.innerHTML = \"\".concat(lang('lng'), \" : -\");\n updatesAmount.innerHTML = \"\".concat(lang('updates'), \" : 0\");\n userAccuracy.innerHTML = \"\".concat(lang('accuracy'), \" : -\");\n highAccuracy.innerHTML = \"\".concat(lang('highAccuracy'), \" : -\");\n maxAge.innerHTML = \"\".concat(lang('posAge'), \" : -\");\n posTimeout.innerHTML = \"\".concat(lang('posTimeout'), \" : -\");\n zoomLevel.innerHTML = \"\".concat(lang('zoom'), \" : -\");\n marks.innerHTML = \"\".concat(lang('marks'), \" : -\");\n exportData.innerHTML = lang('export');\n debugContainer.appendChild(userLat);\n debugContainer.appendChild(userLng);\n debugContainer.appendChild(updatesAmount);\n debugContainer.appendChild(userAccuracy);\n debugContainer.appendChild(highAccuracy);\n debugContainer.appendChild(maxAge);\n debugContainer.appendChild(posTimeout);\n debugContainer.appendChild(zoomLevel);\n debugContainer.appendChild(marks);\n debugContainer.appendChild(exportData);\n exportData.addEventListener('click', window.BeerCrackerz.downloadData.bind(window.BeerCrackerz));\n return debugContainer;\n }\n }, {\n key: \"updateDebugInterface\",\n value: function updateDebugInterface(element, user, options) {\n if (window.DEBUG === true) {\n var bc = window.BeerCrackerz;\n var lang = bc.nls.debug.bind(bc.nls);\n var updates = parseInt(element.querySelector('.debug-updates-amount').innerHTML.split(' : ')[1]) + 1;\n var marks = bc.marks.spot.length + bc.marks.shop.length + bc.marks.bar.length;\n element.querySelector('.debug-user-lat').innerHTML = \"\\n \".concat(lang('lat'), \" : \").concat(user.lat, \"\\n \");\n element.querySelector('.debug-user-lng').innerHTML = \"\\n \".concat(lang('lng'), \" : \").concat(user.lng, \"\\n \");\n element.querySelector('.debug-updates-amount').innerHTML = \"\\n \".concat(lang('updates'), \" : \").concat(updates, \"\\n \");\n element.querySelector('.debug-user-accuracy').innerHTML = \"\\n \".concat(lang('accuracy'), \" : \").concat(Utils.precisionRound(user.accuracy, 2), \"m\\n \");\n element.querySelector('.debug-high-accuracy').innerHTML = \"\\n \".concat(lang('highAccuracy'), \" : \").concat(options.enableHighAccuracy === true ? lang('enabled') : lang('disabled'), \"\\n \");\n element.querySelector('.debug-pos-max-age').innerHTML = \"\\n \".concat(lang('posAge'), \" : \").concat(options.maximumAge / 1000, \"s\\n \");\n element.querySelector('.debug-pos-timeout').innerHTML = \"\\n \".concat(lang('posTimeout'), \" : \").concat(options.timeout / 1000, \"s\\n \");\n element.querySelector('.debug-zoom-level').innerHTML = \"\\n \".concat(lang('zoom'), \" : \").concat(bc.map.getZoom(), \"\\n \");\n element.querySelector('.debug-marks-amount').innerHTML = \"\\n \".concat(lang('marks'), \" : \").concat(marks, \"\\n \");\n }\n }\n /* Point getter and setter */\n\n }, {\n key: \"getPoints\",\n value: function getPoints(type) {\n return new Promise(function (resolve) {\n Utils.getReq(\"http://localhost:8080/api/\".concat(type)).then(resolve);\n });\n }\n }, {\n key: \"getSpots\",\n value: function getSpots() {\n return new Promise(function (resolve) {\n Utils.getPoints('spot').then(resolve);\n });\n }\n }, {\n key: \"getShops\",\n value: function getShops() {\n return new Promise(function (resolve) {\n Utils.getPoints('shop').then(resolve);\n });\n }\n }, {\n key: \"getBars\",\n value: function getBars() {\n return new Promise(function (resolve) {\n Utils.getPoints('bar').then(resolve);\n });\n }\n /* Preference get set (DEPRECATED) */\n\n }, {\n key: \"getPreference\",\n value: function getPreference(pref) {\n return localStorage.getItem(pref) || null;\n }\n }, {\n key: \"setPreference\",\n value: function setPreference(pref, value) {\n localStorage.setItem(pref, value);\n }\n }, {\n key: \"RANGE_COLOR\",\n get: function get() {\n return '#ffd87d';\n }\n }, {\n key: \"USER_COLOR\",\n get: function get() {\n return '#63fff5';\n }\n }, {\n key: \"SPOT_COLOR\",\n get: function get() {\n return '#26ad23';\n }\n }, {\n key: \"SHOP_COLOR\",\n get: function get() {\n return '#247dc9';\n }\n }, {\n key: \"BAR_COLOR\",\n get: function get() {\n return '#ca2a3d';\n }\n }, {\n key: \"CIRCLE_RADIUS\",\n get: function get() {\n return 100;\n }\n }, {\n key: \"NEW_MARKER_RANGE\",\n get: function get() {\n return 200;\n }\n }, {\n key: \"MAP_BOUNDS\",\n get: function get() {\n return window.L.latLngBounds(window.L.latLng(-89.98155760646617, -180), window.L.latLng(89.99346179538875, 180));\n }\n }, {\n key: \"HIGH_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: true,\n // More consuption, better position\n maximumAge: 1000,\n // A position will last 1s maximum\n timeout: 900 // A position is updated in 0.9s maximum\n\n };\n }\n }, {\n key: \"OPTIMIZED_ACCURACY\",\n get: function get() {\n return {\n enableHighAccuracy: false,\n // Less consuption\n maximumAge: 30000,\n // A position will last 30s maximum\n timeout: 29000 // A position is updated in 29s maximum\n\n };\n }\n }, {\n key: \"SUPPORTED_LANGUAGE\",\n get: function get() {\n return ['en', 'fr', 'es', 'de'];\n }\n }]);\n\n return Utils;\n}();\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Utils);\n\n//# sourceURL=webpack://BeerCrackerz/./src/js/utils/Utils.js?"); - -/***/ }), - -/***/ "./src/BeerCrackerzAuth.scss": -/*!***********************************!*\ - !*** ./src/BeerCrackerzAuth.scss ***! - \***********************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.scss?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module can't be inlined because the eval devtool is used. -/******/ var __webpack_exports__ = __webpack_require__("./src/BeerCrackerzAuth.js"); -/******/ window.BeerCrackerz = __webpack_exports__["default"]; -/******/ -/******/ })() -; \ No newline at end of file +!function(){"use strict";var e={d:function(t,n){for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};function n(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:this._resolveAsJSON.bind(this);return new Promise((function(r,o){var i={method:"GET",headers:new Headers([t._headers[0]])};fetch(e,i).then(n).then(r).catch(o)}))}},{key:"getText",value:function(e){return this.get(e,this._resolveAsText.bind(this))}},{key:"getTemplate",value:function(e){return this.get(e,this._resolveAsDom.bind(this))}},{key:"post",value:function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._resolveAsJSON.bind(this);return new Promise((function(o,i){var a={method:"POST",headers:new Headers(n._headers),body:JSON.stringify(t)};fetch(e,a).then(r).then(o).catch(i)}))}},{key:"postText",value:function(e,t){return this.post(e,t,this._resolveAsText.bind(this))}},{key:"_getPoints",value:function(e){var t=this;return new Promise((function(n,r){t.get("http://localhost:8080/api/".concat(e)).then(n).catch(r)}))}},{key:"getSpots",value:function(){return this._getPoints("spot")}},{key:"getShops",value:function(){return this._getPoints("shop")}},{key:"getBars",value:function(){return this._getPoints("bar")}},{key:"_savePoint",value:function(e,t){var n=this;return new Promise((function(r,o){n.post("http://localhost:8080/api/".concat(e,"/"),t,null).then(r).catch(o)}))}},{key:"spotCreated",value:function(e){return this._savePoint("spot",e)}},{key:"shopCreated",value:function(e){return this._savePoint("shop",e)}},{key:"barCreated",value:function(e){return this._savePoint("bar",e)}}],r&&n(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),e}(),o=r;function i(e,t){for(var n=0;n : -"),r.innerHTML="".concat(e("lng")," : -"),o.innerHTML="".concat(e("updates")," : 0"),i.innerHTML="".concat(e("accuracy")," : -"),a.innerHTML="".concat(e("highAccuracy")," : -"),s.innerHTML="".concat(e("posAge")," : -"),c.innerHTML="".concat(e("posTimeout")," : -"),l.innerHTML="".concat(e("zoom")," : -"),u.innerHTML="".concat(e("marks")," : -"),d.innerHTML=e("export"),t.appendChild(n),t.appendChild(r),t.appendChild(o),t.appendChild(i),t.appendChild(a),t.appendChild(s),t.appendChild(c),t.appendChild(l),t.appendChild(u),t.appendChild(d),d.addEventListener("click",window.BeerCrackerz.downloadData.bind(window.BeerCrackerz)),t}},{key:"updateDebugInterface",value:function(t,n,r){if(!0===window.DEBUG){var o=window.BeerCrackerz,i=o.nls.debug.bind(o.nls),a=parseInt(t.querySelector(".debug-updates-amount").innerHTML.split(" : ")[1])+1,s=o.marks.spot.length+o.marks.shop.length+o.marks.bar.length;t.querySelector(".debug-user-lat").innerHTML="\n ".concat(i("lat")," : ").concat(n.lat,"\n "),t.querySelector(".debug-user-lng").innerHTML="\n ".concat(i("lng")," : ").concat(n.lng,"\n "),t.querySelector(".debug-updates-amount").innerHTML="\n ".concat(i("updates")," : ").concat(a,"\n "),t.querySelector(".debug-user-accuracy").innerHTML="\n ".concat(i("accuracy")," : ").concat(e.precisionRound(n.accuracy,2),"m\n "),t.querySelector(".debug-high-accuracy").innerHTML="\n ".concat(i("highAccuracy")," : ").concat(!0===r.enableHighAccuracy?i("enabled"):i("disabled"),"\n "),t.querySelector(".debug-pos-max-age").innerHTML="\n ".concat(i("posAge")," : ").concat(r.maximumAge/1e3,"s\n "),t.querySelector(".debug-pos-timeout").innerHTML="\n ".concat(i("posTimeout")," : ").concat(r.timeout/1e3,"s\n "),t.querySelector(".debug-zoom-level").innerHTML="\n ".concat(i("zoom")," : ").concat(o.map.getZoom(),"\n "),t.querySelector(".debug-marks-amount").innerHTML="\n ".concat(i("marks")," : ").concat(s,"\n ")}}},{key:"getPreference",value:function(e){return localStorage.getItem(e)||null}},{key:"setPreference",value:function(e,t){localStorage.setItem(e,t)}},{key:"RANGE_COLOR",get:function(){return"#ffd87d"}},{key:"USER_COLOR",get:function(){return"#63fff5"}},{key:"SPOT_COLOR",get:function(){return"#26ad23"}},{key:"SHOP_COLOR",get:function(){return"#247dc9"}},{key:"BAR_COLOR",get:function(){return"#ca2a3d"}},{key:"CIRCLE_RADIUS",get:function(){return 100}},{key:"NEW_MARKER_RANGE",get:function(){return 200}},{key:"MAP_BOUNDS",get:function(){return window.L.latLngBounds(window.L.latLng(-89.98155760646617,-180),window.L.latLng(89.99346179538875,180))}},{key:"HIGH_ACCURACY",get:function(){return{enableHighAccuracy:!0,maximumAge:1e3,timeout:900}}},{key:"OPTIMIZED_ACCURACY",get:function(){return{enableHighAccuracy:!1,maximumAge:3e4,timeout:29e3}}},{key:"SUPPORTED_LANGUAGE",get:function(){return["en","fr","es","de","pt"]}}],null&&i(t.prototype,null),n&&i(t,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();function s(e,t){for(var n=0;nOpenStreetMap',maxZoom:21,maxNativeZoom:19,minZoom:2}),satEsri:window.L.tileLayer("https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",{attribution:'© Esri Imagery',minZoom:2,maxNativeZoom:19,maxZoom:21})}),h=Object.freeze({blue:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-blue.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),gold:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-gold.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),red:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-red.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),green:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-green.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),orange:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-orange.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),yellow:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-yellow.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),violet:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-violet.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),grey:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-grey.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),black:new window.L.Icon({iconUrl:"/static/img/marker/marker-icon-black.png",shadowUrl:"/static/img/marker/marker-shadow.png",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],shadowSize:[41,41]}),user:new window.L.Icon({iconUrl:"/static/img/marker/user-position.png",shadowUrl:"/static/img/marker/user-position-shadow.png",iconSize:[32,32],iconAnchor:[16,16],popupAnchor:[1,-34],shadowSize:[32,32]})}),g=Object.freeze({spot:new window.L.MarkerClusterGroup({animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1,iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}}),shop:new window.L.MarkerClusterGroup({animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1,iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}}),bar:new window.L.MarkerClusterGroup({animateAddingMarkers:!0,disableClusteringAtZoom:18,spiderfyOnMaxZoom:!1,iconCreateFunction:function(e){return window.L.divIcon({className:"cluster-icon-wrapper",html:'\n \n '.concat(e.getChildCount(),"\n ")})}})});function _(e,t){for(var n=0;n".concat(e.nls.map("planLayerOSM"),"

    ")]=n,o["

    ".concat(e.nls.map("satLayerEsri"),"

    ")]=r,n.addTo(e._map),window.L.control.layers(o,{},{position:"bottomright"}).addTo(e._map),e._zoomSlider=new u(e._map),t()}))}},{key:"_initGeolocation",value:function(){var e=this;return new Promise((function(t){"geolocation"in navigator?(e._watchId=navigator.geolocation.watchPosition((function(t){e._user.lat=t.coords.latitude,e._user.lng=t.coords.longitude,e._user.accuracy=t.coords.accuracy,e._map&&e._drawUserMarker()}),null,a.HIGH_ACCURACY),t()):(e._notification.raise(e.nls.notif("geolocationError")),t())}))}},{key:"_initEvents",value:function(){var e=this;return new Promise((function(t){e._map.on("drag",(function(){e._map.panInsideBounds(a.MAP_BOUNDS,{animate:!0})})),e._map.on("zoomstart",(function(){e._isZooming=!0})),e._map.on("zoomend",(function(){e._isZooming=!1,e._map.getZoom()<15?(e._setMarkerLabels(e._marks.spot,!1),e._setMarkerLabels(e._marks.shop,!1),e._setMarkerLabels(e._marks.bar,!1)):(e._setMarkerLabels(e._marks.spot,!0),e._setMarkerLabels(e._marks.shop,!0),e._setMarkerLabels(e._marks.bar,!0))})),t()}))}},{key:"_initMarkers",value:function(){var e=this;return new Promise((function(t){e._clusters.spot=g.spot,e._clusters.shop=g.shop,e._clusters.bar=g.bar,e._map.addLayer(e._clusters.spot),e._map.addLayer(e._clusters.shop),e._map.addLayer(e._clusters.bar);var n=function(t){e._markPopupFactory(t).then((function(n){t.dom=n,t.marker=e._createMarker(t),e._marks[t.type].push(t),e._clusters[t.type].addLayer(t.marker)}))};e._kom.getSpots().then((function(e){for(var t=0;t Date: Sat, 17 Sep 2022 20:46:19 +0200 Subject: [PATCH 023/204] feat(front): clean provider enum --- front/doc/BeerCrackerz.html | 2 +- front/doc/BeerCrackerz.js.html | 2 +- front/doc/BeerCrackerzAuth.html | 40 +++++++++++++------------- front/doc/BeerCrackerzAuth.js.html | 13 +++------ front/doc/Kom.html | 2 +- front/doc/index.html | 2 +- front/doc/js_core_Kom.js.html | 2 +- front/doc/js_utils_Utils.js.html | 2 +- front/src/BeerCrackerzAuth.js | 11 ++----- front/src/js/utils/ProviderEnum.js | 20 +------------ static/dist/BeerCrackerzAuth.bundle.js | 2 +- static/nls/de.json | 5 ++-- static/nls/en.json | 5 ++-- static/nls/es.json | 5 ++-- static/nls/fr.json | 5 ++-- static/nls/pt.json | 5 ++-- 16 files changed, 45 insertions(+), 78 deletions(-) diff --git a/front/doc/BeerCrackerz.html b/front/doc/BeerCrackerz.html index ea35026..6fe0523 100644 --- a/front/doc/BeerCrackerz.html +++ b/front/doc/BeerCrackerz.html @@ -4757,7 +4757,7 @@

    Home

    Classes

    -
    +
    @@ -82,7 +82,7 @@

    {LOGIN_SUBTITLE}

    {LOGIN_NOT_REGISTERED} {LOGIN_REGISTER}

    {LOGIN_FORGOT_PASSWORD} {LOGIN_PASSWORD_RESET}

    -
    +
    Messe Basse Production

    2022 – GPL-3.0

    diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 89e9bfa..8b674d5 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -421,7 +421,7 @@ class BeerCrackerzAuth { _loadAside(type) { return new Promise((resolve, reject) => { this._kom.getTemplate(`/aside/${type}`).then(dom => { - document.body.className = ''; // Clear previous css class + //document.body.className = 'login dark-theme'; // Clear previous css class document.body.classList.add(type); // Update body class with current aside view // We need to get aside at the last moment because of nls that changed HTML content this._aside = document.getElementById('aside'); diff --git a/front/src/BeerCrackerzAuth.scss b/front/src/BeerCrackerzAuth.scss index 3e95c06..99d4813 100644 --- a/front/src/BeerCrackerzAuth.scss +++ b/front/src/BeerCrackerzAuth.scss @@ -145,7 +145,7 @@ aside { margin-top: 5rem; } - div { + main { margin: 0 4rem; text-align: left; diff --git a/static/dist/BeerCrackerzAuth.bundle.css b/static/dist/BeerCrackerzAuth.bundle.css index ad2a98c..c80b0b9 100644 --- a/static/dist/BeerCrackerzAuth.bundle.css +++ b/static/dist/BeerCrackerzAuth.bundle.css @@ -1,4 +1,4 @@ /*!**********************************************************************************************************************************************************************************************************************!*\ !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./node_modules/sass-loader/dist/cjs.js!./src/BeerCrackerzAuth.scss ***! \**********************************************************************************************************************************************************************************************************************/ -:root{--transition:.2s;--transition-x2:calc(var(--transition)*2);--color-primary:#ffa800;--color-primary-a9:rgba(255,168,0,.9);--color-primary-a75:rgba(255,168,0,.75);--color-primary-a5:rgba(255,168,0,.5);--color-primary-a25:rgba(255,168,0,.25);--color-primary-a1:rgba(255,168,0,.1);--color-secondary:#0057ff;--color-tertiary:#80abff;--font-size:1.375rem;--font-size-l1:1.45rem;--font-size-l2:1.6rem;--font-size-l3:1.9rem;--font-size-l4:2.4rem;--font-size-l5:2.8rem}body.dark-theme{--color-bg:#2e2e2e;--color-bg-a9:rgba(46,46,46,.9);--color-bg-a75:rgba(46,46,46,.75);--color-bg-a5:rgba(46,46,46,.5);--color-bg-a25:rgba(46,46,46,.25);--color-bg-a1:rgba(46,46,46,.1);--color-txt:#e2e2e2;--color-txt-a9:hsla(0,0%,89%,.9);--color-txt-a75:hsla(0,0%,89%,.75);--color-txt-a5:hsla(0,0%,89%,.5);--color-txt-a25:hsla(0,0%,89%,.25);--color-txt-a1:hsla(0,0%,89%,.1)}body.light-theme{--color-bg:#e2e2e2;--color-bg-a9:hsla(0,0%,89%,.9);--color-bg-a75:hsla(0,0%,89%,.75);--color-bg-a5:hsla(0,0%,89%,.5);--color-bg-a25:hsla(0,0%,89%,.25);--color-bg-a1:hsla(0,0%,89%,.1);--color-txt:#2e2e2e;--color-txt-a9:rgba(46,46,46,.9);--color-txt-a75:rgba(46,46,46,.75);--color-txt-a5:rgba(46,46,46,.5);--color-txt-a25:rgba(46,46,46,.25);--color-txt-a1:rgba(46,46,46,.1)}body.light-theme .edit img,body.light-theme .info-mark img,body.light-theme .item img,body.light-theme .item[data-type=circle] img,body.light-theme .item[data-type=label] img,body.light-theme .modifiers p img,body.light-theme .pricing img,body.light-theme .rating img,body.light-theme .types p img{-webkit-filter:invert(1);filter:invert(1)}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{font-family:sans-serif;font-size:1.4rem}h1{color:var(--color-txt);font-size:2.8rem;font-size:var(--font-size-l5);margin-bottom:1.375rem;margin-bottom:var(--font-size)}h2{font-size:2.4rem;font-size:var(--font-size-l4)}a{color:#ffa800;color:var(--color-primary)}a,label,p{font-size:1.375rem;font-size:var(--font-size);margin-bottom:1.375rem;margin-bottom:var(--font-size)}label,p{color:var(--color-txt)}label.error,p.error{color:#ffa800;color:var(--color-primary);font-weight:700}label{font-style:italic}input,textarea{background-color:transparent;border:1px solid var(--color-txt);border-radius:.5rem;color:var(--color-txt);display:block;margin:.5rem auto 1.375rem;margin-bottom:var(--font-size);padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{background-color:rgba(255,168,0,.5);background-color:var(--color-primary-a5)}button{background-color:transparent;border:1px solid var(--color-txt);border-radius:.5rem;color:var(--color-txt);cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s,color .2s;transition:background-color .2s,color .2s;width:100%}button.validate{background-color:rgba(255,168,0,.75);background-color:var(--color-primary-a75);border:1px solid var(--color-txt-a5);color:var(--color-bg)}button.cancel{border:1px solid #ffa800;border:1px solid var(--color-primary)}button:active,button:focus,button:hover{background-color:#ffa800;background-color:var(--color-primary);color:var(--color-bg)}:root{--aside-width:40rem;--aside-offset:0rem;--aside-transtion-duration:var(--transition-x2)}body{background:var(--color-bg);color:var(--color-txt);height:100%;position:relative;width:100%}nav{bottom:1rem;display:-webkit-box;display:-ms-flexbox;display:flex;height:4.8rem;position:absolute;right:41rem;right:calc(var(--aside-width) + var(--aside-offset) + 1rem);-webkit-transition:right .4s;transition:right .4s;-webkit-transition:right var(--aside-transtion-duration);transition:right var(--aside-transtion-duration);width:4.8rem;z-index:20}nav img{border-radius:50%;-webkit-box-shadow:0 0 1rem var(--color-bg);box-shadow:0 0 1rem var(--color-bg);cursor:pointer;width:100%}nav .cmd-bar,nav .cmd-bar .cmd-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}nav .cmd-bar .cmd-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg);background-clip:padding-box;border:2px solid var(--color-bg-a1);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a9);box-shadow:0 0 1rem var(--color-bg-a9);justify-content:center;padding:.2rem}nav .cmd-bar .cmd-wrapper img{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-transition:all .2s;transition:all .2s;-webkit-transition:all var(--transition);transition:all var(--transition)}nav .cmd-bar .cmd-wrapper img:active,nav .cmd-bar .cmd-wrapper img:focus,nav .cmd-bar .cmd-wrapper img:hover{border:1px solid #b9b9b9;border-radius:.5rem;-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);padding:.2rem}.page-header{background-color:var(--color-bg-a9);border:2px solid var(--color-bg);border-radius:.5rem;left:50%;margin:1rem;max-width:90%;opacity:0;padding:2.8rem;padding:var(--font-size-l5);position:absolute;text-align:center;top:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:opacity .4s;transition:opacity .4s;-webkit-transition:opacity var(--aside-transtion-duration);transition:opacity var(--aside-transtion-duration);width:40rem;z-index:20}.page-header.visible{opacity:1}main.beer-crakerz-map{height:100%;-webkit-transition:width .4s;transition:width .4s;-webkit-transition:width var(--aside-transtion-duration);transition:width var(--aside-transtion-duration);width:100%;z-index:10}main.beer-crakerz-map .leaflet-control-layers.leaflet-control{right:45.8rem;right:calc(var(--aside-width) + var(--aside-offset) + 5.8rem);-webkit-transition:right .4s;transition:right .4s;-webkit-transition:right var(--aside-transtion-duration);transition:right var(--aside-transtion-duration)}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:var(--color-bg-a9);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;justify-content:space-between;max-width:40rem;max-width:var(--aside-width);position:absolute;right:0;right:var(--aside-offset);text-align:center;top:0;-webkit-transition:all .4s;transition:all .4s;-webkit-transition:all var(--aside-transtion-duration);transition:all var(--aside-transtion-duration);width:100%;z-index:30}aside .aside-expander{cursor:pointer;-webkit-filter:drop-shadow(0 0 1px var(--color-bg));filter:drop-shadow(0 0 1px var(--color-bg));height:4.8rem;left:0;margin:0;position:absolute;top:0;-webkit-transition:left .2s;transition:left .2s;-webkit-transition:left var(--transition);transition:left var(--transition)}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside div{margin:0 4rem;text-align:left}aside div button{margin:2.9rem auto 1.375rem;margin:2.9rem auto var(--font-size)}aside div p{margin-bottom:.5rem;text-align:right}aside div p[class*=error]{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s;-webkit-transition:color var(--transition);transition:color var(--transition)}aside div p[class*=error].visible{color:#ffa800;color:var(--color-primary)}aside div p[class*=error].success{color:#a1ff86}aside footer{margin-bottom:5rem}.overlay{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg-a75);display:none;height:100%;justify-content:center;opacity:0;position:absolute;top:0;-webkit-transition:opacity .3s;transition:opacity .3s;width:100%;z-index:30}.overlay [class$=-modal]{background:var(--color-bg-a9);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a5);box-shadow:0 0 1rem var(--color-bg-a5);padding:2rem;position:relative;text-align:center}.overlay [class$=-modal] h1{margin-bottom:3rem}.overlay [class$=-modal] button{margin-top:3rem}.overlay [class$=-modal] .modal-close{color:var(--color-txt);cursor:pointer;font-size:2.2rem;font-weight:700;line-height:1.6rem;line-height:var(--font-size-l2);position:absolute;right:1rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.overlay [class$=-modal] .modal-close:active,.overlay [class$=-modal] .modal-close:focus,.overlay [class$=-modal] .modal-close:hover{color:#ffa800;color:var(--color-primary)}.overlay [class$=-modal] .button-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center}.overlay [class$=-modal] .button-wrapper button{margin-left:1rem;margin-right:1rem}.overlay .edit-mark-modal,.overlay .new-mark-modal{width:calc(100% - 2rem)}.overlay .edit-mark-modal h1,.overlay .edit-mark-modal p,.overlay .new-mark-modal h1,.overlay .new-mark-modal p{text-align:center}.overlay .edit-mark-modal .modifiers,.overlay .edit-mark-modal .types,.overlay .new-mark-modal .modifiers,.overlay .new-mark-modal .types{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;justify-content:center;margin:.5rem auto 1.375rem;margin:.5rem auto var(--font-size)}.overlay .edit-mark-modal .modifiers p,.overlay .edit-mark-modal .types p,.overlay .new-mark-modal .modifiers p,.overlay .new-mark-modal .types p{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;border:1px solid var(--color-txt);border-radius:.5rem;color:var(--color-txt);cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;justify-content:center;margin:.5rem;padding:.5rem 1rem;-webkit-transition:color .2s;transition:color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.overlay .edit-mark-modal .modifiers p.selected,.overlay .edit-mark-modal .types p.selected,.overlay .new-mark-modal .modifiers p.selected,.overlay .new-mark-modal .types p.selected{border-color:#ffa800;border-color:var(--color-primary);color:#ffa800;color:var(--color-primary)}.overlay .edit-mark-modal .modifiers p.selected img,.overlay .edit-mark-modal .types p.selected img,.overlay .new-mark-modal .modifiers p.selected img,.overlay .new-mark-modal .types p.selected img{-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%)}.overlay .edit-mark-modal .modifiers img,.overlay .edit-mark-modal .types img,.overlay .new-mark-modal .modifiers img,.overlay .new-mark-modal .types img{margin-right:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:2.4rem;width:var(--font-size-l4)}.overlay .edit-mark-modal .votes,.overlay .new-mark-modal .votes{display:grid;grid-template-columns:1fr 1fr}.overlay .edit-mark-modal .pricing,.overlay .edit-mark-modal .rating,.overlay .new-mark-modal .pricing,.overlay .new-mark-modal .rating{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.overlay .edit-mark-modal .pricing img,.overlay .edit-mark-modal .rating img,.overlay .new-mark-modal .pricing img,.overlay .new-mark-modal .rating img{cursor:pointer;height:2.4rem;height:var(--font-size-l4);margin:0 .25rem;width:2.4rem;width:var(--font-size-l4)}.overlay .edit-mark-modal .pricing img.active,.overlay .edit-mark-modal .rating img.active,.overlay .new-mark-modal .pricing img.active,.overlay .new-mark-modal .rating img.active{-webkit-filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%);filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%)}.overlay .edit-mark-modal .pricing img.active.selected,.overlay .edit-mark-modal .rating img.active.selected,.overlay .new-mark-modal .pricing img.active.selected,.overlay .new-mark-modal .rating img.active.selected{-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%)}.overlay .hide-show-modal .view-options-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.overlay .hide-show-modal .view-options-wrapper .view-options{border-right:1px solid var(--color-txt-a5);width:20rem}.overlay .hide-show-modal .view-options-wrapper .view-helper{margin-left:1rem;text-align:left;width:20rem}.overlay .hide-show-modal .view-options-wrapper .view-helper p:first-child{font-style:italic;margin-bottom:2.4rem;margin-bottom:var(--font-size-l4);text-align:center}.overlay .hide-show-modal .view-options-wrapper .view-helper p:last-child{text-indent:2.4rem;text-indent:var(--font-size-l4)}.overlay .hide-show-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:15rem}.overlay .hide-show-modal .item img{height:2.4rem;height:var(--font-size-l4);margin-right:2.4rem;margin-right:var(--font-size-l4)}.overlay .hide-show-modal .item label{margin-bottom:0;margin-right:2.4rem;margin-right:var(--font-size-l4)}.overlay .hide-show-modal .item input{margin:0;width:auto}.overlay .user-profile-modal .user-info{-webkit-box-pack:center;-ms-flex-pack:center;border-bottom:1px solid var(--color-txt-a25);display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin-bottom:2.4rem;margin-bottom:var(--font-size-l4);padding-bottom:2.4rem;padding-bottom:var(--font-size-l4);width:100%}.overlay .user-profile-modal .user-info .drop-user-pp{-webkit-box-shadow:0 0 3rem var(--color-txt-a1);box-shadow:0 0 3rem var(--color-txt-a1);cursor:pointer;height:12rem;margin-right:2rem;width:12rem}.overlay .user-profile-modal .user-info img{height:100%;width:100%}.overlay .user-profile-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:25rem}.overlay .user-profile-modal .item img{height:2rem;margin-right:2rem}.overlay .user-profile-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .user-profile-modal .item input{margin:0;width:auto}.overlay .user-profile-modal .update-pp-wrapper{border-radius:.5rem;padding:1rem}.overlay .user-profile-modal .update-pp-wrapper input{cursor:pointer}.overlay .user-profile-modal .update-pp-wrapper .update-pp-error{color:#ffa800;color:var(--color-primary);font-style:italic;margin-bottom:0}.overlay .update-pp-modal{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:calc(100% - 2rem);justify-content:center;position:absolute;width:calc(100% - 2rem);z-index:50}.overlay .update-pp-modal .wip-pp-wrapper{overflow:hidden;position:relative}.overlay .update-pp-modal .wip-pp-wrapper img{max-height:500px;max-width:500px;width:100%}.debug-container{background-color:var(--color-bg-a9);border-radius:.5rem;left:1rem;padding:1rem;position:absolute;top:1rem;z-index:20}.debug-container h1{font-size:1.9rem;font-size:var(--font-size-l3);margin-bottom:1.375rem;margin-bottom:var(--font-size);text-align:center}.debug-container p{-webkit-box-pack:justify;-ms-flex-pack:justify;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin-bottom:.2rem}.debug-container p b{margin-right:2rem}.debug-container button{margin-top:1.375rem;margin-top:var(--font-size)}.popup h1,.popup h2,.popup p{color:var(--color-txt);margin:0;text-align:center}.popup h1{font-size:2rem;margin-bottom:1.375rem;margin-bottom:var(--font-size)}.popup .rating{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;width:100%}.popup .rating img{height:1.375rem;height:var(--font-size)}.popup .rating img.active{-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%)}.popup .rating p{font-style:inherit;margin-left:.5rem}.popup p{font-style:italic}.popup h2{font-size:1.45rem;font-size:var(--font-size-l1);font-weight:inherit}.popup footer,.popup h2{margin-top:1.375rem;margin-top:var(--font-size)}.popup footer{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;position:relative}.popup footer img{cursor:pointer;height:2rem;margin-left:.5rem}.cluster-icon-wrapper{position:relative}.cluster-icon-wrapper .cluster-icon{-webkit-filter:drop-shadow(0 0 .25rem var(--color-bg));filter:drop-shadow(0 0 .25rem var(--color-bg));height:50px;line-height:50px;margin-left:-21px;margin-top:-13px;-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s;width:auto}.cluster-icon-wrapper .cluster-icon:active,.cluster-icon-wrapper .cluster-icon:focus,.cluster-icon-wrapper .cluster-icon:hover{-webkit-filter:drop-shadow(0 0 .33rem var(--color-txt));filter:drop-shadow(0 0 .33rem var(--color-txt));-webkit-transform:scale(1.066);transform:scale(1.066)}.cluster-icon-wrapper .cluster-label{background-color:var(--color-bg-a9);border:1px solid var(--color-bg);border-radius:.75rem;-webkit-box-shadow:0 0 1rem var(--color-bg);box-shadow:0 0 1rem var(--color-bg);color:var(--color-txt);font-size:1.1rem;font-weight:700;left:15px;padding:.1rem .4rem;position:absolute;top:-15px}.cluster-icon-wrapper .cluster-label:active,.cluster-icon-wrapper .cluster-label:focus,.cluster-icon-wrapper .cluster-label:hover{color:#ffa800;color:var(--color-primary)}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg);background-clip:padding-box;border:2px solid var(--color-bg-a1);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a9);box-shadow:0 0 1rem var(--color-bg-a9);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .4s,opacity .4s;transition:right .4s,opacity .4s;-webkit-transition:right var(--transition-x2),opacity var(--transition-x2);transition:right var(--transition-x2),opacity var(--transition-x2);width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:1rem}.zoom-slider p{cursor:pointer;font-size:1.9rem;font-size:var(--font-size-l3);font-weight:700;margin:.5rem 0;-webkit-transition:color .2s;transition:color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider p:active,.zoom-slider p:focus,.zoom-slider p:hover{color:#ffa800;color:var(--color-primary)}.zoom-slider .slider-wrapper{background-color:var(--color-txt);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg);box-shadow:0 0 1rem var(--color-bg);cursor:pointer;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:#ffa800;background-color:var(--color-primary);border-top:1px solid rgba(255,168,0,.5);border-top:1px solid var(--color-primary-a5);bottom:0;position:absolute;-webkit-transition:height .2s ease-in;transition:height .2s ease-in;width:100%}.leaflet-popup-content-wrapper,.leaflet-popup-tip-container .leaflet-popup-tip{background-color:var(--color-bg-a9)}.leaflet-container a.leaflet-popup-close-button:active,.leaflet-container a.leaflet-popup-close-button:focus,.leaflet-container a.leaflet-popup-close-button:hover{color:#ffa800;color:var(--color-primary)}.leaflet-control-layers.leaflet-control{background:var(--color-bg);background-clip:padding-box;border:2px solid var(--color-bg-a1);border-radius:.5rem;bottom:16.8rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a9);box-shadow:0 0 1rem var(--color-bg-a9);position:absolute;right:0}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important;width:16rem}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-control-scale{bottom:20px}.leaflet-control-scale-line{background-color:var(--color-bg-a75);border:2px solid var(--color-txt-a5);color:var(--color-txt)}.leaflet-control-attribution.leaflet-control{background-color:var(--color-bg-a75);bottom:0;color:var(--color-txt);left:0;position:fixed}.leaflet-control-attribution.leaflet-control a{color:var(--color-txt);-webkit-transition:color .2s;transition:color .2s}.leaflet-control-attribution.leaflet-control a:active,.leaflet-control-attribution.leaflet-control a:focus,.leaflet-control-attribution.leaflet-control a:hover{color:#ffa800;color:var(--color-primary)}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)}.marker-tooltip{background-color:var(--color-bg-a9);color:var(--color-txt);cursor:pointer;font-style:italic;pointer-events:auto;text-align:center;top:2rem}.marker-tooltip p{margin:0}.marker-tooltip .label-pricing{bottom:-2.4rem;left:-1.2rem;position:absolute;right:-1.2rem}.marker-tooltip .label-pricing img{-webkit-filter:invert(69%) sepia(10%) saturate(2908%) hue-rotate(72deg) brightness(107%) contrast(74%) drop-shadow(0 0 1px var(--color-txt));filter:invert(69%) sepia(10%) saturate(2908%) hue-rotate(72deg) brightness(107%) contrast(74%) drop-shadow(0 0 1px var(--color-txt));width:1.6rem;width:var(--font-size-l2)}.leaflet-control-layers.leaflet-control{bottom:0}.zoom-slider.opened{right:41rem;right:calc(var(--aside-width) + var(--aside-offset) + 1rem)}@media (max-width:520px){aside{max-width:inherit;width:100%}} +:root{--transition:.2s;--transition-x2:calc(var(--transition)*2);--color-primary:#ffa800;--color-primary-a9:rgba(255,168,0,.9);--color-primary-a75:rgba(255,168,0,.75);--color-primary-a5:rgba(255,168,0,.5);--color-primary-a25:rgba(255,168,0,.25);--color-primary-a1:rgba(255,168,0,.1);--color-secondary:#0057ff;--color-tertiary:#80abff;--font-size:1.375rem;--font-size-l1:1.45rem;--font-size-l2:1.6rem;--font-size-l3:1.9rem;--font-size-l4:2.4rem;--font-size-l5:2.8rem}body.dark-theme{--color-bg:#2e2e2e;--color-bg-a9:rgba(46,46,46,.9);--color-bg-a75:rgba(46,46,46,.75);--color-bg-a5:rgba(46,46,46,.5);--color-bg-a25:rgba(46,46,46,.25);--color-bg-a1:rgba(46,46,46,.1);--color-txt:#e2e2e2;--color-txt-a9:hsla(0,0%,89%,.9);--color-txt-a75:hsla(0,0%,89%,.75);--color-txt-a5:hsla(0,0%,89%,.5);--color-txt-a25:hsla(0,0%,89%,.25);--color-txt-a1:hsla(0,0%,89%,.1)}body.light-theme{--color-bg:#e2e2e2;--color-bg-a9:hsla(0,0%,89%,.9);--color-bg-a75:hsla(0,0%,89%,.75);--color-bg-a5:hsla(0,0%,89%,.5);--color-bg-a25:hsla(0,0%,89%,.25);--color-bg-a1:hsla(0,0%,89%,.1);--color-txt:#2e2e2e;--color-txt-a9:rgba(46,46,46,.9);--color-txt-a75:rgba(46,46,46,.75);--color-txt-a5:rgba(46,46,46,.5);--color-txt-a25:rgba(46,46,46,.25);--color-txt-a1:rgba(46,46,46,.1)}body.light-theme .edit img,body.light-theme .info-mark img,body.light-theme .item img,body.light-theme .item[data-type=circle] img,body.light-theme .item[data-type=label] img,body.light-theme .modifiers p img,body.light-theme .pricing img,body.light-theme .rating img,body.light-theme .types p img{-webkit-filter:invert(1);filter:invert(1)}*{-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0}body,html{font-size:62.5%;height:100%;overflow:hidden;width:100%}body{font-family:sans-serif;font-size:1.4rem}h1{color:var(--color-txt);font-size:2.8rem;font-size:var(--font-size-l5);margin-bottom:1.375rem;margin-bottom:var(--font-size)}h2{font-size:2.4rem;font-size:var(--font-size-l4)}a{color:#ffa800;color:var(--color-primary)}a,label,p{font-size:1.375rem;font-size:var(--font-size);margin-bottom:1.375rem;margin-bottom:var(--font-size)}label,p{color:var(--color-txt)}label.error,p.error{color:#ffa800;color:var(--color-primary);font-weight:700}label{font-style:italic}input,textarea{background-color:transparent;border:1px solid var(--color-txt);border-radius:.5rem;color:var(--color-txt);display:block;margin:.5rem auto 1.375rem;margin-bottom:var(--font-size);padding:.5rem;-webkit-transition:border .2s;transition:border .2s;width:100%}input.error{background-color:rgba(255,168,0,.5);background-color:var(--color-primary-a5)}button{background-color:transparent;border:1px solid var(--color-txt);border-radius:.5rem;color:var(--color-txt);cursor:pointer;display:block;margin:.5rem auto;padding:.5rem;-webkit-transition:background-color .2s,color .2s;transition:background-color .2s,color .2s;width:100%}button.validate{background-color:rgba(255,168,0,.75);background-color:var(--color-primary-a75);border:1px solid var(--color-txt-a5);color:var(--color-bg)}button.cancel{border:1px solid #ffa800;border:1px solid var(--color-primary)}button:active,button:focus,button:hover{background-color:#ffa800;background-color:var(--color-primary);color:var(--color-bg)}:root{--aside-width:40rem;--aside-offset:0rem;--aside-transtion-duration:var(--transition-x2)}body{background:var(--color-bg);color:var(--color-txt);height:100%;position:relative;width:100%}nav{bottom:1rem;display:-webkit-box;display:-ms-flexbox;display:flex;height:4.8rem;position:absolute;right:41rem;right:calc(var(--aside-width) + var(--aside-offset) + 1rem);-webkit-transition:right .4s;transition:right .4s;-webkit-transition:right var(--aside-transtion-duration);transition:right var(--aside-transtion-duration);width:4.8rem;z-index:20}nav img{border-radius:50%;-webkit-box-shadow:0 0 1rem var(--color-bg);box-shadow:0 0 1rem var(--color-bg);cursor:pointer;width:100%}nav .cmd-bar,nav .cmd-bar .cmd-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}nav .cmd-bar .cmd-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg);background-clip:padding-box;border:2px solid var(--color-bg-a1);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a9);box-shadow:0 0 1rem var(--color-bg-a9);justify-content:center;padding:.2rem}nav .cmd-bar .cmd-wrapper img{-webkit-box-shadow:inherit;box-shadow:inherit;-webkit-transition:all .2s;transition:all .2s;-webkit-transition:all var(--transition);transition:all var(--transition)}nav .cmd-bar .cmd-wrapper img:active,nav .cmd-bar .cmd-wrapper img:focus,nav .cmd-bar .cmd-wrapper img:hover{border:1px solid #b9b9b9;border-radius:.5rem;-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);padding:.2rem}.page-header{background-color:var(--color-bg-a9);border:2px solid var(--color-bg);border-radius:.5rem;left:50%;margin:1rem;max-width:90%;opacity:0;padding:2.8rem;padding:var(--font-size-l5);position:absolute;text-align:center;top:0;-webkit-transform:translateX(-50%);transform:translateX(-50%);-webkit-transition:opacity .4s;transition:opacity .4s;-webkit-transition:opacity var(--aside-transtion-duration);transition:opacity var(--aside-transtion-duration);width:40rem;z-index:20}.page-header.visible{opacity:1}main.beer-crakerz-map{height:100%;-webkit-transition:width .4s;transition:width .4s;-webkit-transition:width var(--aside-transtion-duration);transition:width var(--aside-transtion-duration);width:100%;z-index:10}main.beer-crakerz-map .leaflet-control-layers.leaflet-control{right:45.8rem;right:calc(var(--aside-width) + var(--aside-offset) + 5.8rem);-webkit-transition:right .4s;transition:right .4s;-webkit-transition:right var(--aside-transtion-duration);transition:right var(--aside-transtion-duration)}aside{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:justify;-ms-flex-pack:justify;background-color:var(--color-bg-a9);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:100%;justify-content:space-between;max-width:40rem;max-width:var(--aside-width);position:absolute;right:0;right:var(--aside-offset);text-align:center;top:0;-webkit-transition:all .4s;transition:all .4s;-webkit-transition:all var(--aside-transtion-duration);transition:all var(--aside-transtion-duration);width:100%;z-index:30}aside .aside-expander{cursor:pointer;-webkit-filter:drop-shadow(0 0 1px var(--color-bg));filter:drop-shadow(0 0 1px var(--color-bg));height:4.8rem;left:0;margin:0;position:absolute;top:0;-webkit-transition:left .2s;transition:left .2s;-webkit-transition:left var(--transition);transition:left var(--transition)}aside h1{margin-bottom:0}aside header{margin-top:5rem}aside main{margin:0 4rem;text-align:left}aside main button{margin:2.9rem auto 1.375rem;margin:2.9rem auto var(--font-size)}aside main p{margin-bottom:.5rem;text-align:right}aside main p[class*=error]{color:transparent;font-style:italic;font-weight:700;text-align:center;-webkit-transition:color .2s;transition:color .2s;-webkit-transition:color var(--transition);transition:color var(--transition)}aside main p[class*=error].visible{color:#ffa800;color:var(--color-primary)}aside main p[class*=error].success{color:#a1ff86}aside footer{margin-bottom:5rem}.overlay{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg-a75);display:none;height:100%;justify-content:center;opacity:0;position:absolute;top:0;-webkit-transition:opacity .3s;transition:opacity .3s;width:100%;z-index:30}.overlay [class$=-modal]{background:var(--color-bg-a9);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a5);box-shadow:0 0 1rem var(--color-bg-a5);padding:2rem;position:relative;text-align:center}.overlay [class$=-modal] h1{margin-bottom:3rem}.overlay [class$=-modal] button{margin-top:3rem}.overlay [class$=-modal] .modal-close{color:var(--color-txt);cursor:pointer;font-size:2.2rem;font-weight:700;line-height:1.6rem;line-height:var(--font-size-l2);position:absolute;right:1rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.overlay [class$=-modal] .modal-close:active,.overlay [class$=-modal] .modal-close:focus,.overlay [class$=-modal] .modal-close:hover{color:#ffa800;color:var(--color-primary)}.overlay [class$=-modal] .button-wrapper{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center}.overlay [class$=-modal] .button-wrapper button{margin-left:1rem;margin-right:1rem}.overlay .edit-mark-modal,.overlay .new-mark-modal{width:calc(100% - 2rem)}.overlay .edit-mark-modal h1,.overlay .edit-mark-modal p,.overlay .new-mark-modal h1,.overlay .new-mark-modal p{text-align:center}.overlay .edit-mark-modal .modifiers,.overlay .edit-mark-modal .types,.overlay .new-mark-modal .modifiers,.overlay .new-mark-modal .types{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;justify-content:center;margin:.5rem auto 1.375rem;margin:.5rem auto var(--font-size)}.overlay .edit-mark-modal .modifiers p,.overlay .edit-mark-modal .types p,.overlay .new-mark-modal .modifiers p,.overlay .new-mark-modal .types p{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;border:1px solid var(--color-txt);border-radius:.5rem;color:var(--color-txt);cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;justify-content:center;margin:.5rem;padding:.5rem 1rem;-webkit-transition:color .2s;transition:color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.overlay .edit-mark-modal .modifiers p.selected,.overlay .edit-mark-modal .types p.selected,.overlay .new-mark-modal .modifiers p.selected,.overlay .new-mark-modal .types p.selected{border-color:#ffa800;border-color:var(--color-primary);color:#ffa800;color:var(--color-primary)}.overlay .edit-mark-modal .modifiers p.selected img,.overlay .edit-mark-modal .types p.selected img,.overlay .new-mark-modal .modifiers p.selected img,.overlay .new-mark-modal .types p.selected img{-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%)}.overlay .edit-mark-modal .modifiers img,.overlay .edit-mark-modal .types img,.overlay .new-mark-modal .modifiers img,.overlay .new-mark-modal .types img{margin-right:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:2.4rem;width:var(--font-size-l4)}.overlay .edit-mark-modal .votes,.overlay .new-mark-modal .votes{display:grid;grid-template-columns:1fr 1fr}.overlay .edit-mark-modal .pricing,.overlay .edit-mark-modal .rating,.overlay .new-mark-modal .pricing,.overlay .new-mark-modal .rating{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.overlay .edit-mark-modal .pricing img,.overlay .edit-mark-modal .rating img,.overlay .new-mark-modal .pricing img,.overlay .new-mark-modal .rating img{cursor:pointer;height:2.4rem;height:var(--font-size-l4);margin:0 .25rem;width:2.4rem;width:var(--font-size-l4)}.overlay .edit-mark-modal .pricing img.active,.overlay .edit-mark-modal .rating img.active,.overlay .new-mark-modal .pricing img.active,.overlay .new-mark-modal .rating img.active{-webkit-filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%);filter:invert(53%) sepia(30%) saturate(1977%) hue-rotate(155deg) brightness(88%) contrast(102%)}.overlay .edit-mark-modal .pricing img.active.selected,.overlay .edit-mark-modal .rating img.active.selected,.overlay .new-mark-modal .pricing img.active.selected,.overlay .new-mark-modal .rating img.active.selected{-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%)}.overlay .hide-show-modal .view-options-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex}.overlay .hide-show-modal .view-options-wrapper .view-options{border-right:1px solid var(--color-txt-a5);width:20rem}.overlay .hide-show-modal .view-options-wrapper .view-helper{margin-left:1rem;text-align:left;width:20rem}.overlay .hide-show-modal .view-options-wrapper .view-helper p:first-child{font-style:italic;margin-bottom:2.4rem;margin-bottom:var(--font-size-l4);text-align:center}.overlay .hide-show-modal .view-options-wrapper .view-helper p:last-child{text-indent:2.4rem;text-indent:var(--font-size-l4)}.overlay .hide-show-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:15rem}.overlay .hide-show-modal .item img{height:2.4rem;height:var(--font-size-l4);margin-right:2.4rem;margin-right:var(--font-size-l4)}.overlay .hide-show-modal .item label{margin-bottom:0;margin-right:2.4rem;margin-right:var(--font-size-l4)}.overlay .hide-show-modal .item input{margin:0;width:auto}.overlay .user-profile-modal .user-info{-webkit-box-pack:center;-ms-flex-pack:center;border-bottom:1px solid var(--color-txt-a25);display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;margin-bottom:2.4rem;margin-bottom:var(--font-size-l4);padding-bottom:2.4rem;padding-bottom:var(--font-size-l4);width:100%}.overlay .user-profile-modal .user-info .drop-user-pp{-webkit-box-shadow:0 0 3rem var(--color-txt-a1);box-shadow:0 0 3rem var(--color-txt-a1);cursor:pointer;height:12rem;margin-right:2rem;width:12rem}.overlay .user-profile-modal .user-info img{height:100%;width:100%}.overlay .user-profile-modal .item{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin:1rem auto;max-width:25rem}.overlay .user-profile-modal .item img{height:2rem;margin-right:2rem}.overlay .user-profile-modal .item label{margin-bottom:0;margin-right:2rem}.overlay .user-profile-modal .item input{margin:0;width:auto}.overlay .user-profile-modal .update-pp-wrapper{border-radius:.5rem;padding:1rem}.overlay .user-profile-modal .update-pp-wrapper input{cursor:pointer}.overlay .user-profile-modal .update-pp-wrapper .update-pp-error{color:#ffa800;color:var(--color-primary);font-style:italic;margin-bottom:0}.overlay .update-pp-modal{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:calc(100% - 2rem);justify-content:center;position:absolute;width:calc(100% - 2rem);z-index:50}.overlay .update-pp-modal .wip-pp-wrapper{overflow:hidden;position:relative}.overlay .update-pp-modal .wip-pp-wrapper img{max-height:500px;max-width:500px;width:100%}.debug-container{background-color:var(--color-bg-a9);border-radius:.5rem;left:1rem;padding:1rem;position:absolute;top:1rem;z-index:20}.debug-container h1{font-size:1.9rem;font-size:var(--font-size-l3);margin-bottom:1.375rem;margin-bottom:var(--font-size);text-align:center}.debug-container p{-webkit-box-pack:justify;-ms-flex-pack:justify;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;margin-bottom:.2rem}.debug-container p b{margin-right:2rem}.debug-container button{margin-top:1.375rem;margin-top:var(--font-size)}.popup h1,.popup h2,.popup p{color:var(--color-txt);margin:0;text-align:center}.popup h1{font-size:2rem;margin-bottom:1.375rem;margin-bottom:var(--font-size)}.popup .rating{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:center;width:100%}.popup .rating img{height:1.375rem;height:var(--font-size)}.popup .rating img.active{-webkit-filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%);filter:invert(63%) sepia(54%) saturate(1053%) hue-rotate(359deg) brightness(100%) contrast(106%)}.popup .rating p{font-style:inherit;margin-left:.5rem}.popup p{font-style:italic}.popup h2{font-size:1.45rem;font-size:var(--font-size-l1);font-weight:inherit}.popup footer,.popup h2{margin-top:1.375rem;margin-top:var(--font-size)}.popup footer{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;justify-content:space-between;position:relative}.popup footer img{cursor:pointer;height:2rem;margin-left:.5rem}.cluster-icon-wrapper{position:relative}.cluster-icon-wrapper .cluster-icon{-webkit-filter:drop-shadow(0 0 .25rem var(--color-bg));filter:drop-shadow(0 0 .25rem var(--color-bg));height:50px;line-height:50px;margin-left:-21px;margin-top:-13px;-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s;width:auto}.cluster-icon-wrapper .cluster-icon:active,.cluster-icon-wrapper .cluster-icon:focus,.cluster-icon-wrapper .cluster-icon:hover{-webkit-filter:drop-shadow(0 0 .33rem var(--color-txt));filter:drop-shadow(0 0 .33rem var(--color-txt));-webkit-transform:scale(1.066);transform:scale(1.066)}.cluster-icon-wrapper .cluster-label{background-color:var(--color-bg-a9);border:1px solid var(--color-bg);border-radius:.75rem;-webkit-box-shadow:0 0 1rem var(--color-bg);box-shadow:0 0 1rem var(--color-bg);color:var(--color-txt);font-size:1.1rem;font-weight:700;left:15px;padding:.1rem .4rem;position:absolute;top:-15px}.cluster-icon-wrapper .cluster-label:active,.cluster-icon-wrapper .cluster-label:focus,.cluster-icon-wrapper .cluster-label:hover{color:#ffa800;color:var(--color-primary)}.zoom-slider{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-pack:center;-ms-flex-pack:center;align-items:center;background:var(--color-bg);background-clip:padding-box;border:2px solid var(--color-bg-a1);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a9);box-shadow:0 0 1rem var(--color-bg-a9);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:20rem;justify-content:center;opacity:0;position:absolute;right:-6rem;top:calc(50% - 10rem);-webkit-transition:right .4s,opacity .4s;transition:right .4s,opacity .4s;-webkit-transition:right var(--transition-x2),opacity var(--transition-x2);transition:right var(--transition-x2),opacity var(--transition-x2);width:4.8rem;z-index:20}.zoom-slider.opened{opacity:1;right:1rem}.zoom-slider p{cursor:pointer;font-size:1.9rem;font-size:var(--font-size-l3);font-weight:700;margin:.5rem 0;-webkit-transition:color .2s;transition:color .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.zoom-slider p:last-child{margin-bottom:0}.zoom-slider p:active,.zoom-slider p:focus,.zoom-slider p:hover{color:#ffa800;color:var(--color-primary)}.zoom-slider .slider-wrapper{background-color:var(--color-txt);border-radius:.5rem;-webkit-box-shadow:0 0 1rem var(--color-bg);box-shadow:0 0 1rem var(--color-bg);cursor:pointer;height:80%;overflow:hidden;position:relative;width:20%}.zoom-slider .slider-wrapper .slider-position{background-color:#ffa800;background-color:var(--color-primary);border-top:1px solid rgba(255,168,0,.5);border-top:1px solid var(--color-primary-a5);bottom:0;position:absolute;-webkit-transition:height .2s ease-in;transition:height .2s ease-in;width:100%}.leaflet-popup-content-wrapper,.leaflet-popup-tip-container .leaflet-popup-tip{background-color:var(--color-bg-a9)}.leaflet-container a.leaflet-popup-close-button:active,.leaflet-container a.leaflet-popup-close-button:focus,.leaflet-container a.leaflet-popup-close-button:hover{color:#ffa800;color:var(--color-primary)}.leaflet-control-layers.leaflet-control{background:var(--color-bg);background-clip:padding-box;border:2px solid var(--color-bg-a1);border-radius:.5rem;bottom:16.8rem;-webkit-box-shadow:0 0 1rem var(--color-bg-a9);box-shadow:0 0 1rem var(--color-bg-a9);position:absolute;right:0}.leaflet-control-layers.leaflet-control a{margin-bottom:0}.leaflet-control-layers-expanded{padding:2rem!important;width:16rem}.leaflet-control-layers-expanded label{margin:0}.leaflet-control-layers-expanded label div{-webkit-box-align:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-box-pack:justify;-ms-flex-pack:justify;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:row-reverse;flex-direction:row-reverse;justify-content:space-between}.leaflet-control-layers-expanded label div input{width:auto}.leaflet-control-layers-expanded label div input,.leaflet-control-layers-expanded label div p{margin:0}.leaflet-control-layers-expanded label div p{margin-right:1rem}.leaflet-control-scale{bottom:20px}.leaflet-control-scale-line{background-color:var(--color-bg-a75);border:2px solid var(--color-txt-a5);color:var(--color-txt)}.leaflet-control-attribution.leaflet-control{background-color:var(--color-bg-a75);bottom:0;color:var(--color-txt);left:0;position:fixed}.leaflet-control-attribution.leaflet-control a{color:var(--color-txt);-webkit-transition:color .2s;transition:color .2s}.leaflet-control-attribution.leaflet-control a:active,.leaflet-control-attribution.leaflet-control a:focus,.leaflet-control-attribution.leaflet-control a:hover{color:#ffa800;color:var(--color-primary)}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive{-webkit-filter:drop-shadow(0 0 .25rem #424242);filter:drop-shadow(0 0 .25rem #424242);-webkit-transition:-webkit-transform .2s,-webkit-filter .2s;transition:-webkit-transform .2s,-webkit-filter .2s;transition:transform .2s,filter .2s;transition:transform .2s,filter .2s,-webkit-transform .2s,-webkit-filter .2s}.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:active,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:focus,.leaflet-marker-icon.leaflet-zoom-animated.leaflet-interactive:hover{-webkit-filter:drop-shadow(0 0 .33rem #a8a8a8);filter:drop-shadow(0 0 .33rem #A8A8A8)}.marker-tooltip{background-color:var(--color-bg-a9);color:var(--color-txt);cursor:pointer;font-style:italic;pointer-events:auto;text-align:center;top:2rem}.marker-tooltip p{margin:0}.marker-tooltip .label-pricing{bottom:-2.4rem;left:-1.2rem;position:absolute;right:-1.2rem}.marker-tooltip .label-pricing img{-webkit-filter:invert(69%) sepia(10%) saturate(2908%) hue-rotate(72deg) brightness(107%) contrast(74%) drop-shadow(0 0 1px var(--color-txt));filter:invert(69%) sepia(10%) saturate(2908%) hue-rotate(72deg) brightness(107%) contrast(74%) drop-shadow(0 0 1px var(--color-txt));width:1.6rem;width:var(--font-size-l2)}.leaflet-control-layers.leaflet-control{bottom:0}.zoom-slider.opened{right:41rem;right:calc(var(--aside-width) + var(--aside-offset) + 1rem)}@media (max-width:520px){aside{max-width:inherit;width:100%}} diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index 1e9045a..36ec272 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n document.body.className = ''; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), From dda7066c7de445bdde8e1007009c846250168ba1 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Mon, 9 Jan 2023 21:44:06 +0100 Subject: [PATCH 096/204] fix: redirect after register with check your email notice --- front/src/BeerCrackerzAuth.js | 22 ++++++++++++++-------- static/dist/BeerCrackerzAuth.bundle.js | 2 +- static/nls/de.json | 3 ++- static/nls/en.json | 3 ++- static/nls/es.json | 3 ++- static/nls/fr.json | 3 ++- static/nls/pt.json | 3 ++- 7 files changed, 25 insertions(+), 14 deletions(-) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 8b674d5..dcd3c0f 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -445,8 +445,8 @@ class BeerCrackerzAuth { * The _loadLoginAside() method will load the login content into the aside * **/ - _loadLoginAside() { - this._loadAside('login').then(this._handleLoginAside.bind(this)).catch(err => { + _loadLoginAside(checkMail = false) { + this._loadAside('login').then(this._handleLoginAside.bind(this, checkMail)).catch(err => { err.msg = `Couldn't fetch or build the login aside`; this._fatalError(err); }); @@ -513,7 +513,7 @@ class BeerCrackerzAuth { * then it will handle its i18n, and all of its interactivity to submit login form to the server. * **/ - _handleLoginAside() { + _handleLoginAside(checkMail = false) { // Update page nls according to browser language document.title = this.nls.login('headTitle'); this.nls.handleLoginAside(document.getElementById('aside')); @@ -521,6 +521,12 @@ class BeerCrackerzAuth { const error = document.getElementById('login-error'); const username = document.getElementById('username'); const password = document.getElementById('password'); + + if (checkMail === true) { + error.classList.add('visible'); + error.innerHTML = this.nls.login('checkMail'); + } + // useful login method for field check and server response check const _frontFieldValidation = () => { error.className = 'error'; @@ -621,8 +627,8 @@ class BeerCrackerzAuth { return true; }; const _backValidation = (response) => { - // Check response and handle status codes - console.log(response); + // Redirect aside to login + this._loadLoginAside(true); }; const _submit = () => { // Reset error css classes @@ -637,7 +643,7 @@ class BeerCrackerzAuth { email: mail.value, password1: password1.value, password2: password2.value - }).then(_backValidation).catch(() => { + }).then(_backValidation).catch((a) => { error.classList.add('visible'); error.innerHTML = this.nls.register('serverError'); }); @@ -739,8 +745,8 @@ class BeerCrackerzAuth { return true; }; const _backValidation = (response) => { - // Check response and handle status codes - console.log(response); + // Redirect aside to login + this._loadLoginAside(true); }; const _submit = () => { // Reset error css classes diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index 36ec272..01689b7 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n this._loadAside('login').then(this._handleLoginAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this._loadAside('login').then(this._handleLoginAside.bind(this, checkMail))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n if (checkMail === true) {\n error.classList.add('visible');\n error.innerHTML = this.nls.login('checkMail');\n }\n\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this11._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function (a) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this13._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), diff --git a/static/nls/de.json b/static/nls/de.json index 12b40a9..7f48ec0 100644 --- a/static/nls/de.json +++ b/static/nls/de.json @@ -181,7 +181,8 @@ "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", "usernameEmpty": "Veuillez saisir un nom d'utilisateur", "passwordEmpty": "Veuillez saisir votre mot de passe", - "serverError": "Une erreur serveur est survenue, contactez le support" + "serverError": "Une erreur serveur est survenue, contactez le support", + "checkMail": "An email has been sent so you can proceed" }, "register": { "headTitle": "S'inscrire | BeerCrackerz", diff --git a/static/nls/en.json b/static/nls/en.json index 12b40a9..7f48ec0 100644 --- a/static/nls/en.json +++ b/static/nls/en.json @@ -181,7 +181,8 @@ "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", "usernameEmpty": "Veuillez saisir un nom d'utilisateur", "passwordEmpty": "Veuillez saisir votre mot de passe", - "serverError": "Une erreur serveur est survenue, contactez le support" + "serverError": "Une erreur serveur est survenue, contactez le support", + "checkMail": "An email has been sent so you can proceed" }, "register": { "headTitle": "S'inscrire | BeerCrackerz", diff --git a/static/nls/es.json b/static/nls/es.json index 12b40a9..7f48ec0 100644 --- a/static/nls/es.json +++ b/static/nls/es.json @@ -181,7 +181,8 @@ "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", "usernameEmpty": "Veuillez saisir un nom d'utilisateur", "passwordEmpty": "Veuillez saisir votre mot de passe", - "serverError": "Une erreur serveur est survenue, contactez le support" + "serverError": "Une erreur serveur est survenue, contactez le support", + "checkMail": "An email has been sent so you can proceed" }, "register": { "headTitle": "S'inscrire | BeerCrackerz", diff --git a/static/nls/fr.json b/static/nls/fr.json index 12b40a9..1c0a244 100644 --- a/static/nls/fr.json +++ b/static/nls/fr.json @@ -181,7 +181,8 @@ "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", "usernameEmpty": "Veuillez saisir un nom d'utilisateur", "passwordEmpty": "Veuillez saisir votre mot de passe", - "serverError": "Une erreur serveur est survenue, contactez le support" + "serverError": "Une erreur serveur est survenue, contactez le support", + "checkMail": "Consultez vos email avant de continuer" }, "register": { "headTitle": "S'inscrire | BeerCrackerz", diff --git a/static/nls/pt.json b/static/nls/pt.json index 12b40a9..7f48ec0 100644 --- a/static/nls/pt.json +++ b/static/nls/pt.json @@ -181,7 +181,8 @@ "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", "usernameEmpty": "Veuillez saisir un nom d'utilisateur", "passwordEmpty": "Veuillez saisir votre mot de passe", - "serverError": "Une erreur serveur est survenue, contactez le support" + "serverError": "Une erreur serveur est survenue, contactez le support", + "checkMail": "An email has been sent so you can proceed" }, "register": { "headTitle": "S'inscrire | BeerCrackerz", From 70da9459134d1649398990273c497d15f1db325c Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Mon, 9 Jan 2023 21:48:24 +0100 Subject: [PATCH 097/204] fix: proper message on reset password --- front/src/BeerCrackerzAuth.js | 9 +++++---- static/dist/BeerCrackerzAuth.bundle.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index dcd3c0f..32c2ffd 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -524,7 +524,7 @@ class BeerCrackerzAuth { if (checkMail === true) { error.classList.add('visible'); - error.innerHTML = this.nls.login('checkMail'); + error.innerHTML = this.nls.login('checkMail'); } // useful login method for field check and server response check @@ -694,7 +694,8 @@ class BeerCrackerzAuth { }; const _backValidation = (response) => { // Check response and handle status codes - console.log(response); + error.classList.add('visible'); + error.innerHTML = this.nls.login('checkMail'); }; const _submit = () => { // Reset error css classes @@ -703,7 +704,7 @@ class BeerCrackerzAuth { if (_frontFieldValidation()) { this._kom.post('/api/auth/password-reset-request/', { email: mail.value - }).then(_backValidation).catch(() => { + }, null).then(_backValidation).catch(() => { error.classList.add('visible'); error.innerHTML = this.nls.forgotPassword('serverError'); }); @@ -758,7 +759,7 @@ class BeerCrackerzAuth { this._kom.post(`/api/auth/password-reset/?uidb64=${params.uidb64}&token=${params.token}`, { password1: password1.value, password2: password2.value - }).then(_backValidation).catch(() => { + }, null).then(_backValidation).catch(() => { error.classList.add('visible'); error.innerHTML = this.nls.resetPassword('serverError'); }); diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index 01689b7..e3d75ca 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this._loadAside('login').then(this._handleLoginAside.bind(this, checkMail))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n if (checkMail === true) {\n error.classList.add('visible');\n error.innerHTML = this.nls.login('checkMail');\n }\n\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this11._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function (a) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this13._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this._loadAside('login').then(this._handleLoginAside.bind(this, checkMail))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n if (checkMail === true) {\n error.classList.add('visible');\n error.innerHTML = this.nls.login('checkMail');\n }\n\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this11._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function (a) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n error.classList.add('visible');\n error.innerHTML = _this12.nls.login('checkMail');\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }, null).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this13._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }, null).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), From e38d556febbc716d0d37496be5641b0c9cc4a617 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Mon, 9 Jan 2023 21:49:28 +0100 Subject: [PATCH 098/204] fix: remove unused parameters --- front/src/BeerCrackerzAuth.js | 8 ++++---- static/dist/BeerCrackerzAuth.bundle.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 32c2ffd..e672b38 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -626,7 +626,7 @@ class BeerCrackerzAuth { } return true; }; - const _backValidation = (response) => { + const _backValidation = () => { // Redirect aside to login this._loadLoginAside(true); }; @@ -692,7 +692,7 @@ class BeerCrackerzAuth { } return true; }; - const _backValidation = (response) => { + const _backValidation = () => { // Check response and handle status codes error.classList.add('visible'); error.innerHTML = this.nls.login('checkMail'); @@ -745,9 +745,9 @@ class BeerCrackerzAuth { } return true; }; - const _backValidation = (response) => { + const _backValidation = () => { // Redirect aside to login - this._loadLoginAside(true); + this._loadLoginAside(); }; const _submit = () => { // Reset error css classes diff --git a/static/dist/BeerCrackerzAuth.bundle.js b/static/dist/BeerCrackerzAuth.bundle.js index e3d75ca..78b8b0d 100644 --- a/static/dist/BeerCrackerzAuth.bundle.js +++ b/static/dist/BeerCrackerzAuth.bundle.js @@ -16,7 +16,7 @@ \*********************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this._loadAside('login').then(this._handleLoginAside.bind(this, checkMail))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n if (checkMail === true) {\n error.classList.add('visible');\n error.innerHTML = this.nls.login('checkMail');\n }\n\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this11._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function (a) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n error.classList.add('visible');\n error.innerHTML = _this12.nls.login('checkMail');\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }, null).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Redirect aside to login\n _this13._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }, null).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _BeerCrackerzAuth_scss__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BeerCrackerzAuth.scss */ \"./src/BeerCrackerzAuth.scss\");\n/* harmony import */ var _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./js/core/Kom.js */ \"./src/js/core/Kom.js\");\n/* harmony import */ var _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./js/core/LangManager.js */ \"./src/js/core/LangManager.js\");\n/* harmony import */ var _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./js/ui/VisuHelper.js */ \"./src/js/ui/VisuHelper.js\");\n/* harmony import */ var _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./js/ui/component/ZoomSlider.js */ \"./src/js/ui/component/ZoomSlider.js\");\n/* harmony import */ var _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./js/utils/Utils.js */ \"./src/js/utils/Utils.js\");\n/* harmony import */ var _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./js/utils/enums/AccuracyEnum.js */ \"./src/js/utils/enums/AccuracyEnum.js\");\n/* harmony import */ var _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./js/utils/enums/ClusterEnum.js */ \"./src/js/utils/enums/ClusterEnum.js\");\n/* harmony import */ var _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./js/utils/enums/ProviderEnum.js */ \"./src/js/utils/enums/ProviderEnum.js\");\n/* harmony import */ var _js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./js/utils/enums/MapEnum.js */ \"./src/js/utils/enums/MapEnum.js\");\n/* harmony import */ var _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./js/utils/enums/MarkerEnum.js */ \"./src/js/utils/enums/MarkerEnum.js\");\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }, _typeof(obj); }\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, \"prototype\", { writable: false }); return Constructor; }\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return _typeof(key) === \"symbol\" ? key : String(key); }\nfunction _toPrimitive(input, hint) { if (_typeof(input) !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (_typeof(res) !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\n\n\n\n\n\n\n\n\n\n\nvar BeerCrackerzAuth = /*#__PURE__*/function () {\n /**\n * @summary The BeerCrackerzAuth main component\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * This component handles all the authentication pages for BeerCrackerz. It provides the login, the\n * register and the forgot password process. It also provides a public map so unauthenticated user\n * can still browse the best BeerCrackerz spots. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *
    \n **/\n function BeerCrackerzAuth() {\n _classCallCheck(this, BeerCrackerzAuth);\n /**\n * The minimal user object holds position and accuracy\n * @type {Object}\n * @private\n **/\n this._user = {\n lat: 48.853121540141096,\n // Default lat to Paris Notre-Dame latitude\n lng: 2.3498955769881156,\n // Default lng to Paris Notre-Dame longitude\n accuracy: 0 // Accuracy in meter given by geolocation API\n };\n /**\n * The stored marks for spots, shops and bars\n * @type {Object}\n * @private\n **/\n this._marks = {\n spot: [],\n shop: [],\n bar: []\n };\n /**\n * The stored clusters for markers, see Leaflet.markercluster plugin\n * @type {Object}\n * @private\n **/\n this._clusters = {\n spot: {},\n shop: {},\n bar: {}\n };\n /**\n * The Aside DOM container\n * @type {Object}\n * @private\n **/\n this._aside = null;\n /**\n * The Aside expand status\n * @type {Boolean}\n * @private\n **/\n this._isAsideExpanded = true;\n /**\n * The server communication class\n * @type {Object}\n * @private\n **/\n this._kom = null;\n /**\n * The frontend i18n manager\n * @type {Object}\n * @private\n **/\n this._lang = new _js_core_LangManager_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]();\n this._init();\n }\n\n // ======================================================================== //\n // -------------------------- App initialization -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _init\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _init() method handle the whole app initialization sequence. It first\n * set the aside content to login (as it comes with the base welcome.html template),\n * then initialize the communication and notification handler, and will finally\n * initialize the whole map, markers and interactivity.\n *
    \n **/\n _createClass(BeerCrackerzAuth, [{\n key: \"_init\",\n value: function _init() {\n var _this = this;\n this.nls.updateLang(_js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].getPreference('selected-lang')).then(function () {\n // By default, the template contains the login aside, no need to fetch it\n _this._handleLoginAside();\n _this._kom = new _js_core_Kom_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]();\n // We ensure the Kom layer is valid and ready to go any further\n if (_this._kom.isValid === true) {\n var urlSearchParams = new URLSearchParams(window.location.search);\n var params = Object.fromEntries(urlSearchParams.entries());\n if (params.activate) {\n var error = document.getElementById('login-error');\n error.classList.add('visible');\n if (params.activate === 'True') {\n error.classList.add('success');\n error.innerHTML = _this.nls.register('activationSuccess');\n } else {\n error.innerHTML = _this.nls.register('activationError');\n }\n } else if (params.uidb64 && params.token) {\n _this._loadForgotPasswordAside(params);\n }\n _this._initMap().then(_this._initGeolocation.bind(_this)).then(_this._initMarkers.bind(_this)).then(_this._initEvents.bind(_this))[\"catch\"](_this._fatalError.bind(_this));\n } else {\n _this._fatalError({\n file: 'Kom.js',\n msg: _this._kom.csrf === null ? \"The CSRF token doesn't exists in cookies\" : \"The headers amount is invalid\"\n });\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMap\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initMap() method will create the Leaflet.js map with two base layers (plan/satellite),\n * add scale control, remove zoom control and set map bounds.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMap\",\n value: function _initMap() {\n var _this2 = this;\n return new Promise(function (resolve) {\n // Use main div to inject OSM into\n _this2._map = window.L.map('beer-crakerz-map', {\n zoomControl: false\n }).setView([48.853121540141096, 2.3498955769881156], 12);\n // Add meter and feet scale on map\n window.L.control.scale().addTo(_this2._map);\n // Place user marker on the map\n _this2._drawUserMarker();\n // Prevent panning outside of the world's edge\n _this2._map.setMaxBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds);\n // Add layer group to interface\n var baseMaps = {};\n baseMaps[\"

    \".concat(_this2.nls.map('planLayerOSM'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm;\n baseMaps[\"

    \".concat(_this2.nls.map('satLayerEsri'), \"

    \")] = _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].satEsri;\n // Append layer depending on user preference\n _js_utils_enums_ProviderEnum_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"].planOsm.addTo(_this2._map);\n // Add layer switch radio on bottom right of the map\n window.L.control.layers(baseMaps, {}, {\n position: 'bottomright'\n }).addTo(_this2._map);\n // Init zoom slider when map has been created\n _this2._zoomSlider = new _js_ui_component_ZoomSlider_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"](_this2._map);\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initGeolocation\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initGeolocation() method will request from browser the location authorization.\n * Once granted, an event listener is set on any position update, so it can update the\n * map state and the markers position. This method can be called again, only if the\n * geolocation watch has been cleared ; for example when updating the accuracy options.\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initGeolocation\",\n value: function _initGeolocation() {\n var _this3 = this;\n return new Promise(function (resolve) {\n if ('geolocation' in navigator) {\n _this3._watchId = navigator.geolocation.watchPosition(function (position) {\n // Update saved user position\n _this3._user.lat = position.coords.latitude;\n _this3._user.lng = position.coords.longitude;\n _this3._user.accuracy = position.coords.accuracy;\n // Only draw marker if map is already created\n if (_this3._map) {\n _this3._drawUserMarker();\n }\n }, null, _js_utils_enums_AccuracyEnum_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"].high);\n resolve();\n } else {\n resolve();\n }\n });\n }\n\n /**\n * @method\n * @async\n * @name _initMarkers\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will initialize all saved marker into the map.\n * Markers must be retrieved from server with a specific format to ensure it works\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initMarkers\",\n value: function _initMarkers() {\n var _this4 = this;\n return new Promise(function (resolve) {\n // Init map clusters for marks to be displayed (disable clustering at opened popup zoom level)\n _this4._clusters.spot = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].spot;\n _this4._clusters.shop = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].shop;\n _this4._clusters.bar = _js_utils_enums_ClusterEnum_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"].bar;\n _this4._map.addLayer(_this4._clusters.spot);\n _this4._map.addLayer(_this4._clusters.shop);\n _this4._map.addLayer(_this4._clusters.bar);\n var iterateMarkers = function iterateMarkers(mark) {\n _this4._markPopupFactory(mark).then(function (dom) {\n mark.dom = dom;\n mark.marker = _this4._createMarker(mark);\n _this4._marks[mark.type].push(mark);\n _this4._clusters[mark.type].addLayer(mark.marker);\n });\n };\n _this4._kom.getSpots().then(function (spots) {\n for (var i = 0; i < spots.length; ++i) {\n iterateMarkers(spots[i]);\n }\n });\n _this4._kom.getShops().then(function (shops) {\n for (var i = 0; i < shops.length; ++i) {\n iterateMarkers(shops[i]);\n }\n });\n _this4._kom.getBars().then(function (bars) {\n for (var i = 0; i < bars.length; ++i) {\n iterateMarkers(bars[i]);\n }\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @async\n * @name _initEvents\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _initEvents() method will listen to all required events to manipulate the map. Those events\n * are both for commands and for map events (click, drag, zoom and layer change).\n *
    \n * @returns {Promise} A Promise resolved when preferences are set\n **/\n }, {\n key: \"_initEvents\",\n value: function _initEvents() {\n var _this5 = this;\n return new Promise(function (resolve) {\n // Map is dragged by user mouse/finger\n _this5._map.on('drag', function () {\n // Constrain pan to the map bounds\n _this5._map.panInsideBounds(_js_utils_enums_MapEnum_js__WEBPACK_IMPORTED_MODULE_9__[\"default\"].mapBounds, {\n animate: true\n });\n });\n // Auto hide labels if zoom level is too high (and restore it when needed)\n _this5._map.on('zoomend', function () {\n if (_this5._map.getZoom() < 15) {\n _this5._setMarkerLabels(_this5._marks.spot, false);\n _this5._setMarkerLabels(_this5._marks.shop, false);\n _this5._setMarkerLabels(_this5._marks.bar, false);\n } else {\n _this5._setMarkerLabels(_this5._marks.spot, true);\n _this5._setMarkerLabels(_this5._marks.shop, true);\n _this5._setMarkerLabels(_this5._marks.bar, true);\n }\n });\n // Clustering events\n _this5._clusters.spot.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'spot'));\n _this5._clusters.shop.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'shop'));\n _this5._clusters.bar.on('animationend', _js_ui_VisuHelper_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"].checkClusteredMark.bind(_this5, 'bar'));\n // Center on command\n document.getElementById('center-on').addEventListener('click', function () {\n _this5._map.flyTo([_this5._user.lat, _this5._user.lng], 18);\n });\n resolve();\n });\n }\n\n /**\n * @method\n * @name _fatalError\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _fatalError() method will handle all fatal errors from which the app\n * can't recover. It redirects to the error page and send info through the referrer\n * so the error page can properly displays it to the user\n *
    \n * @param {Object} err - The error object with its info\n * @param {Number} [err.status] - The HTTP error code\n * @param {String} [err.url] - The URL that generated the HTTP error\n * @param {String} [err.file] - The file in which the fatal error happened\n * @param {String} [err.msg] - The custom error message\n **/\n }, {\n key: \"_fatalError\",\n value: function _fatalError(err) {\n if (window.DEBUG === false) {\n // In production, do the actual redirection\n // We add params to referrer then redirect to error page so the information can be displayed\n if (err && err.status) {\n // HTTP or related error\n window.history.pushState('', '', \"/welcome?&page=welcome&code=\".concat(err.status, \"&url=\").concat(err.url, \"&msg=\").concat(err.msg));\n } else if (err && err.file && err.msg) {\n // File or process error\n window.history.pushState('', '', \"/welcome?&page=welcome&file=\".concat(err.file, \"&msg=\").concat(err.msg));\n } else {\n // Generic error fallback\n window.history.pushState('', '', \"/welcome?&page=welcome&file=BeerCrackerzAuth.js&msg=An unknown error occured\");\n }\n // Now redirect the user to error page\n window.location.href = '/error';\n } else {\n console.error(err);\n }\n }\n\n // ======================================================================== //\n // -------------------------- Aside interactivity ------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _toggleAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _toggleAside() method will expand or collapse the aside, depending on the\n * `this._isAsideExpanded` flag state. To be used as a callba, adding useful parameters to url before redirectck on aside expander.\n *
    \n **/\n }, {\n key: \"_toggleAside\",\n value: function _toggleAside() {\n if (this._isAsideExpanded === true) {\n // Collapsing aside\n this._isAsideExpanded = false;\n document.documentElement.style.setProperty('--aside-offset', '-40rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/left.svg';\n document.getElementById('page-header').classList.add('visible');\n setTimeout(function () {\n return document.getElementById('aside-expander').style.left = '-5rem';\n }, 300);\n } else {\n // Expanding aside\n this._isAsideExpanded = true;\n document.documentElement.style.setProperty('--aside-offset', '0rem');\n document.getElementById('aside-expander-icon').src = '/static/img/logo/right.svg';\n document.getElementById('aside-expander').style.left = '0';\n document.getElementById('page-header').classList.remove('visible');\n }\n }\n\n /**\n * @method\n * @async\n * @name _loadAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadAside() method is a generic method to load an HTML template and replace\n * the aside DOM content with that template, aswell as updating the document's class.\n *
    \n * @param {String} type - The aside to load in login/register/forgot-password\n * @returns {Promise} A Promise resolved when template is loaded and in DOM\n **/\n }, {\n key: \"_loadAside\",\n value: function _loadAside(type) {\n var _this6 = this;\n return new Promise(function (resolve, reject) {\n _this6._kom.getTemplate(\"/aside/\".concat(type)).then(function (dom) {\n //document.body.className = 'login dark-theme'; // Clear previous css class\n document.body.classList.add(type); // Update body class with current aside view\n // We need to get aside at the last moment because of nls that changed HTML content\n _this6._aside = document.getElementById('aside');\n _this6._aside.innerHTML = ''; // Clear HTML content\n _this6._aside.appendChild(dom); // Replace with current aside dom\n resolve();\n })[\"catch\"](reject);\n });\n }\n\n /**\n * @method\n * @name _loadLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadLoginAside() method will load the login content into the aside\n *
    \n **/\n }, {\n key: \"_loadLoginAside\",\n value: function _loadLoginAside() {\n var _this7 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n this._loadAside('login').then(this._handleLoginAside.bind(this, checkMail))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the login aside\";\n _this7._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadRegisterAside() method will load the register content into the aside\n *
    \n **/\n }, {\n key: \"_loadRegisterAside\",\n value: function _loadRegisterAside() {\n var _this8 = this;\n this._loadAside('register').then(this._handleRegisterAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the register aside\";\n _this8._fatalError(err);\n });\n }\n\n /**\n * @method\n * @name _loadForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _loadForgotPasswordAside() method will load the forgot password content into the aside\n *
    \n **/\n }, {\n key: \"_loadForgotPasswordAside\",\n value: function _loadForgotPasswordAside(params) {\n var _this9 = this;\n if (params.uidb64 && params.token) {\n this._loadAside('resetpassword').then(this._handleResetPasswordAside.bind(this, params))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n } else {\n this._loadAside('forgotpassword').then(this._handleForgotPasswordAside.bind(this))[\"catch\"](function (err) {\n err.msg = \"Couldn't fetch or build the forgot password aside\";\n _this9._fatalError(err);\n });\n }\n }\n\n /**\n * @method\n * @name _handleLoginAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleLoginAside() method will replace the aside content with the login template,\n * then it will handle its i18n, and all of its interactivity to submit login form to the server.\n *
    \n **/\n }, {\n key: \"_handleLoginAside\",\n value: function _handleLoginAside() {\n var _this10 = this;\n var checkMail = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Update page nls according to browser language\n document.title = this.nls.login('headTitle');\n this.nls.handleLoginAside(document.getElementById('aside'));\n var error = document.getElementById('login-error');\n var username = document.getElementById('username');\n var password = document.getElementById('password');\n if (checkMail === true) {\n error.classList.add('visible');\n error.innerHTML = this.nls.login('checkMail');\n }\n\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n error.className = 'error';\n // Handling empty error cases\n if (username.value === '' && password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('bothEmpty');\n username.classList.add('error');\n password.classList.add('error');\n return false;\n } else if (username.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('usernameEmpty');\n username.classList.add('error');\n return false;\n } else if (password.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('passwordEmpty');\n password.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation(response) {\n // Check response and handle status codes\n console.log(response);\n // If all front and back tests are ok, redirect to auth\n // If the user manually force redirection to authindex,\n // the server should reject the request as the user is not authenticated\n window.location = '/';\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n password.classList.remove('error');\n if (_frontFieldValidation()) {\n _this10._kom.post('/api/auth/login/', {\n username: username.value,\n password: password.value\n }).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this10.nls.login('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('login-submit').addEventListener('click', _submit.bind(this), false);\n password.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('register-aside').addEventListener('click', this._loadRegisterAside.bind(this), false);\n document.getElementById('forgot-password').addEventListener('click', this._loadForgotPasswordAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleRegisterAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleRegisterAside() method will replace the aside content with the register template,\n * then it will handle its i18n, and all of its interactivity to submit register form to the server.\n *
    \n **/\n }, {\n key: \"_handleRegisterAside\",\n value: function _handleRegisterAside() {\n var _this11 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.register('headTitle');\n this.nls.handleRegisterAside(aside);\n var error = document.getElementById('register-error');\n var username = document.getElementById('username');\n var mail = document.getElementById('mail');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (username.value === '' || mail.value === '' || password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('fieldEmpty');\n if (username.value === '') {\n username.classList.add('error');\n }\n if (mail.value === '') {\n mail.classList.add('error');\n }\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation() {\n // Redirect aside to login\n _this11._loadLoginAside(true);\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n username.classList.remove('error');\n mail.classList.remove('error');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n _this11._kom.post('/api/auth/register/', {\n username: username.value,\n email: mail.value,\n password1: password1.value,\n password2: password2.value\n }).then(_backValidation)[\"catch\"](function (a) {\n error.classList.add('visible');\n error.innerHTML = _this11.nls.register('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('register-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n // Register event\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n /**\n * @method\n * @name _handleForgotPasswordAside\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _handleForgotPasswordAside() method will replace the aside content with the fogot password\n * template, then it will handle its i18n, and all of its interactivity to submit forgot password\n * form to the server.\n *
    \n **/\n }, {\n key: \"_handleForgotPasswordAside\",\n value: function _handleForgotPasswordAside() {\n var _this12 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.forgotPassword('headTitle');\n this.nls.handleForgotPasswordAside(aside);\n var error = document.getElementById('forgot-password-error');\n var mail = document.getElementById('mail');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (mail.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('fieldEmpty');\n if (mail.value === '') {\n mail.classList.add('error');\n }\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation() {\n // Check response and handle status codes\n error.classList.add('visible');\n error.innerHTML = _this12.nls.login('checkMail');\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n mail.classList.remove('error');\n if (_frontFieldValidation()) {\n _this12._kom.post('/api/auth/password-reset-request/', {\n email: mail.value\n }, null).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this12.nls.forgotPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('forgot-password-submit').addEventListener('click', _submit.bind(this), false);\n mail.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n }, {\n key: \"_handleResetPasswordAside\",\n value: function _handleResetPasswordAside(params) {\n var _this13 = this;\n // Update page nls according to browser language\n var aside = document.getElementById('aside');\n document.title = this.nls.resetPassword('headTitle');\n this.nls.handleResetPasswordAside(aside);\n var error = document.getElementById('reset-password-error');\n var password1 = document.getElementById('password1');\n var password2 = document.getElementById('password2');\n // useful login method for field check and server response check\n var _frontFieldValidation = function _frontFieldValidation() {\n // Handling empty error cases\n if (password1.value === '' || password2.value === '') {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('fieldEmpty');\n if (password1.value === '') {\n password1.classList.add('error');\n }\n if (password2.value === '') {\n password2.classList.add('error');\n }\n return false;\n } else if (password1.value !== password2.value) {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('notMatchingPassword');\n password1.classList.add('error');\n password2.classList.add('error');\n return false;\n }\n return true;\n };\n var _backValidation = function _backValidation() {\n // Redirect aside to login\n _this13._loadLoginAside();\n };\n var _submit = function _submit() {\n // Reset error css classes\n error.classList.remove('visible');\n password1.classList.remove('error');\n password2.classList.remove('error');\n if (_frontFieldValidation()) {\n console.log(params);\n _this13._kom.post(\"/api/auth/password-reset/?uidb64=\".concat(params.uidb64, \"&token=\").concat(params.token), {\n password1: password1.value,\n password2: password2.value\n }, null).then(_backValidation)[\"catch\"](function () {\n error.classList.add('visible');\n error.innerHTML = _this13.nls.resetPassword('serverError');\n });\n }\n };\n // Submit click event\n document.getElementById('reset-password-submit').addEventListener('click', _submit.bind(this), false);\n password2.addEventListener('keydown', function (e) {\n if (e.key === 'Enter') {\n _submit();\n }\n });\n document.getElementById('login-aside').addEventListener('click', this._loadLoginAside.bind(this), false);\n document.getElementById('aside-expander').addEventListener('click', this._toggleAside.bind(this), false);\n }\n\n // ======================================================================== //\n // -------------------------- Public map methods -------------------------- //\n // ======================================================================== //\n\n /**\n * @method\n * @name _drawUserMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _drawUserMarker() method will draw the user marker to the position received\n * from the geolocation API. If the marker doesn't exist yet, it will create it and\n * place it to its default position (see constructor/this._user).\n *
    \n **/\n }, {\n key: \"_drawUserMarker\",\n value: function _drawUserMarker() {\n if (!this.user.marker) {\n // Create user marker if not existing\n this.user.type = 'user';\n this.user.marker = this._createMarker(this.user);\n } else {\n // Update user marker position, range, and accuracy circle\n this.user.marker.setLatLng(this.user);\n }\n }\n\n /**\n * @method\n * @name _createMarker\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _createMarker() method will create all BeerCrackerz kind of markers (spot/shop/bar/user),\n * will create if needed its popup (if provided in options) and will make it interactive to click.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {HTMLElement} [options.dom] - The marker popup content\n * @returns {HTMLElement} The Leaflet marker extended with option properties\n **/\n }, {\n key: \"_createMarker\",\n value: function _createMarker(options) {\n var _this14 = this;\n var icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].black;\n if (options.type === 'spot') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].green;\n } else if (options.type === 'shop') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].blue;\n } else if (options.type === 'bar') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].red;\n } else if (options.type === 'user') {\n icon = _js_utils_enums_MarkerEnum_js__WEBPACK_IMPORTED_MODULE_10__[\"default\"].user;\n }\n var marker = window.L.marker([options.lat, options.lng], {\n icon: icon\n }).on('click', function () {\n // Actual fly to the marker\n _this14.map.flyTo([options.lat, options.lng], 18);\n });\n if (options.dom) {\n marker.bindPopup(options.dom);\n }\n // All markers that are not spot/shop/bar should be appended to the map\n if (['spot', 'shop', 'bar'].indexOf(options.type) === -1) {\n marker.addTo(this.map);\n }\n return marker;\n }\n\n /**\n * @method\n * @async\n * @name _markPopupFactory\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _markPopupFactory() method will create the associated popup DOM for a given mark. It will\n * fetch the popup template, replace its content with its i18n and provide its tooltip.\n *
    \n * @param {Object} options - The marker options\n * @param {String} options.type - The marker type in spot/shop/bar/user\n * @param {Float} options.lat - The marker latitude\n * @param {Float} options.lng - The marker longitude\n * @param {String} options.user - The user that discovered the marker\n * @param {String} options.description - The marker description\n * @param {Float} options.rate - The marker rate\n * @returns {Promise} A promise resolved with the popup DOM element\n **/\n }, {\n key: \"_markPopupFactory\",\n value: function _markPopupFactory(options) {\n var _this15 = this;\n return new Promise(function (resolve) {\n _this15._kom.getTemplate(\"/popup/\".concat(options.type)).then(function (dom) {\n var element = document.createElement('DIV');\n element.appendChild(dom);\n var user = options.user;\n var desc = _js_utils_Utils_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"].stripDom(options.description) || _this15.nls.popup(\"\".concat(options.type, \"NoDesc\"));\n var date = new Intl.DateTimeFormat(_this15.nls.fullLang, {\n dateStyle: 'long'\n }).format(new Date(options.creationDate));\n _this15.nls.markPopup(element, {\n type: options.type,\n name: options.name,\n user: user,\n rate: options.rate,\n desc: desc,\n date: date\n });\n // Fill mark rate (rating is in [0, 4] explaining the +1 in loop bound)\n var rate = element.querySelector(\"#\".concat(options.type, \"-rating\"));\n for (var i = 0; i < options.rate + 1; ++i) {\n rate.children[i].classList.add('active');\n }\n // Remove edition buttons if marker is not user's one, this does not replace a server test for edition...\n element.querySelector('#popup-social').parentNode.removeChild(element.querySelector('#popup-social'));\n element.querySelector('#popup-edit').parentNode.removeChild(element.querySelector('#popup-edit'));\n // Create label for new marker\n options.tooltip = window.L.tooltip({\n permanent: true,\n direction: 'center',\n className: 'marker-tooltip',\n interactive: true\n }).setContent(options.name).setLatLng(options); // Lat/Lng are embeded in options\n // Make tooltip visible if preference is to true\n options.tooltip.addTo(_this15.map);\n // Send back the popup\n resolve(element);\n });\n });\n }\n\n /**\n * @method\n * @name _setMarkerLabels\n * @private\n * @memberof BeerCrackerzAuth\n * @author Arthur Beaulieu\n * @since September 2022\n * @description\n *
    \n * The _setMarkerLabels() method will set the label visibility for an array of marks\n * depending on the `visible` argument value.\n *
    \n * @param {Object[]} marks - The array of marks to edit visibility from\n * @param {Boolean} visible - The labels visibility state to apply\n **/\n }, {\n key: \"_setMarkerLabels\",\n value: function _setMarkerLabels(marks, visible) {\n for (var i = 0; i < marks.length; ++i) {\n if (visible) {\n marks[i].tooltip.addTo(this.map);\n } else {\n marks[i].tooltip.removeFrom(this.map);\n }\n }\n }\n\n // ======================================================================== //\n // ---------------------------- Class accessors --------------------------- //\n // ======================================================================== //\n\n /**\n * @public\n * @property {Object} map\n * Leaflet.js map getter\n **/\n }, {\n key: \"map\",\n get: function get() {\n return this._map;\n }\n\n /**\n * @public\n * @property {Object} marks\n * Leaflet.js marks that holds spot/shop/bar marks as subkeys\n **/\n }, {\n key: \"marks\",\n get: function get() {\n return this._marks;\n }\n\n /**\n * @public\n * @property {Object} user\n * The session user object\n **/\n }, {\n key: \"user\",\n get: function get() {\n return this._user;\n }\n\n /**\n * @public\n * @property {Object} nls\n * The LangManager getter\n **/\n }, {\n key: \"nls\",\n get: function get() {\n return this._lang;\n }\n }]);\n return BeerCrackerzAuth;\n}();\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BeerCrackerzAuth);\n\n//# sourceURL=webpack://BeerCrackerz/./src/BeerCrackerzAuth.js?"); /***/ }), From bdf7704dd9a5c4ec4fa6063c50ed7538360ca0c7 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Tue, 10 Jan 2023 22:29:16 +0100 Subject: [PATCH 099/204] fix(back): set modifiers to required false --- back/api/serializers/bar/bar.py | 12 +++++++++--- back/api/serializers/shop/shop.py | 12 +++++++++--- back/api/serializers/spot/spot.py | 12 +++++++++--- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/back/api/serializers/bar/bar.py b/back/api/serializers/bar/bar.py index 62e1bf2..7e46666 100644 --- a/back/api/serializers/bar/bar.py +++ b/back/api/serializers/bar/bar.py @@ -4,13 +4,13 @@ class BarSerializer(serializers.ModelSerializer): - modifiers = serializers.MultipleChoiceField(choices=Bar.Modifiers.choices) types = serializers.MultipleChoiceField(choices=Bar.Types.choices) + modifiers = serializers.MultipleChoiceField(choices=Bar.Modifiers.choices, required=False) price = serializers.IntegerField(min_value=1, max_value=3) # Read only fields type = serializers.CharField(default='bar', read_only=True) - rate = serializers.SerializerMethodField() + rate = serializers.SerializerMethodField() # TODO : Set required user = serializers.CharField(source='user.username', read_only=True) userId = serializers.IntegerField(source='user.id', read_only=True) creationDate = serializers.DateField(source='creation_date', read_only=True) @@ -18,7 +18,7 @@ class BarSerializer(serializers.ModelSerializer): class Meta: model = Bar fields = ( - 'id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'price', 'modifiers', 'types', 'user', 'userId', + 'id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'price', 'types', 'modifiers', 'user', 'userId', 'creationDate') def create(self, validated_data): @@ -29,3 +29,9 @@ def create(self, validated_data): def get_rate(self, obj): # Call to Rate table return 0.0 + + def validate_types(self, value): + if len(value) == 0: + raise serializers.ValidationError('TYPE_EMPTY') + + return value diff --git a/back/api/serializers/shop/shop.py b/back/api/serializers/shop/shop.py index c03e789..923e091 100644 --- a/back/api/serializers/shop/shop.py +++ b/back/api/serializers/shop/shop.py @@ -4,13 +4,13 @@ class ShopSerializer(serializers.ModelSerializer): - modifiers = serializers.MultipleChoiceField(choices=Shop.Modifiers.choices) types = serializers.MultipleChoiceField(choices=Shop.Types.choices) + modifiers = serializers.MultipleChoiceField(choices=Shop.Modifiers.choices, required=False) price = serializers.IntegerField(min_value=1, max_value=3) # Read only fields type = serializers.CharField(default='shop', read_only=True) - rate = serializers.SerializerMethodField() + rate = serializers.SerializerMethodField() # TODO : Set required user = serializers.CharField(source='user.username', read_only=True) userId = serializers.IntegerField(source='user.id', read_only=True) creationDate = serializers.DateField(source='creation_date', read_only=True) @@ -18,7 +18,7 @@ class ShopSerializer(serializers.ModelSerializer): class Meta: model = Shop fields = ( - 'id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'price', 'modifiers', 'types', 'user', 'userId', + 'id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'price', 'types', 'modifiers', 'user', 'userId', 'creationDate') def create(self, validated_data): @@ -29,3 +29,9 @@ def create(self, validated_data): def get_rate(self, obj): # Call to Rate table return 0.0 + + def validate_types(self, value): + if len(value) == 0: + raise serializers.ValidationError('TYPE_EMPTY') + + return value diff --git a/back/api/serializers/spot/spot.py b/back/api/serializers/spot/spot.py index f566511..d0eb5c9 100644 --- a/back/api/serializers/spot/spot.py +++ b/back/api/serializers/spot/spot.py @@ -4,12 +4,12 @@ class SpotSerializer(serializers.ModelSerializer): - modifiers = serializers.MultipleChoiceField(choices=Spot.Modifiers.choices) types = serializers.MultipleChoiceField(choices=Spot.Types.choices) + modifiers = serializers.MultipleChoiceField(choices=Spot.Modifiers.choices, required=False) # Read only fields type = serializers.CharField(default='spot', read_only=True) - rate = serializers.SerializerMethodField() + rate = serializers.SerializerMethodField() # TODO : Set required user = serializers.CharField(source='user.username', read_only=True) userId = serializers.IntegerField(source='user.id', read_only=True) creationDate = serializers.DateField(source='creation_date', read_only=True) @@ -17,7 +17,7 @@ class SpotSerializer(serializers.ModelSerializer): class Meta: model = Spot fields = ( - 'id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'modifiers', 'types', 'user', 'userId', + 'id', 'type', 'name', 'description', 'lng', 'lat', 'rate', 'types', 'modifiers', 'user', 'userId', 'creationDate') def create(self, validated_data): @@ -28,3 +28,9 @@ def create(self, validated_data): def get_rate(self, obj): # Call to Rate table return 0.0 + + def validate_types(self, value): + if len(value) == 0: + raise serializers.ValidationError('TYPE_EMPTY') + + return value From d9f7e3ce3d0a5555e349cb7f40a26a9190fee2a9 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Tue, 10 Jan 2023 22:32:03 +0100 Subject: [PATCH 100/204] chore(back): set price enum start to 0 --- back/api/serializers/bar/bar.py | 2 +- back/api/serializers/shop/shop.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/back/api/serializers/bar/bar.py b/back/api/serializers/bar/bar.py index 7e46666..4fc7ddd 100644 --- a/back/api/serializers/bar/bar.py +++ b/back/api/serializers/bar/bar.py @@ -6,7 +6,7 @@ class BarSerializer(serializers.ModelSerializer): types = serializers.MultipleChoiceField(choices=Bar.Types.choices) modifiers = serializers.MultipleChoiceField(choices=Bar.Modifiers.choices, required=False) - price = serializers.IntegerField(min_value=1, max_value=3) + price = serializers.IntegerField(min_value=0, max_value=2) # Read only fields type = serializers.CharField(default='bar', read_only=True) diff --git a/back/api/serializers/shop/shop.py b/back/api/serializers/shop/shop.py index 923e091..395319d 100644 --- a/back/api/serializers/shop/shop.py +++ b/back/api/serializers/shop/shop.py @@ -6,7 +6,7 @@ class ShopSerializer(serializers.ModelSerializer): types = serializers.MultipleChoiceField(choices=Shop.Types.choices) modifiers = serializers.MultipleChoiceField(choices=Shop.Modifiers.choices, required=False) - price = serializers.IntegerField(min_value=1, max_value=3) + price = serializers.IntegerField(min_value=0, max_value=2) # Read only fields type = serializers.CharField(default='shop', read_only=True) From bdcf645cc9dec62c0ae2ef431f7dabb9d542b79d Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Tue, 10 Jan 2023 22:40:41 +0100 Subject: [PATCH 101/204] chore(back): add isStaff property in user serializer --- back/api/serializers/user/user.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/back/api/serializers/user/user.py b/back/api/serializers/user/user.py index 22d09ae..a5fcf2e 100644 --- a/back/api/serializers/user/user.py +++ b/back/api/serializers/user/user.py @@ -4,8 +4,9 @@ class UserSerializer(serializers.ModelSerializer): isActive = serializers.BooleanField(source='is_active') + isStaff = serializers.BooleanField(source='is_staff') profilePicture = serializers.ImageField(source='profile_picture') class Meta: model = get_user_model() - fields = ('id', 'username', 'email', 'isActive', 'profilePicture') + fields = ('id', 'username', 'email', 'isActive', 'isStaff', 'profilePicture') From 98237197cfb11bb194c0ee7295709498cdc528bf Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Tue, 10 Jan 2023 23:04:21 +0100 Subject: [PATCH 102/204] chore: add backupdb command --- back/app/management/commands/backupdb.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 back/app/management/commands/backupdb.py diff --git a/back/app/management/commands/backupdb.py b/back/app/management/commands/backupdb.py new file mode 100644 index 0000000..3badd0b --- /dev/null +++ b/back/app/management/commands/backupdb.py @@ -0,0 +1,17 @@ +import io + +from django.core.management import call_command +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + def handle(self, *args, **kwargs): + backup = io.StringIO() + call_command('dumpdata', + all=True, + format='json', + natural_foreign=True, + natural_primary=True, + stdout=backup) + + self.stdout.write(backup.getvalue()) From dc07f1b802b5bd9a2d29afac845c57b8d0ae5ffc Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Wed, 11 Jan 2023 21:25:02 +0100 Subject: [PATCH 103/204] fix: miscelaneous issues, wip for full convergence --- back/app/templates/popup/bar.html | 2 ++ back/app/templates/popup/shop.html | 2 ++ back/app/templates/popup/spot.html | 2 ++ front/src/BeerCrackerz.js | 2 +- front/src/BeerCrackerzAuth.js | 3 +- front/src/js/core/LangManager.js | 4 +-- front/src/js/ui/MarkPopup.js | 30 ++++++++++++++++- front/src/js/ui/VisuHelper.js | 2 +- front/src/js/ui/modal/MarkModal.js | 8 ++++- front/src/js/utils/enums/MapEnum.js | 2 +- front/src/scss/utils/_overlay.scss | 45 +++++++++++++++++++++++++ static/dist/BeerCrackerz.bundle.css | 2 +- static/dist/BeerCrackerz.bundle.js | 12 +++---- static/dist/BeerCrackerzAuth.bundle.css | 2 +- static/dist/BeerCrackerzAuth.bundle.js | 8 ++--- 15 files changed, 106 insertions(+), 20 deletions(-) diff --git a/back/app/templates/popup/bar.html b/back/app/templates/popup/bar.html index 5a3586c..b854411 100644 --- a/back/app/templates/popup/bar.html +++ b/back/app/templates/popup/bar.html @@ -11,7 +11,9 @@

    {BAR_NAME}

    rating-star

    ({BAR_RATE}/5)

    +

    {BAR_DESC}

    +
    +

    {SHOP_DESC}

    +
    +

    {SPOT_DESC}

    +
    diff --git a/back/app/templates/welcome.html b/back/app/templates/welcome.html index 85e1d48..41bbda9 100644 --- a/back/app/templates/welcome.html +++ b/back/app/templates/welcome.html @@ -46,10 +46,6 @@ -
    diff --git a/back/app/templates/popup/shop.html b/back/app/templates/popup/shop.html index fc7df14..cc5cdda 100644 --- a/back/app/templates/popup/shop.html +++ b/back/app/templates/popup/shop.html @@ -23,5 +23,6 @@

    {SHOP_DESC}

    edit-mark delete-mark + center-on
    diff --git a/back/app/templates/popup/spot.html b/back/app/templates/popup/spot.html index 585dc83..7cfd8ab 100644 --- a/back/app/templates/popup/spot.html +++ b/back/app/templates/popup/spot.html @@ -23,5 +23,6 @@

    {SPOT_DESC}

    edit-mark delete-mark + center-on
    diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index 6ce1840..5e9a4bd 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -150,11 +150,14 @@ class MarkPopup { window.Evts.publish('deleteMark', this._opts); }, this)); } - - this._evtIds.push(window.Evts.addEvent('click', this._opts.tooltip.getElement(), e => { + this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#center-on'), e => { e.preventDefault(); e.stopPropagation(); - window.Evts.publish('centerOn', this._opts); + window.Evts.publish('centerOn', { + lat: this._opts.lat, + lng: this._opts.lng, + zoom: 19 + }); }, this)); resolve(); diff --git a/front/src/js/ui/VisuHelper.js b/front/src/js/ui/VisuHelper.js index c8d6b3c..71ac025 100644 --- a/front/src/js/ui/VisuHelper.js +++ b/front/src/js/ui/VisuHelper.js @@ -388,7 +388,11 @@ class VisuHelper { VisuHelper.toggleFocusLock(); } // Actual fly to the marker - window.BeerCrackerz.map.flyTo([options.lat, options.lng], window.BeerCrackerz.map.getZoom()); + let zoom = options.zoom; + if (!options.zoom) { + zoom = window.BeerCrackerz.map.getZoom(); + } + window.BeerCrackerz.map.flyTo([options.lat, options.lng], zoom); } From dc2fc14fd6b806cc841f893dde880277071e7d52 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 1 Apr 2023 13:42:43 +0200 Subject: [PATCH 185/204] fix: admin edit all spots ui --- front/src/js/ui/MarkPopup.js | 6 ++++-- front/src/scss/utils/_overlay.scss | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index 5e9a4bd..8b8eb7d 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -95,8 +95,10 @@ class MarkPopup { this._popup.querySelector('#popup-social').parentNode.removeChild(this._popup.querySelector('#popup-social')); } // Remove edition buttons if marker is not user's one, this does not replace a server test for edition... - if (user !== window.BeerCrackerz.user.username || !window.BeerCrackerz.user.isStaff) { - this._popup.querySelector('#popup-edit').parentNode.removeChild(this._popup.querySelector('#popup-edit')); + if (user !== window.BeerCrackerz.user.username) { + if (!window.BeerCrackerz.user.isStaff) { + this._popup.querySelector('#popup-edit').parentNode.removeChild(this._popup.querySelector('#popup-edit')); + } } // Append circle around marker this._opts.color = ColorEnum[this._opts.type]; diff --git a/front/src/scss/utils/_overlay.scss b/front/src/scss/utils/_overlay.scss index 4d7b3e7..b262b28 100644 --- a/front/src/scss/utils/_overlay.scss +++ b/front/src/scss/utils/_overlay.scss @@ -18,6 +18,7 @@ box-shadow: 0 0 1rem var(--color-bg-a5); max-height: calc(100% - 2rem); max-width: calc(100% - 2rem); + overflow-y: auto; padding: 2rem; position: relative; text-align: center; @@ -33,9 +34,9 @@ .modal-close { color: var(--color-txt); cursor: pointer; - font-size: 2.2rem; + font-size: 2.6rem; font-weight: bold; - line-height: var(--font-size-l2); /* Because the cross symbol doesn't fit font height */ + line-height: var(--font-size-l3); /* Because the cross symbol doesn't fit font height */ right: 1rem; position: absolute; top: 1rem; From bc1e3689d9c5ee90e1955339c82b699924ac0bc8 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 1 Apr 2023 13:44:18 +0200 Subject: [PATCH 186/204] fix: circle bug toggling markers --- front/src/js/ui/VisuHelper.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/front/src/js/ui/VisuHelper.js b/front/src/js/ui/VisuHelper.js index 71ac025..bcfe976 100644 --- a/front/src/js/ui/VisuHelper.js +++ b/front/src/js/ui/VisuHelper.js @@ -295,19 +295,11 @@ class VisuHelper { if (visible === true) { for (let i = 0; i < window.BeerCrackerz.marks[type].length; ++i) { window.BeerCrackerz.marks[type][i].visible = true; - window.BeerCrackerz.marks[type][i].circle.setStyle({ - opacity: 1, - fillOpacity: 0.1 - }); } window.BeerCrackerz.map.addLayer(window.BeerCrackerz.clusters[type]); } else { for (let i = 0; i < window.BeerCrackerz.marks[type].length; ++i) { window.BeerCrackerz.marks[type][i].visible = false; - window.BeerCrackerz.marks[type][i].circle.setStyle({ - opacity: 0, - fillOpacity: 0 - }); } window.BeerCrackerz.map.removeLayer(window.BeerCrackerz.clusters[type]); } From 08258ae8052f3b9daa8132b94558375f2a085664 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 1 Apr 2023 13:50:31 +0200 Subject: [PATCH 187/204] fix: edit save from admin --- front/src/js/ui/MarkPopup.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index 8b8eb7d..3b2f25a 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -144,13 +144,15 @@ class MarkPopup { // Fire global event on buttons return new Promise(resolve => { if (this._opts.user === window.BeerCrackerz.user.username) { - this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#edit-mark'), () => { - window.Evts.publish('editMark', this._opts); - }, this)); - - this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#delete-mark'), () => { - window.Evts.publish('deleteMark', this._opts); - }, this)); + if (!window.BeerCrackerz.user.isStaff) { + this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#edit-mark'), () => { + window.Evts.publish('editMark', this._opts); + }, this)); + + this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#delete-mark'), () => { + window.Evts.publish('deleteMark', this._opts); + }, this)); + } } this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#center-on'), e => { e.preventDefault(); From 92ee13814bc75d5abf7ad7b80bd375c5e42e3993 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 1 Apr 2023 13:58:09 +0200 Subject: [PATCH 188/204] fix: edit save from admin v2 --- front/src/js/ui/MarkPopup.js | 18 ++++++++---------- front/src/scss/utils/_overlay.scss | 7 ++++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index 3b2f25a..462667e 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -143,16 +143,14 @@ class MarkPopup { _events() { // Fire global event on buttons return new Promise(resolve => { - if (this._opts.user === window.BeerCrackerz.user.username) { - if (!window.BeerCrackerz.user.isStaff) { - this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#edit-mark'), () => { - window.Evts.publish('editMark', this._opts); - }, this)); - - this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#delete-mark'), () => { - window.Evts.publish('deleteMark', this._opts); - }, this)); - } + if (this._opts.user === window.BeerCrackerz.user.username || !window.BeerCrackerz.user.isStaff) { + this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#edit-mark'), () => { + window.Evts.publish('editMark', this._opts); + }, this)); + + this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#delete-mark'), () => { + window.Evts.publish('deleteMark', this._opts); + }, this)); } this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#center-on'), e => { e.preventDefault(); diff --git a/front/src/scss/utils/_overlay.scss b/front/src/scss/utils/_overlay.scss index b262b28..36314d9 100644 --- a/front/src/scss/utils/_overlay.scss +++ b/front/src/scss/utils/_overlay.scss @@ -130,11 +130,16 @@ flex-direction: row; justify-content: center; margin: .5rem; - padding: .5rem 1rem; + padding: .25rem .75rem; user-select: none; transition: color .2s; + img { + height: 2rem; + width: 2rem; + } + &.selected { border-color: var(--color-primary); color: var(--color-primary); From e3f496e014d71b1e28f2425d2bc78ec2ade4d247 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 1 Apr 2023 14:01:46 +0200 Subject: [PATCH 189/204] fix: edit save from admin v3 --- front/src/js/ui/MarkPopup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index 462667e..bbaa75c 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -143,7 +143,7 @@ class MarkPopup { _events() { // Fire global event on buttons return new Promise(resolve => { - if (this._opts.user === window.BeerCrackerz.user.username || !window.BeerCrackerz.user.isStaff) { + if (this._opts.user === window.BeerCrackerz.user.username || window.BeerCrackerz.user.isStaff) { this._evtIds.push(window.Evts.addEvent('click', this._popup.querySelector('#edit-mark'), () => { window.Evts.publish('editMark', this._opts); }, this)); From fadbab1cf26fdd70205e1d4d932a6a976aec8f50 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sat, 1 Apr 2023 14:13:45 +0200 Subject: [PATCH 190/204] fix: login error msg --- front/src/BeerCrackerzAuth.js | 10 +++++++--- front/src/js/ui/MarkPopup.js | 2 +- static/nls/de.json | 1 + static/nls/en.json | 1 + static/nls/es.json | 1 + static/nls/fr.json | 1 + static/nls/pt.json | 1 + 7 files changed, 13 insertions(+), 4 deletions(-) diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 488923f..8cf24e6 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -567,7 +567,7 @@ class BeerCrackerzAuth { } return true; }; - const _backValidation = () => { + const _backValidation = (e) => { // Check response and handle status codes // If all front and back tests are ok, redirect to auth // If the user manually force redirection to authindex, @@ -583,9 +583,13 @@ class BeerCrackerzAuth { this._kom.post('/api/auth/login/', { username: username.value, password: password.value - }).then(_backValidation).catch(() => { + }).then(_backValidation).catch(e => { error.classList.add('visible'); - error.innerHTML = this.nls.login('serverError'); + if (e.status === 401) { + error.innerHTML = this.nls.login('credsInvalid'); + } else { + error.innerHTML = this.nls.login('serverError'); + } }); } }; diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index bbaa75c..698610a 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -158,7 +158,7 @@ class MarkPopup { window.Evts.publish('centerOn', { lat: this._opts.lat, lng: this._opts.lng, - zoom: 19 + zoom: 17 }); }, this)); diff --git a/static/nls/de.json b/static/nls/de.json index dd5c35e..38b4667 100644 --- a/static/nls/de.json +++ b/static/nls/de.json @@ -198,6 +198,7 @@ "bothEmpty": "Bitte geben sie einen benutzernamen und ein passwort ein", "usernameEmpty": "Bitte geben sie einen benutzernamen ein", "passwordEmpty": "Bitte geben sie ihr passwort ein", + "credsInvalid": "Falscher Benutzername oder falsches Passwort", "serverError": "Ein serverfehler ist aufgetreten, wenden sie sich an den support", "checkMail": "Eine E-Mail wurde gesendet, damit sie fortfahren können" }, diff --git a/static/nls/en.json b/static/nls/en.json index f5bad83..62862a4 100644 --- a/static/nls/en.json +++ b/static/nls/en.json @@ -198,6 +198,7 @@ "bothEmpty": "Please fill the username and password fields", "usernameEmpty": "Please fill the username field", "passwordEmpty": "Please fill your password field", + "credsInvalid": "Invalid credentials", "serverError": "Something wrong happened, contact support", "checkMail": "An email has been sent so you can proceed" }, diff --git a/static/nls/es.json b/static/nls/es.json index 9965d9c..dfe05b0 100644 --- a/static/nls/es.json +++ b/static/nls/es.json @@ -198,6 +198,7 @@ "bothEmpty": "Por favor ingrese un nombre de usuario y contraseña", "usernameEmpty": "Por favor, ingrese un nombre de usuario", "passwordEmpty": "Por favor inserte su contraseña", + "credsInvalid": "Nombre de usuario o contraseña incorrectos", "serverError": "Se ha producido un error en el servidor, póngase en contacto con el soporte", "checkMail": "Se ha enviado un correo electrónico para que pueda continuar" }, diff --git a/static/nls/fr.json b/static/nls/fr.json index 549ad32..086f470 100644 --- a/static/nls/fr.json +++ b/static/nls/fr.json @@ -198,6 +198,7 @@ "bothEmpty": "Veuillez saisir un nom d'utilisateur et un mot de passe", "usernameEmpty": "Veuillez saisir un nom d'utilisateur", "passwordEmpty": "Veuillez saisir votre mot de passe", + "credsInvalid": "Nom d'utilisateur ou mot de passe incorrect", "serverError": "Une erreur serveur est survenue, contactez le support", "checkMail": "Consultez vos email avant de continuer" }, diff --git a/static/nls/pt.json b/static/nls/pt.json index 0c848f1..191cc7d 100644 --- a/static/nls/pt.json +++ b/static/nls/pt.json @@ -198,6 +198,7 @@ "bothEmpty": "Por favor, insira um nome de usuário e senha", "usernameEmpty": "Por favor coloque um nome de usuário", "passwordEmpty": "Por favor, insira sua senha", + "credsInvalid": "Nome de utilizador ou palavra-passe incorrectos", "serverError": "Ocorreu um erro no servidor, entre em contato com o suporte", "checkMail": "Um e-mail foi enviado para que você possa prosseguir" }, From 55b3802d2a7d91199c9f206b9ed9f9cafd229cb2 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Sat, 1 Apr 2023 14:37:22 +0200 Subject: [PATCH 191/204] feat: add spot, bar & shop in django admin --- back/app/admin.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/back/app/admin.py b/back/app/admin.py index f5cb7cb..9003615 100644 --- a/back/app/admin.py +++ b/back/app/admin.py @@ -1,6 +1,30 @@ from django.contrib import admin from app.models import User +from app.models.bar import Bar +from app.models.shop import Shop +from app.models.spot import Spot # Register your models here. admin.site.register(User) + + +class SpotAdmin(admin.ModelAdmin): + list_display = ('pk', 'name', 'user', 'types', 'modifiers') + + +admin.site.register(Spot, SpotAdmin) + + +class BarAdmin(admin.ModelAdmin): + list_display = ('pk', 'name', 'user', 'types', 'modifiers') + + +admin.site.register(Bar, BarAdmin) + + +class ShopAdmin(admin.ModelAdmin): + list_display = ('pk', 'name', 'user', 'types', 'modifiers') + + +admin.site.register(Shop, ShopAdmin) From e85d76a509f9b218f5d7db751c37a900c3ef7692 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Sat, 1 Apr 2023 16:47:13 +0200 Subject: [PATCH 192/204] chore: change server port --- bc.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bc.sh b/bc.sh index b09e6c0..0477b0c 100755 --- a/bc.sh +++ b/bc.sh @@ -115,7 +115,7 @@ prodInstall() { { echo "# NGINX" echo "NGINX_NAME=beer_crackerz_nginx" echo "SERVER_HOST=127.0.0.1" - echo "SERVER_PORT=8081" + echo "SERVER_PORT=8000" echo "SERVER_URL=${4}" echo "" echo "# DATABASE" @@ -128,7 +128,7 @@ prodInstall() { echo "" echo "# BACKEND" echo "BACKEND_NAME=beer_crackerz_back" - echo "BACKEND_PORT=8000" + echo "BACKEND_PORT=8001" echo "BACKEND_DEBUG=0" echo "BACKEND_ALLOWED_HOSTS=127.0.0.1" echo "BACKEND_USE_EMAIL_FILE_SYSTEM=0" From 4fa86f24ff8d7209f96860bcadd8ab813c4d7f4a Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Sun, 2 Apr 2023 13:08:55 +0200 Subject: [PATCH 193/204] feat: it translation and help menu update --- back/app/templates/modal/hideshow.html | 5 - back/app/templates/modal/user.html | 1 + front/src/BeerCrackerz.js | 11 +- front/src/BeerCrackerzAuth.js | 38 ---- front/src/js/core/LangManager.js | 3 +- front/src/js/ui/MarkPopup.js | 26 --- front/src/js/ui/VisuHelper.js | 83 +------- front/src/js/ui/modal/HideShowModal.js | 6 - front/src/js/ui/modal/StartupHelpModal.js | 6 +- front/src/js/utils/Utils.js | 4 - front/src/scss/modal/_startuphelp.scss | 1 - front/src/scss/utils/_leaflet.scss | 26 --- front/src/scss/utils/_responsive.scss | 8 - front/test/spec/utils.Utils.spec.js | 1 - static/nls/de.json | 16 +- static/nls/en.json | 18 +- static/nls/es.json | 16 +- static/nls/fr.json | 16 +- static/nls/it.json | 244 ++++++++++++++++++++++ static/nls/pt.json | 16 +- 20 files changed, 289 insertions(+), 256 deletions(-) create mode 100644 static/nls/it.json diff --git a/back/app/templates/modal/hideshow.html b/back/app/templates/modal/hideshow.html index 2ddaa10..2c2839d 100644 --- a/back/app/templates/modal/hideshow.html +++ b/back/app/templates/modal/hideshow.html @@ -4,11 +4,6 @@

    {MODAL_TITLE}

    -
    - label-toggle - - -
    show-spots diff --git a/back/app/templates/modal/user.html b/back/app/templates/modal/user.html index eca2504..80545a4 100644 --- a/back/app/templates/modal/user.html +++ b/back/app/templates/modal/user.html @@ -43,6 +43,7 @@

    +
    diff --git a/front/src/BeerCrackerz.js b/front/src/BeerCrackerz.js index 78b5575..efe383c 100644 --- a/front/src/BeerCrackerz.js +++ b/front/src/BeerCrackerz.js @@ -455,14 +455,6 @@ class BeerCrackerz { }); this._map.on('zoomend', () => { this._isZooming = false; - // Auto hide labels if zoom level is too high (and restore it when needed) - if (Utils.getPreference('poi-show-label') === 'true') { - if (this._map.getZoom() < 16) { - VisuHelper.setMarkerLabels(false); - } else { - VisuHelper.setMarkerLabels(true); - } - } // Updating debug info VisuHelper.updateDebugUI(); }); @@ -767,7 +759,6 @@ class BeerCrackerz { if (options.price) { this._marks[options.type][i].price = options.price; } - options.tooltip.removeFrom(this.map); const popup = new MarkPopup(options, dom => { options.dom = dom; options.marker.setPopupContent(popup.dom); @@ -859,7 +850,7 @@ class BeerCrackerz { * @description *
    * The hidShowMenu() method will request the hide show modal, which all - * toggles for map elements ; labels/circles/spots/shops/bars + * toggles for map elements ; spots/shops/bars *
    **/ hidShowMenu() { diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 8cf24e6..64edf4f 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -316,18 +316,6 @@ class BeerCrackerzAuth { // Constrain pan to the map bounds this._map.panInsideBounds(MapEnum.mapBounds, { animate: true }); }); - // Auto hide labels if zoom level is too high (and restore it when needed) - this._map.on('zoomend', () => { - if (this._map.getZoom() < 15) { - this._setMarkerLabels(this._marks.spot, false); - this._setMarkerLabels(this._marks.shop, false); - this._setMarkerLabels(this._marks.bar, false); - } else { - this._setMarkerLabels(this._marks.spot, true); - this._setMarkerLabels(this._marks.shop, true); - this._setMarkerLabels(this._marks.bar, true); - } - }); // Update map view for big popups this._map.on('popupopen', event => { const px = this._map.project(event.target._popup._latlng); @@ -822,32 +810,6 @@ class BeerCrackerzAuth { } - /** - * @method - * @name _setMarkerLabels - * @private - * @memberof BeerCrackerzAuth - * @author Arthur Beaulieu - * @since September 2022 - * @description - *
    - * The _setMarkerLabels() method will set the label visibility for an array of marks - * depending on the `visible` argument value. - *
    - * @param {Object[]} marks - The array of marks to edit visibility from - * @param {Boolean} visible - The labels visibility state to apply - **/ - _setMarkerLabels(marks, visible) { - for (let i = 0; i < marks.length; ++i) { - if (visible) { - marks[i].tooltip.addTo(this.map); - } else { - marks[i].tooltip.removeFrom(this.map); - } - } - } - - // ======================================================================== // // ---------------------------- Class accessors --------------------------- // // ======================================================================== // diff --git a/front/src/js/core/LangManager.js b/front/src/js/core/LangManager.js index a4d4fc4..fed6a7b 100644 --- a/front/src/js/core/LangManager.js +++ b/front/src/js/core/LangManager.js @@ -214,6 +214,7 @@ class LangManager { Utils.replaceString(dom.querySelector(`#nls-lang-en`), `{LANG_EN}`, this.modal('langEn')); Utils.replaceString(dom.querySelector(`#nls-lang-es`), `{LANG_ES}`, this.modal('langEs')); Utils.replaceString(dom.querySelector(`#nls-lang-de`), `{LANG_DE}`, this.modal('langDe')); + Utils.replaceString(dom.querySelector(`#nls-lang-it`), `{LANG_IT}`, this.modal('langIt')); Utils.replaceString(dom.querySelector(`#nls-lang-pt`), `{LANG_PT}`, this.modal('langPt')); Utils.replaceString(dom.querySelector(`#nls-about-desc`), `{BEERCRACKERZ_DESC}`, this.modal('aboutDesc')); Utils.replaceString(dom.querySelector(`.nls-user-logout`), `{USER_LOGOUT}`, this.modal('logout')); @@ -231,8 +232,6 @@ class LangManager { hideShowModal(dom) { Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-title`), `{MODAL_TITLE}`, this.modal('hideShowTitle')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-labels`), `{LABELS_HIDESHOW_MODAL}`, this.modal('hideShowLabels')); - Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-circles`), `{CIRCLES_HIDESHOW_MODAL}`, this.modal('hideShowCircles')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-spots`), `{SPOTS_HIDESHOW_MODAL}`, this.modal('hideShowSpots')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-shops`), `{SHOPS_HIDESHOW_MODAL}`, this.modal('hideShowShops')); Utils.replaceString(dom.querySelector(`#nls-hideshow-modal-bars`), `{BARS_HIDESHOW_MODAL}`, this.modal('hideShowBars')); diff --git a/front/src/js/ui/MarkPopup.js b/front/src/js/ui/MarkPopup.js index 698610a..70a49cb 100644 --- a/front/src/js/ui/MarkPopup.js +++ b/front/src/js/ui/MarkPopup.js @@ -104,32 +104,6 @@ class MarkPopup { this._opts.color = ColorEnum[this._opts.type]; this._opts.circle = VisuHelper.drawCircle(this._opts); this._opts.circle.addTo(window.BeerCrackerz.map); - // Create label for new marker (and add pricing label if any) - const element = document.createElement('P'); - element.innerHTML = this._opts.name; - if (this._opts.price) { - const pricing = document.createElement('DIV'); - pricing.classList.add('label-pricing'); - for (let i = 0; i < this._opts.price + 1; ++i) { - const dollar = document.createElement('IMG'); - dollar.src = 'static/img/logo/dollar.svg'; - pricing.appendChild(dollar); - } - element.appendChild(pricing); - } - this._opts.tooltip = window.L.tooltip({ - permanent: true, - direction: 'center', - className: 'marker-tooltip', - interactive: true - }).setContent(element) - .setLatLng(this._opts.circle.getLatLng()); - - this._opts.tooltip.addTo(window.BeerCrackerz.map); - // Remove it if preference is to true - if (Utils.getPreference('poi-show-label') === 'false') { - this._opts.tooltip.removeFrom(window.BeerCrackerz.map); - } this._popupElement = window.L.popup({ maxWidth: 900 diff --git a/front/src/js/ui/VisuHelper.js b/front/src/js/ui/VisuHelper.js index bcfe976..dee6d5a 100644 --- a/front/src/js/ui/VisuHelper.js +++ b/front/src/js/ui/VisuHelper.js @@ -13,6 +13,11 @@ import MarkersEnum from '../utils/enums/MarkerEnum.js'; class VisuHelper { + // ======================================================================== // + // ----------------------- Debug interface methods ------------------------ // + // ======================================================================== // + + /** * @method * @name initDebugUI @@ -177,51 +182,7 @@ class VisuHelper { } - static updateMarkerCirclesVisibility() { - // Only update circles that are in user view - if (window.BeerCrackerz.map.getBounds().contains(window.BeerCrackerz.user.marker.getLatLng())) { - const marker = window.BeerCrackerz.user.marker; - const distance = Utils.getDistanceBetweenCoords( - [ window.BeerCrackerz.user.lat, window.BeerCrackerz.user.lng ], - [ marker.getLatLng().lat, marker.getLatLng().lng ] - ); - window.BeerCrackerz.user.circle.visible = true; - window.BeerCrackerz.user.circle.setStyle({ - opacity: 1, - fillOpacity: 0.1 - }); - } - } - - - static setMarkerLabels(visible) { - const _updateTooltip = list => { - for (let i = 0; i < list.length; ++i) { - if (visible && list[i].clustered === false) { - list[i].tooltip.addTo(window.BeerCrackerz.map); - } else { - list[i].tooltip.removeFrom(window.BeerCrackerz.map); - } - } - }; - - const keys = Object.keys(window.BeerCrackerz.marks); - for (let i = 0; i < keys.length; ++i) { - _updateTooltip(window.BeerCrackerz.marks[keys[i]]); - } - } - - static removeMarkDecoration(mark) { - // Remove label - mark.tooltip.removeFrom(window.BeerCrackerz.map); - // Remove circle - mark.circle.setStyle({ - opacity: 0, - fillOpacity: 0 - }); - mark.circle.removeFrom(window.BeerCrackerz.map); - // Call destroy on mark popup if (mark.popup) { mark.popup.destroy(); } @@ -253,27 +214,6 @@ class VisuHelper { } - /** - * @method - * @name toggleLabel - * @public - * @memberof BeerCrackerz - * @author Arthur Beaulieu - * @since January 2022 - * @description - *
    - * The toggleLabel() method will, depending on user preference, display or not - * the labels attached to spots/shops/bars marks. This label is basically the - * mark name given by its creator. - *
    - **/ - static toggleLabel() { - const visible = !(Utils.getPreference('poi-show-label') === 'true'); - VisuHelper.setMarkerLabels(visible); - Utils.setPreference('poi-show-label', visible); - } - - /** * @method * @name toggleMarkers @@ -399,19 +339,6 @@ class VisuHelper { static checkClusteredMark(type) { - if (Utils.getPreference('poi-show-label') === 'true') { - const layers = window.BeerCrackerz.marks[type]; - for (let i = 0; i < layers.length; ++i) { - const visible = window.BeerCrackerz.map.hasLayer(layers[i].marker); - layers[i].clustered = !visible; - if (visible) { - layers[i].tooltip.addTo(window.BeerCrackerz.map); - } else { - layers[i].tooltip.removeFrom(window.BeerCrackerz.map); - } - } - } - const clusters = window.BeerCrackerz.clusters[type] clusters._featureGroup.eachLayer(layer => { if (layer instanceof L.MarkerCluster && layer.getChildCount() > 2) { diff --git a/front/src/js/ui/modal/HideShowModal.js b/front/src/js/ui/modal/HideShowModal.js index 617acc8..325cda6 100644 --- a/front/src/js/ui/modal/HideShowModal.js +++ b/front/src/js/ui/modal/HideShowModal.js @@ -17,10 +17,6 @@ class HideShowModal extends BaseModal { _fillAttributes() { window.BeerCrackerz.nls.hideShowModal(this._rootElement); - if (Utils.getPreference('poi-show-label') === 'true') { - this._rootElement.querySelector('#label-toggle').checked = true; - } - if (Utils.getPreference('poi-show-spot') === 'true') { this._rootElement.querySelector('#show-spots').checked = true; } @@ -40,12 +36,10 @@ class HideShowModal extends BaseModal { _events() { // Toggles - this._evtIds.push(window.Evts.addEvent('change', this._rootElement.querySelector('#label-toggle'), VisuHelper.toggleLabel, VisuHelper)); this._evtIds.push(window.Evts.addEvent('change', this._rootElement.querySelector('#show-spots'), VisuHelper.toggleMarkers, VisuHelper)); this._evtIds.push(window.Evts.addEvent('change', this._rootElement.querySelector('#show-shops'), VisuHelper.toggleMarkers, VisuHelper)); this._evtIds.push(window.Evts.addEvent('change', this._rootElement.querySelector('#show-bars'), VisuHelper.toggleMarkers, VisuHelper)); // Labels - this._evtIds.push(window.Evts.addEvent('mouseover', this._rootElement.querySelector('#labels-toggle'), this._updateHelper, this)); this._evtIds.push(window.Evts.addEvent('mouseover', this._rootElement.querySelector('#spots-toggle'), this._updateHelper, this)); this._evtIds.push(window.Evts.addEvent('mouseover', this._rootElement.querySelector('#shops-toggle'), this._updateHelper, this)); this._evtIds.push(window.Evts.addEvent('mouseover', this._rootElement.querySelector('#bars-toggle'), this._updateHelper, this)); diff --git a/front/src/js/ui/modal/StartupHelpModal.js b/front/src/js/ui/modal/StartupHelpModal.js index 92d8428..f19b518 100644 --- a/front/src/js/ui/modal/StartupHelpModal.js +++ b/front/src/js/ui/modal/StartupHelpModal.js @@ -16,11 +16,7 @@ class StartupHelpModal extends BaseModal { _fillAttributes() { window.BeerCrackerz.nls.startupHelpModal(this._rootElement); -/* - if (Utils.getPreference('poi-show-label') === 'true') { - //this._rootElement.querySelector('#label-toggle').checked = true; - } -*/ + this._footerQuitButton = this._rootElement.querySelector('#modal-quit'); this._footerQuitNoSeeButton = this._rootElement.querySelector('#modal-quit-no-see'); diff --git a/front/src/js/utils/Utils.js b/front/src/js/utils/Utils.js index 31a9337..4028674 100644 --- a/front/src/js/utils/Utils.js +++ b/front/src/js/utils/Utils.js @@ -153,10 +153,6 @@ class Utils { Utils.setPreference('poi-show-bar', true); } - if (Utils.getPreference('poi-show-label') === null) { - Utils.setPreference('poi-show-label', true); - } - if (Utils.getPreference('map-plan-layer') === null) { Utils.setPreference('map-plan-layer', 'Plan OSM'); } diff --git a/front/src/scss/modal/_startuphelp.scss b/front/src/scss/modal/_startuphelp.scss index 3ba8c66..26568a6 100644 --- a/front/src/scss/modal/_startuphelp.scss +++ b/front/src/scss/modal/_startuphelp.scss @@ -26,7 +26,6 @@ .helping-view-wrapper { display: flex; - height: 55rem; overflow: hidden; position: relative; diff --git a/front/src/scss/utils/_leaflet.scss b/front/src/scss/utils/_leaflet.scss index df3a025..d8b69f6 100644 --- a/front/src/scss/utils/_leaflet.scss +++ b/front/src/scss/utils/_leaflet.scss @@ -103,29 +103,3 @@ filter: drop-shadow(0 0 .33rem #A8A8A8); } } - -.marker-tooltip { - background-color: var(--color-bg-a9); - color: var(--color-txt); - cursor: pointer; - pointer-events: auto; - font-style: italic; - text-align: center; - top: 2rem; - - p { - margin: 0; - } - - .label-pricing { - bottom: -2.4rem; - position: absolute; - left: -1.2rem; - right: -1.2rem; - - img { - filter: invert(69%) sepia(10%) saturate(2908%) hue-rotate(72deg) brightness(107%) contrast(74%) drop-shadow(0 0 1px var(--color-txt)); - width: var(--font-size-l2); - } - } -} \ No newline at end of file diff --git a/front/src/scss/utils/_responsive.scss b/front/src/scss/utils/_responsive.scss index fa7b724..6f645eb 100644 --- a/front/src/scss/utils/_responsive.scss +++ b/front/src/scss/utils/_responsive.scss @@ -12,8 +12,6 @@ /* Startup help modal rules */ @media (max-height: 750px) { .overlay .startup-help-modal .helping-view-wrapper { - height: 39rem; - .page .doc-image { max-height: 28rem; } @@ -22,8 +20,6 @@ @media (max-height: 600px) { .overlay .startup-help-modal .helping-view-wrapper { - height: 29rem; - .page .doc-image { max-height: 18rem; } @@ -32,8 +28,6 @@ @media (max-height: 500px) { .overlay .startup-help-modal .helping-view-wrapper { - height: 19rem; - .page .doc-image { max-height: 11rem; } @@ -42,8 +36,6 @@ @media (max-height: 400px) { .overlay .startup-help-modal .helping-view-wrapper { - height: 14rem; - .page .doc-image { max-height: 8rem; } diff --git a/front/test/spec/utils.Utils.spec.js b/front/test/spec/utils.Utils.spec.js index af1768f..3bd18b3 100644 --- a/front/test/spec/utils.Utils.spec.js +++ b/front/test/spec/utils.Utils.spec.js @@ -149,7 +149,6 @@ describe('Utils unit test :', () => { 'poi-show-spot': true, 'poi-show-shop': true, 'poi-show-bar': true, - 'poi-show-label': true, 'map-plan-layer': 'Plan OSM', 'selected-lang': 'en', 'app-debug': false, diff --git a/static/nls/de.json b/static/nls/de.json index 38b4667..6e69e8e 100644 --- a/static/nls/de.json +++ b/static/nls/de.json @@ -135,6 +135,7 @@ "langEn": "🇬🇧 Englisch", "langEs": "🇪🇸 Spanisch", "langDe": "🇩🇪 Deutsch", + "langIt": "🇩🇪 Italienisch", "langPt": "🇵🇹 Portugiesisch", "aboutTitle": "Über BeerCrackerz", "aboutDesc": "Eine brillante idee von David Béché!
    BeerCrackerz ist die gemeinschaft der bierliebhaber, gefüllt mit bierjägern und müsliliebhabern", @@ -145,16 +146,13 @@ "updatePPDesc": "Schneiden Sie das bild bei bedarf zu und legen sie los!", "logout": "Ausloggen", "hideShowTitle": "Kartenoptionen", - "hideShowLabels": "Etiketten", - "hideShowCircles": "Kreise", "hideShowSpots": "Spots", "hideShowShops": "Läden", "hideShowBars": "Bars", "hideShowHelperLabel": "Klicken sie auf ein symbol, um seine beschreibung anzuzeigen", - "labelHelperHideShow": "Entweder möchten Sie den markennamen unter seinem pin anzeigen oder nicht.", - "spotHelperHideShow": "Zum ausblenden oder anzeigen aller spots auf der karte (es wird auch der zugehörige kreis ausgeblendet oder angezeigt).", - "shopHelperHideShow": "Zum ausblenden oder anzeigen aller läden auf der karte (es wird auch der zugehörige kreis ausgeblendet oder angezeigt).", - "barHelperHideShow": "Zum ausblenden oder anzeigen aller bar auf der karte (es wird auch der zugehörige kreis ausgeblendet oder angezeigt).", + "spotHelperHideShow": "Zum ausblenden oder anzeigen aller spots auf der karte.", + "shopHelperHideShow": "Zum ausblenden oder anzeigen aller läden auf der karte.", + "barHelperHideShow": "Zum ausblenden oder anzeigen aller bar auf der karte.", "deleteMarkTitle": "Markierung löschen", "deleteMarkDesc": "Möchten sie diese markierung wirklich löschen?
    Diese aktion ist dauerhaft und kann nicht rückgängig gemacht werden.", "spotEditTitle": "Spot bearbeiten", @@ -165,9 +163,9 @@ "helpNavNextPrev": "Navigieren sie zur nächsten oder vorherigen seite oder verlassen sie dieses hilfemenü!", "helpNavEnd": "Sie können diesen assistenten jetzt schließen!", "helpPage1": "Willkommen bei BeerCrackerz!
    Mal sehen, wie die Karte funktioniert; Ihre Position wird durch das Symbol \"user-position\" gekennzeichnet. Um ihre position herum zeigt ein blauer kreis die aktuelle Genauigkeit Ihrer Position an. Um sie herum gibt es auch einen goldenen kreis ; Dies ist die maximale entfernung, für die sie einen neuen spot, ein laden oder eine bar deklarieren können.", - "helpPage2": "Ein spot wird durch das symbol \"spot-mark\" dargestellt. Spot sind perfekte orte, um eine bierdose zu genießen. Jeder spot hat seine besonderheiten, es liegt an ihnen, sie zu entdecken. Um den spot herum befindet sich ein grüner kreis ; es stellt den bereich dar, in dem sie das recht haben, vor spot abzustimmen oder kommentare abzugeben.", - "helpPage3": "Ein laden wird durch das symbol \"shop-mark\" dargestellt. Laden sind der ideale ort, um sich mit bierdosen einzudecken. Jeder laden hat seine besonderheiten, es liegt an ihnen, sie zu entdecken. Um den laden herum befindet sich ein blue circle ; ; es stellt den bereich dar, in dem sie das recht haben, vor laden abzustimmen oder kommentare abzugeben.", - "helpPage4": "Ein bar wird durch das symbol \"bar-mark\" dargestellt. Bars sind freundliche orte, die frische und gute biere servieren. Jeder bar hat seine besonderheiten, es liegt an ihnen, sie zu entdecken. Um den bar herum befindet sich ein red circle ; ; es stellt den bereich dar, in dem sie das recht haben, vor bar abzustimmen oder kommentare abzugeben.", + "helpPage2": "Ein spot wird durch das symbol \"spot-mark\" dargestellt. Spot sind perfekte orte, um eine bierdose zu genießen. Jeder spot hat seine besonderheiten, es liegt an ihnen, sie zu entdecken.", + "helpPage3": "Ein laden wird durch das symbol \"shop-mark\" dargestellt. Laden sind der ideale ort, um sich mit bierdosen einzudecken. Jeder laden hat seine besonderheiten, es liegt an ihnen, sie zu entdecken.", + "helpPage4": "Ein bar wird durch das symbol \"bar-mark\" dargestellt. Bars sind freundliche orte, die frische und gute biere servieren. Jeder bar hat seine besonderheiten, es liegt an ihnen, sie zu entdecken.", "helpPage5": "Es stehen mehrere befehle zur verfügung: 1. auswahl der basiskarte, 2. zentrieren und sperren der Karte auf ihrer position, 3. ein oder ausblenden von kartenelementen und 4. ihr konto.", "helpQuit": "Aufhören", "helpQuitNoSee": "Aufhören und nie wieder sehen" diff --git a/static/nls/en.json b/static/nls/en.json index 62862a4..320c00a 100644 --- a/static/nls/en.json +++ b/static/nls/en.json @@ -26,7 +26,7 @@ "shopEdited": "Shop edited! Thanks", "shopNotEdited": "Couldn't edit shop", "barEdited": "Bar edited! Thanks", - "barNotEdited": "Couldn't edit store", + "barNotEdited": "Couldn't edit bar", "spotDeleted": "Spot deleted", "spotNotDeleted": "Couldn't delete spot", "shopDeleted": "Shop deleted", @@ -135,6 +135,7 @@ "langEn": "🇬🇧 English", "langEs": "🇪🇸 Spanish", "langDe": "🇩🇪 German", + "langIt": "🇩🇪 Italian", "langPt": "🇵🇹 Portuguese", "aboutTitle": "About BeerCrackerz", "aboutDesc": "A brilliant idea from David Béché!
    BeerCrackerz is the beer lovers comunity, filled with pint slayers and cereals lovers", @@ -145,16 +146,13 @@ "updatePPDesc": "Crop the picture if needed and go!", "logout": "Sign out", "hideShowTitle": "Map options", - "hideShowLabels": "Labels", - "hideShowCircles": "Circles", "hideShowSpots": "Spots", "hideShowShops": "Shops", "hideShowBars": "Bars", "hideShowHelperLabel": "Click on an icon to display its description", - "labelHelperHideShow": "Either you want to display or not the mark name under its pin.", - "spotHelperHideShow": "To hide or show all spots on the map (it will also hide or show the associated circle).", - "shopHelperHideShow": "To hide or show all shops on the map (it will also hide or show the associated circle).", - "barHelperHideShow": "To hide or show all bars on the map (it will also hide or show the associated circle).", + "spotHelperHideShow": "To hide or show all spots on the map.", + "shopHelperHideShow": "To hide or show all shops on the map.", + "barHelperHideShow": "To hide or show all bars on the map.", "deleteMarkTitle": "Delete mark", "deleteMarkDesc": "Are you sure you want to delete this mark?
    This action is permanent and can not be reverted.", "spotEditTitle": "Edit spot", @@ -165,9 +163,9 @@ "helpNavNextPrev": "Navigate to the next or previous page, or exit this help menu!", "helpNavEnd": "You can now close this wizard!", "helpPage1": "Welcome to BeerCrackerz!
    Let's see how the map works; your position is marked by the symbol \"user-position\". Around your position, a blue circle represents the current accuracy of your position. Around you, there is also a golden circle ; this is the maximum distance for which you can declare a new spot, a store or a bar.", - "helpPage2": "A spot is represented by the symbol \"spot-mark\". Spots are perfect places to enjoy a beer can. Each spot has its specificities, it's up to you to discover them. Surrounding the spot is a green circle ; it represents the area in which you have the right to vote or leave comments on the spot.", - "helpPage3": "A shop is represented by the symbol \"shop-mark\". Shops are the ideal places to stock up on beer cans. Each shop has its specificities, it's up to you to discover them. Surrounding the shop is a blue circle ; it represents the area in which you have the right to vote or leave comments on the shop.", - "helpPage4": "A bar is represented by the symbol \"bar-mark\". Bars are friendly places that serve fresh and good beers. Each bar has its specificities, it's up to you to discover them. Surrounding the bar is a red circle ; it represents the area in which you have the right to vote or leave comments on the bar.", + "helpPage2": "A spot is represented by the symbol \"spot-mark\". Spots are perfect places to enjoy a beer can. Each spot has its specificities, it's up to you to discover them.", + "helpPage3": "A shop is represented by the symbol \"shop-mark\". Shops are the ideal places to stock up on beer cans. Each shop has its specificities, it's up to you to discover them.", + "helpPage4": "A bar is represented by the symbol \"bar-mark\". Bars are friendly places that serve fresh and good beers. Each bar has its specificities, it's up to you to discover them.", "helpPage5": "Several commands are available : 1. base map choice, 2. recenter and lock the map on your position, 3. show or hide map items and 4. your account.", "helpQuit": "Quit", "helpQuitNoSee": "Quit and don't see again" diff --git a/static/nls/es.json b/static/nls/es.json index dfe05b0..aabbefe 100644 --- a/static/nls/es.json +++ b/static/nls/es.json @@ -135,6 +135,7 @@ "langEn": "🇬🇧 Inglés", "langEs": "🇪🇸 Español", "langDe": "🇩🇪 Alemán", + "langIt": "🇩🇪 Italiano", "langPt": "🇵🇹 Portugués", "aboutTitle": "Acerca de BeerCrackerz", "aboutDesc": "¡Una idea brillante de David Béché!
    BeerCrackerz es la comunidad de amantes de la cerveza, llena de cazadores de pintas y amantes de los cereales.", @@ -145,16 +146,13 @@ "updatePPDesc": "¡Recorta la imagen si es necesario y listo!", "logout": "Desconectarse", "hideShowTitle": "Opciones de mapa", - "hideShowLabels": "Etiquetas", - "hideShowCircles": "Círculos", "hideShowSpots": "Spots", "hideShowShops": "Tiendas", "hideShowBars": "Barras", "hideShowHelperLabel": "Haga clic en un icono para mostrar su descripción", - "labelHelperHideShow": "O desea mostrar o no el nombre de la marca debajo de su pin.", - "spotHelperHideShow": "Para ocultar o mostrar todos los spots del mapa (también ocultará o mostrará el círculo asociado).", - "shopHelperHideShow": "Para ocultar o mostrar todas las tiendas en el mapa (también ocultará o mostrará el círculo asociado).", - "barHelperHideShow": "Para ocultar o mostrar todas las barras del mapa (también ocultará o mostrará el círculo asociado).", + "spotHelperHideShow": "Para ocultar o mostrar todos los spots del mapa.", + "shopHelperHideShow": "Para ocultar o mostrar todas las tiendas en el mapa.", + "barHelperHideShow": "Para ocultar o mostrar todas las barras del mapa.", "deleteMarkTitle": "Borrar marca", "deleteMarkDesc": "¿Está seguro de que desea eliminar esta marca?
    Esta acción es permanente y no se puede revertir.", "spotEditTitle": "Editar spot", @@ -165,9 +163,9 @@ "helpNavNextPrev": "¡Navegue a la página siguiente o anterior, o salga de este menú de ayuda!", "helpNavEnd": "¡Ya puede cerrar este asistente!", "helpPage1": "¡Bienvenido a BeerCrackerz!
    Veamos cómo funciona el mapa; su posición está marcada por el símbolo \"user-position\". Alrededor de su posición, un círculo azul representa la precisión actual de su posición. A tu alrededor, también hay un círculo dorado ; esta es la distancia máxima por la que puedes declarar un nuevo lugar, una tienda o un bar.", - "helpPage2": "Un spot está representado por el símbolo \"spot-mark\". Los spots son lugares perfectos para disfrutar de una lata de cerveza. Cada spot tiene sus especificidades, depende de ti descubrirlas. Alrededor del spot hay un círculo verde ; representa el área en la que tiene derecho a votar o dejar comentarios en el acto.", - "helpPage3": "Una tienda está representada por el símbolo \"shop-mark\". Las tiendas son los lugares ideales para abastecerse de latas de cerveza. Cada tienda tiene sus especificidades, depende de ti descubrirlas. Rodeando la tienda hay un círculo azul ; representa el área en la que tienes derecho a votar o dejar comentarios en la tienda.", - "helpPage4": "Una tienda barra representada por el símbolo \"bar-mark\". Los bares son lugares acogedores que sirven cervezas frescas y buenas. Cada barra tiene sus especificidades, depende de ti descubrirlas. Alrededor de la barra hay un círculo rojo ; representa el área en la que tienes derecho a votar o dejar comentarios en la barra.", + "helpPage2": "Un spot está representado por el símbolo \"spot-mark\". Los spots son lugares perfectos para disfrutar de una lata de cerveza. Cada spot tiene sus especificidades, depende de ti descubrirlas.", + "helpPage3": "Una tienda está representada por el símbolo \"shop-mark\". Las tiendas son los lugares ideales para abastecerse de latas de cerveza. Cada tienda tiene sus especificidades, depende de ti descubrirlas.", + "helpPage4": "Una tienda barra representada por el símbolo \"bar-mark\". Los bares son lugares acogedores que sirven cervezas frescas y buenas. Cada barra tiene sus especificidades, depende de ti descubrirlas.", "helpPage5": "Hay varios comandos disponibles: 1. elección del mapa base, 2. volver a centrar y bloquear el mapa en su posición, 3. mostrar u ocultar elementos del mapa y 4. su cuenta.", "helpQuit": "Sal", "helpQuitNoSee": "Sal y no vuelvas a ver" diff --git a/static/nls/fr.json b/static/nls/fr.json index 086f470..01292a6 100644 --- a/static/nls/fr.json +++ b/static/nls/fr.json @@ -135,6 +135,7 @@ "langEn": "🇬🇧 Anglais", "langEs": "🇪🇸 Espagnol", "langDe": "🇩🇪 Allemand", + "langIt": "🇩🇪 Italien", "langPt": "🇵🇹 Portuguais", "aboutTitle": "À propos de BeerCrackerz", "aboutDesc": "Un idée brillant du grand David Béché!
    BeerCrackerz, c'est la communauté des amoureux de la bière et du plein air, des pourfendeurs de pinte, des déglingos de la céréale", @@ -145,16 +146,13 @@ "updatePPDesc": "Rogner l'image selon vos besoin et c'est parti!", "logout": "Se déconnecter", "hideShowTitle": "Options de la carte", - "hideShowLabels": "Étiquette", - "hideShowCircles": "Cercles", "hideShowSpots": "Spots", "hideShowShops": "Magasins", "hideShowBars": "Bars", "hideShowHelperLabel": "Cliquer sur un icône pour en afficher la description", - "labelHelperHideShow": "L'étiquette permet de voir le nom du point sans l'ouvrir.", - "spotHelperHideShow": "Pour cacher ou aficher tout les spots de la carte (cela cachera les cercles associés aux spots).", - "shopHelperHideShow": "Pour cacher ou aficher tout les magasins de la carte (cela cachera les cercles associés aux magasins).", - "barHelperHideShow": "Pour cacher ou aficher tout les bars de la carte (cela cachera les cercles associés aux bars).", + "spotHelperHideShow": "Pour cacher ou aficher tout les spots de la carte.", + "shopHelperHideShow": "Pour cacher ou aficher tout les magasins de la carte.", + "barHelperHideShow": "Pour cacher ou aficher tout les bars de la carte.", "deleteMarkTitle": "Supprimer le point", "deleteMarkDesc": "Ètes vous sûr de vouloir supprimer ce point?
    Cette action est permanente et irréversible.", "spotEditTitle": "Éditer le spot", @@ -165,9 +163,9 @@ "helpNavNextPrev": "Naviguez jusqu'à la page suivante ou précèdante, ou quittez ce menu d'aide!", "helpNavEnd": "Vous pouvez maintenant fermer cet assistant!", "helpPage1": "Bienvenue sur BeerCrackerz!
    Voyons comment marche la carte ; votre position est marquée par le symbole \"user-position\". Autour de votre position, un cercle bleu ; ce dernier représente la précision actuelle de votre position. Autour de vous, il y a également un cercle doré ; c'est la distance maximale pour laquelle vous pouvez déclarer un nouveau spot, un magasin ou un bar.", - "helpPage2": "Un spot est représenté par le symbole \"spot-mark\". Les spots sont les endroit ideaux pour deguster une cannette. Chaque spot à ses specificité, a vous de les découvrir. Autour du spot se trouve un cercle vert ; ce dernier représente la zone dans laquelle vous avez le droit de voter ou de laisser des commentaires sur le spot.", - "helpPage3": "Un magasin est représenté par le symbole \"shop-mark\". Les spots sont les endroit ideaux pour se ravitailler en cannettes. Chaque magasin à ses specificités, à vous de les découvrir. Autour du magasin se trouve un cercle bleu ; ce dernier représente la zone dans laquelle vous avez le droit de voter ou de laisser des commentaires sur le magasin.", - "helpPage4": "Un bar est représenté par le symbole \"bar-mark\". Les bars sont des endroit conviviaux qui servent de fraîche et bonnes bières. Chaque bar à ses specificités, à vous de les découvrir. Autour du bar se trouve un cercle rouge ; ce dernier représente la zone dans laquelle vous avez le droit de voter ou de laisser des commentaires sur le magasin.", + "helpPage2": "Un spot est représenté par le symbole \"spot-mark\". Les spots sont les endroit ideaux pour deguster une cannette. Chaque spot à ses specificité, a vous de les découvrir.", + "helpPage3": "Un magasin est représenté par le symbole \"shop-mark\". Les spots sont les endroit ideaux pour se ravitailler en cannettes. Chaque magasin à ses specificités, à vous de les découvrir.", + "helpPage4": "Un bar est représenté par le symbole \"bar-mark\". Les bars sont des endroit conviviaux qui servent de fraîche et bonnes bières. Chaque bar à ses specificités, à vous de les découvrir.", "helpPage5": "Plusieurs commandes sont à votre disposition : 1. choix du fond de carte, 2. recentrer et vérouiller la carte sur votre position, 3. afficher ou cacher les éléments de la carte et 4. votre compte.", "helpQuit": "Quitter", "helpQuitNoSee": "Quitter et ne plus revoir" diff --git a/static/nls/it.json b/static/nls/it.json new file mode 100644 index 0000000..2984156 --- /dev/null +++ b/static/nls/it.json @@ -0,0 +1,244 @@ +{ + "debug": { + "lat": "Latitudine", + "lng": "Longitudine", + "updates": "Aggiornamenti", + "accuracy": "Precisione", + "highAccuracy": "Alta precisione", + "posAge": "Posizione età massima", + "posTimeout": "Scadenza posizione", + "zoom": "Ingrandisci", + "enabled": "Abilitato", + "disabled": "Disabilitato", + "marks": "Marcatore" + }, + "notif": { + "geolocationError": "Il tuo browser non implementa l'API di geolocalizzazione", + "newMarkerOutside": "Nuovo marcatore fuori dalla tua portata", + "spotAdded": "Nuovo spot salvato sulla mappa", + "spotNotAdded": "Impossibile aggiungere lo spot", + "shopAdded": "Nuovo negozio salvato sulla mappa", + "shopNotAdded": "Impossibile aggiungere il negozio", + "barAdded": "Nuova barra salvata sulla mappa", + "barNotAdded": "Impossibile aggiungere la barra", + "spotEdited": "Spot modificato! Grazie", + "spotNotEdited": "Impossibile modificare il spot", + "shopEdited": "Negozio modificato! Grazie", + "shopNotEdited": "Impossibile modificare il negozio", + "barEdited": "Barra modificata! Grazie", + "barNotEdited": "Impossibile modificare la barra", + "spotDeleted": "Spot eliminato", + "spotNotDeleted": "Impossibile eliminare lo spot", + "shopDeleted": "Negozio eliminato", + "shopNotDeleted": "Impossibile eliminare il negozio", + "barDeleted": "Barra eliminata", + "barNotDeleted": "Impossibile eliminare la barra", + "markNameEmpty": "Non hai specificato un nome per il marcatore", + "markTypeEmpty": "Non hai specificato un tipo per il marcatore", + "markRateEmpty": "Non hai specificato una valutazione per il marcatore", + "markPriceEmpty": "Non hai specificato un prezzo per il marcatore", + "lockFocusOn": "Centratura e blocco vista sulla tua posizione", + "unlockFocusOn": "Blocco della posizione terminato", + "uploadPPSuccess": "Immagine del profilo aggiornata", + "uploadPPFailed": "Impossibile caricare l'immagine del profilo", + "welcomeBack": "Felice di rivederti su BeerCrackerz!" + }, + "nav": { + "add": "Aggiungere", + "edit": "Modificare", + "upload": "Caricamento", + "cancel": "Annulla", + "close": "Vicino", + "delete": "Eliminare" + }, + "map": { + "newTitle": "Nuovo marcatore", + "newSpot": "Aggiungi un spot", + "newShop": "Aggiungi un negozio", + "newBar": "Aggiungi una barra", + "planLayerOSM": "Carte OSM", + "satLayerEsri": "Satellitare ESRI" + }, + "spot": { + "addTitle": "Nuovo spot", + "editTitle": "Modifica spot", + "subtitle": "Un spot è un posto straordinario per rompere una birra! Condividilo con la community, che sia per la vista mozzafiato o per quello che è piacevole bere una birra!", + "nameLabel": "Dai un nome a quel spot", + "descLabel": "Perché non lo descrivi", + "rateLabel": "Dagli una nota", + "typeLabel": "Che tipo di spot è", + "forestType": "Foresta", + "riverType": "Fiume", + "lakeType": "Lago", + "cliffType": "Scogliera", + "mountainType": "Montagna", + "beachType": "Spiaggia", + "seaType": "Mare", + "cityType": "Città", + "povType": "Punto di vista", + "modifiersLabel": "Ha delle caratteristiche specifiche", + "benchModifier": "Panca", + "coveredModifier": "Coperto", + "toiletModifier": "Toilette", + "storeModifier": "Negozio nelle vicinanze", + "trashModifier": "Spazzatura", + "parkingModifier": "Parcheggio" + }, + "shop": { + "addTitle": "Nuovo negozio", + "editTitle": "Modifica negozio", + "subtitle": "The must have place to refill your beer stock. The more info you provide, the better you help your fellow beercrackerz!", + "nameLabel": "Nome del negozio", + "descLabel": "Perché non lo descrivi", + "rateLabel": "Dagli una nota", + "priceLabel": "Quanto costa", + "typeLabel": "Che tipo di negozio è", + "storeType": "Negozio di alimentari", + "superType": "Supermercato", + "hyperType": "Ipermercato", + "cellarType": "Cantina", + "modifiersLabel": "Ha delle caratteristiche specifiche", + "bioModifier": "Bio", + "craftModifier": "Artigianale", + "freshModifier": "Refrigerato", + "cardModifier": "Carta di credito", + "choiceModifier": "Ampia scelta" + }, + "bar": { + "addTitle": "Nuova barra", + "editTitle": "Modifica barra", + "subtitle": "Un bar è un luogo sacro dove puoi prendere delle birre alla spina ben fredde!", + "nameLabel": "Nome della barra", + "descLabel": "Perché non lo descrivi", + "rateLabel": "Dagli una nota", + "priceLabel": "Quanto costa", + "typeLabel": "Che tipo di bar è", + "regularType": "Regolare", + "snackType": "Merenda", + "cellarType": "Birrificio", + "rooftopType": "Tetto", + "modifiersLabel": "Ha delle caratteristiche specifiche", + "tobaccoModifier": "Sigarette", + "foodModifier": "Cibo", + "cardModifier": "Carta di credito", + "choiceModifier": "Ampia scelta", + "outdoorModifier": "All'aperto" + }, + "modal": { + "userTitle": "Account utente", + "userAccuracyPref": "Alta precisione", + "darkThemePref": "Tema scuro", + "userDebugPref": "Interfaccia di debug", + "startupHelp": "Aiuto iniziale", + "langPref": "Linguaggio dell'interfaccia", + "langFr": "🇫🇷 Francese", + "langEn": "🇬🇧 Inglese", + "langEs": "🇪🇸 Spagnolo", + "langDe": "🇩🇪 Tedesco", + "langIt": "🇩🇪 Italiano", + "langPt": "🇵🇹 Portoghese", + "aboutTitle": "A proposito di BeerCrackerz", + "aboutDesc": "Un'idea geniale di David Béché!
    BeerCrackerz è la comunità degli amanti della birra, piena di cacciatori di pinte e amanti dei cereali", + "updatePP": "Aggiorna la tua immagine del profilo", + "updatePPSizeError": "Seleziona un'immagine inferiore a 2.5Mo", + "updatePPDimensionError": "La dimensione minima dell'immagine è 512x512", + "updatePPTitle": "Nuova immagine dell'immagine del profilo", + "updatePPDesc": "Ritaglia l'immagine se necessario e vai!", + "logout": "Disconnessione", + "hideShowTitle": "Opzioni mappa", + "hideShowSpots": "Spots", + "hideShowShops": "Negozi", + "hideShowBars": "Barre", + "hideShowHelperLabel": "Fare clic su un'icona per visualizzarne la descrizione", + "spotHelperHideShow": "Per nascondere o mostrare tutti i spots sulla mappa.", + "shopHelperHideShow": "Per nascondere o mostrare tutti i negozzi sulla mappa.", + "barHelperHideShow": "Per nascondere o mostrare tutte le barre sulla mappa.", + "deleteMarkTitle": "Elimina marcatore", + "deleteMarkDesc": "Sei sicuro di voler eliminare questo marchio?
    Questa azione è permanente e non può essere annullata.", + "spotEditTitle": "Modifica spot", + "shopEditTitle": "Modifica negozio", + "barEditTitle": "Modifica barra", + "helpTitle": "Scopri BeerCrackerz", + "helpNavNext": "Vai alla pagina successiva o esci da questo menu di aiuto!", + "helpNavNextPrev": "Vai alla pagina successiva o precedente o esci da questo menu di aiuto!", + "helpNavEnd": "Ora puoi chiudere questa procedura guidata!", + "helpPage1": "Benvenuto in BeerCrackerz!
    Vediamo come funziona la mappa; la tua posizione è contrassegnata dal simbolo \"user-position\". Intorno alla tua posizione, un cerchio blu rappresenta la precisione attuale della tua posizione. Intorno a te c'è anche un cerchio d'oro ; questa è la distanza massima per la quale puoi dichiarare un nuovo spot, un negozio o un bar.", + "helpPage2": "Un spot è rappresentato dal simbolo \"spot-mark\". I punti sono luoghi perfetti per godersi una lattina di birra. Ogni spot ha le sue specificità, sta a te scoprirle.", + "helpPage3": "Un negozio è rappresentato dal simbolo \"shop-mark\". I negozi sono i luoghi ideali per fare scorta di lattine di birra. Ogni negozio ha le sue specificità, sta a te scoprirle.", + "helpPage4": "Una barra è rappresentata dal simbolo \"bar-mark\". I bar sono luoghi accoglienti che servono birre fresche e buone. Ogni bar ha le sue specificità, sta a te scoprirle.", + "helpPage5": "Sono disponibili diversi comandi: 1. scelta della mappa di base, 2. ricentra e blocca la mappa sulla tua posizione, 3. mostra o nascondi gli elementi della mappa e 4. il tuo account.", + "helpQuit": "Quit", + "helpQuitNoSee": "Esci e non vedere più" + }, + "popup": { + "spotFoundBy": "Un spot scoperto da", + "spotFoundWhen": "Dal", + "shopFoundBy": "Un negozio aggiunto da", + "shopFoundWhen": "Dal", + "barFoundBy": "Una barra aggiunta da", + "barFoundWhen": "Dal", + "spotNoDesc": "Nessuna descrizione disponibile per questo spot", + "shopNoDesc": "Nessuna descrizione disponibile per questo negozio", + "barNoDesc": "Nessuna descrizione disponibile per questa barra" + }, + "auth": { + "login": { + "headTitle": "Login | BeerCrackerz", + "subtitle": "Login", + "hiddenError": "Oh! Un testo nascosto!", + "username": "Nome utente", + "password": "Password", + "login": "Login", + "notRegistered": "Non sei ancora registrato?", + "register": "Creare un account", + "forgot": "Ha dimenticato la password", + "reset": "Ripristinalo", + "bothEmpty": "Si prega di compilare i campi nome utente e password", + "usernameEmpty": "Si prega di compilare il campo del nome utente", + "passwordEmpty": "Si prega di compilare il campo della password", + "credsInvalid": "Credenziali non valide", + "serverError": "È successo qualcosa di sbagliato, contatta l'assistenza", + "checkMail": "È stata inviata un'e-mail in modo da poter procedere" + }, + "register": { + "headTitle": "Registrati | BeerCrackerz", + "subtitle": "Creare un account", + "hiddenError": "Oh! Un testo nascosto!", + "username": "Nome utente", + "mail": "Indirizzo e-mail", + "password1": "Password", + "password2": "Conferma password", + "register": "Registrati", + "notRegistered": "Già registrato??", + "login": "Login", + "fieldEmpty": "Si prega di compilare tutti i campi obbligatori", + "notMatchingPassword": "Le password non corrispondono", + "activationSuccess": "Il tuo account è stato creato con successo!", + "activationError": "È successo qualcosa di sbagliato durante la creazione del tuo account, contatta l'assistenza" + }, + "forgotPassword": { + "headTitle": "Ha dimenticato la password | BeerCrackerz", + "subtitle": "Ha dimenticato la password", + "hiddenError": "Oh! Un testo nascosto!", + "mail": "Email", + "submit": "Resetta la password", + "loginLabel": "Te lo ricordi?", + "login": "Login", + "fieldEmpty": "Si prega di compilare tutti i campi obbligatori", + "serverError": "È successo qualcosa di sbagliato, contatta l'assistenza" + }, + "resetPassword": { + "headTitle": "Resetta la password | BeerCrackerz", + "subtitle": "Resetta la password", + "hiddenError": "Oh! Un testo nascosto!", + "password1": "Nuova password", + "password2": "Conferma password", + "reset": "Resetta la password", + "loginLabel": "Te lo ricordi?", + "login": "Login", + "fieldEmpty": "Per favore compila tutti i campi", + "notMatchingPassword": "Le password non corrispondono", + "serverError": "È successo qualcosa di sbagliato, contatta l'assistenza" + } + } +} diff --git a/static/nls/pt.json b/static/nls/pt.json index 191cc7d..e520e52 100644 --- a/static/nls/pt.json +++ b/static/nls/pt.json @@ -135,6 +135,7 @@ "langEn": "🇬🇧 Inglês", "langEs": "🇪🇸 Espanhol", "langDe": "🇩🇪 Alemão", + "langIt": "🇩🇪 Italiano", "langPt": "🇵🇹 Português", "aboutTitle": "Sobre BeerCrackerz", "aboutDesc": "Uma ideia brilhante de David Béché!
    BeerCrackerz é a comunidade dos amantes da cerveja, cheia de caçadores de cerveja e amantes de cereais", @@ -145,16 +146,13 @@ "updatePPDesc": "Recorte a imagem, se necessário, e pronto!", "logout": "Sair", "hideShowTitle": "Opções do mapa", - "hideShowLabels": "Etiquetas", - "hideShowCircles": "Círculos", "hideShowSpots": "Spots", "hideShowShops": "Lojas", "hideShowBars": "Bares", "hideShowHelperLabel": "Clique em um ícone para exibir sua descrição", - "labelHelperHideShow": "Você quer exibir ou não o nome da marca sob seu pin.", - "spotHelperHideShow": "Para ocultar ou mostrar todos os spots no mapa (também ocultará ou mostrará o círculo associado).", - "shopHelperHideShow": "Para ocultar ou mostrar todas as lojas no mapa (também ocultará ou mostrará o círculo associado).", - "barHelperHideShow": "Para ocultar ou mostrar todas as barras no mapa (também ocultará ou mostrará o círculo associado).", + "spotHelperHideShow": "Para ocultar ou mostrar todos os spots no mapa.", + "shopHelperHideShow": "Para ocultar ou mostrar todas as lojas no mapa.", + "barHelperHideShow": "Para ocultar ou mostrar todas as barras no mapa.", "deleteMarkTitle": "Excluir marca", "deleteMarkDesc": "Tem certeza de que deseja excluir esta marca?
    Esta ação é permanente e não pode ser revertida.", "spotEditTitle": "Editar spot", @@ -165,9 +163,9 @@ "helpNavNextPrev": "Navegue para a página seguinte ou anterior ou saia deste menu de ajuda!", "helpNavEnd": "Agora você pode fechar este assistente!", "helpPage1": "Bem-vindo ao BeerCrackerz!
    Vamos ver como o mapa funciona; sua posição é marcada pelo símbolo \"user-position\". Ao redor de sua posição, um círculo azul representa a precisão atual de sua posição. Ao seu redor, há também um círculo dourado ; esta é a distância máxima para a qual você pode declarar um novo spot, uma loja ou um bar.", - "helpPage2": "Um spot é representado pelo símbolo \"spot-mark\". Spots são lugares perfeitos para curtir uma lata de cerveja. Cada spot tem as suas especificidades, cabe-te a ti descobri-las. Ao redor do spot há um círculo verde ; representa a área em que você tem o direito de votar ou deixar comentários no spot.", - "helpPage3": "Uma loja é representada pelo símbolo \"shop-mark\". As lojas são os locais ideais para estocar latas de cerveja. Cada loja tem suas especificidades, cabe a você descobri-las. Ao redor da loja há um círculo azul ; representa a área em que você tem direito de votar ou deixar comentários na loja.", - "helpPage4": "Uma barra é representada pelo símbolo \"bar-mark\". Bares são lugares amigáveis ​​que servem cervejas frescas e boas. Cada barra tem suas especificidades, cabe a você descobri-las. Ao redor da barra há um círculo vermelho ; representa a área em que você tem direito de votar ou deixar comentários na barra.", + "helpPage2": "Um spot é representado pelo símbolo \"spot-mark\". Spots são lugares perfeitos para curtir uma lata de cerveja. Cada spot tem as suas especificidades, cabe-te a ti descobri-las.", + "helpPage3": "Uma loja é representada pelo símbolo \"shop-mark\". As lojas são os locais ideais para estocar latas de cerveja. Cada loja tem suas especificidades, cabe a você descobri-las.", + "helpPage4": "Uma barra é representada pelo símbolo \"bar-mark\". Bares são lugares amigáveis ​​que servem cervejas frescas e boas. Cada barra tem suas especificidades, cabe a você descobri-las.", "helpPage5": "Vários comandos estão disponíveis: 1. escolha do mapa base, 2. recentralizar e bloquear o mapa em sua posição, 3. mostrar ou ocultar itens do mapa e 4. sua conta.", "helpQuit": "Saia", "helpQuitNoSee": "Saia e não veja mais" From d79d5e424f44626214401bd77d3b6098454497e9 Mon Sep 17 00:00:00 2001 From: Raphael Beekmann Date: Sun, 2 Apr 2023 18:23:23 +0200 Subject: [PATCH 194/204] chore: use env bash for bc script --- bc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bc.sh b/bc.sh index 0477b0c..9ace8b5 100755 --- a/bc.sh +++ b/bc.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash vers="0.1.0" # Must match package.json and BeerCrackerz.js version number basedir=$(dirname "${0}") unset backsecretkey From 8b23108f8db9bedec021f755e2b7f4213e3a314b Mon Sep 17 00:00:00 2001 From: messe-basse Date: Sun, 2 Apr 2023 18:25:11 +0200 Subject: [PATCH 195/204] chore: change server port --- bc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bc.sh b/bc.sh index 9ace8b5..95fbebd 100755 --- a/bc.sh +++ b/bc.sh @@ -128,7 +128,7 @@ prodInstall() { echo "" echo "# BACKEND" echo "BACKEND_NAME=beer_crackerz_back" - echo "BACKEND_PORT=8001" + echo "BACKEND_PORT=8000" echo "BACKEND_DEBUG=0" echo "BACKEND_ALLOWED_HOSTS=127.0.0.1" echo "BACKEND_USE_EMAIL_FILE_SYSTEM=0" From 1cc992d12ecf74a159ac339bf2a7be3f8aa44867 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Fri, 7 Apr 2023 20:04:45 +0200 Subject: [PATCH 196/204] feat: remove labels --- back/app/templates/error.html | 2 +- back/app/templates/index.html | 2 +- back/app/templates/welcome.html | 2 +- front/src/BeerCrackerz.js | 15 +++++++++++++++ front/src/BeerCrackerzAuth.js | 4 ---- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/back/app/templates/error.html b/back/app/templates/error.html index 0dd6986..4e48541 100644 --- a/back/app/templates/error.html +++ b/back/app/templates/error.html @@ -6,7 +6,7 @@ Beer Crackerz - + diff --git a/back/app/templates/index.html b/back/app/templates/index.html index b2509ff..bddc599 100644 --- a/back/app/templates/index.html +++ b/back/app/templates/index.html @@ -5,7 +5,7 @@ Beer Crackerz - + diff --git a/back/app/templates/welcome.html b/back/app/templates/welcome.html index 6311307..63c02ff 100644 --- a/back/app/templates/welcome.html +++ b/back/app/templates/welcome.html @@ -5,7 +5,7 @@ Login | BeerCrackerz - + diff --git a/front/src/BeerCrackerz.js b/front/src/BeerCrackerz.js index efe383c..6258d7a 100644 --- a/front/src/BeerCrackerz.js +++ b/front/src/BeerCrackerz.js @@ -883,6 +883,11 @@ class BeerCrackerz { } + /** + * @public + * @property {Object} clusters + * Clusters that holds spot/shop/bar marks as subkeys + **/ get clusters() { return this._clusters; } @@ -898,11 +903,21 @@ class BeerCrackerz { } + /** + * @public + * @property {Object} kom + * The server communication component + **/ get kom() { return this._kom; } + /** + * @public + * @property {Object} notification + * The app notification handler + **/ get notification() { return this._notification; } diff --git a/front/src/BeerCrackerzAuth.js b/front/src/BeerCrackerzAuth.js index 64edf4f..31a0a9d 100644 --- a/front/src/BeerCrackerzAuth.js +++ b/front/src/BeerCrackerzAuth.js @@ -322,10 +322,6 @@ class BeerCrackerzAuth { px.y -= event.target._popup._container.clientHeight / 2; this._map.panTo(this._map.unproject(px), { animate: true }); }); - // Clustering events - this._clusters.spot.on('animationend', VisuHelper.checkClusteredMark.bind(this, 'spot')); - this._clusters.shop.on('animationend', VisuHelper.checkClusteredMark.bind(this, 'shop')); - this._clusters.bar.on('animationend', VisuHelper.checkClusteredMark.bind(this, 'bar')); // Center on command document.getElementById('center-on').addEventListener('click', () => { this._map.flyTo([this._user.lat, this._user.lng], 18); From 5fca111e0157fee5cdb20a765b7505b712554a18 Mon Sep 17 00:00:00 2001 From: ArthurBeaulieu Date: Fri, 7 Apr 2023 21:59:58 +0200 Subject: [PATCH 197/204] feat: update help images --- front/package-lock.json | 18800 -------------------------------- static/img/doc/bar-mark.webp | Bin 42728 -> 173462 bytes static/img/doc/commands.webp | Bin 18530 -> 44610 bytes static/img/doc/shop-mark.webp | Bin 42572 -> 198228 bytes static/img/doc/spot-mark.webp | Bin 33152 -> 118130 bytes 5 files changed, 18800 deletions(-) delete mode 100644 front/package-lock.json diff --git a/front/package-lock.json b/front/package-lock.json deleted file mode 100644 index 9998f6e..0000000 --- a/front/package-lock.json +++ /dev/null @@ -1,18800 +0,0 @@ -{ - "name": "beercrackerz", - "version": "0.0.2", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "beercrackerz", - "version": "0.0.2", - "license": "GPL-3.0", - "devDependencies": { - "@babel/core": "^7.20.12", - "@babel/preset-env": "^7.20.2", - "babel-loader": "^9.1.2", - "clean-webpack-plugin": "^4.0.0", - "css-loader": "^6.7.3", - "cssnano": "^5.1.14", - "eslint": "^8.32.0", - "eslint-webpack-plugin": "^3.2.0", - "file-loader": "^6.2.0", - "http-server": "^14.1.1", - "jasmine": "^4.5.0", - "jasmine-core": "^4.5.0", - "jsdoc": "^4.0.0", - "karma": "^6.4.1", - "karma-firefox-launcher": "^2.1.2", - "karma-html2js-preprocessor": "~1.1", - "karma-jasmine": "^5.1.0", - "karma-jasmine-html-reporter": "^2.0.0", - "karma-webpack": "^5.0.0", - "mini-css-extract-plugin": "^2.7.2", - "node-sass": "^8.0.0", - "postcss": "^8.4.21", - "postcss-import": "^15.1.0", - "postcss-loader": "^7.0.2", - "postcss-preset-env": "^7.8.3", - "sass-loader": "^13.2.0", - "stylelint": "^14.16.1", - "stylelint-webpack-plugin": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.75.0", - "webpack-cli": "^5.0.1", - "webpack-merge": "^5.8.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", - "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", - "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@jsdoc/salty": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.1.tgz", - "integrity": "sha512-JXwylDNSHa549N9uceDYu8D4GMXwSo3H8CCPYEQqxhhHpxD28+lRl2b3bS/caaPj5w1YD3SWtrficJNTnUjGpg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", - "dev": true - }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "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/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001439", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", - "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/clean-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", - "dev": true, - "dependencies": { - "del": "^4.1.1" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.0 <6.0.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "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/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "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/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", - "dev": true, - "engines": { - "node": ">=12.22" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssdb": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.2.0.tgz", - "integrity": "sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "node_modules/date-format": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.13.tgz", - "integrity": "sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", - "dev": true, - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", - "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dev": true, - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "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/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/finalhandler/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": 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/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "dependencies": { - "globule": "^1.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "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": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "node_modules/globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "dev": true, - "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/globule/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "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": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globule/node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "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-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "dependencies": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "bin": { - "http-server": "bin/http-server" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/http-server/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/http-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/http-server/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/http-server/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/http-server/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-server/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "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/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "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-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, - "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-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jasmine": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.5.0.tgz", - "integrity": "sha512-9olGRvNZyADIwYL9XBNBst5BTU/YaePzuddK+YRslc7rI9MdTIE4r3xaBKbv2GEmzYYUfMOdTR8/i6JfLZaxSQ==", - "dev": true, - "dependencies": { - "glob": "^7.1.6", - "jasmine-core": "^4.5.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.0.tgz", - "integrity": "sha512-tzTgkklbWKrlaQL2+e3NNgLcZu3NaK2vsHRx7tyHQ+H5jcB9Gx0txSd2eJWlMC/xU1+7LQu4s58Ry0RkuaEQVg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.9.4", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", - "dev": true, - "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-firefox-launcher": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", - "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", - "dev": true, - "dependencies": { - "is-wsl": "^2.2.0", - "which": "^2.0.1" - } - }, - "node_modules/karma-html2js-preprocessor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz", - "integrity": "sha512-SiaPXNxIQjzBnxbi0mOT24zCzjFWBGaxWM/DqnEhp4WbI5kNpiZ35Jb/h7etrob+wiDSuDkltCuxE/fMSayqeQ==", - "dev": true, - "peerDependencies": { - "karma": ">=0.9" - } - }, - "node_modules/karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "dependencies": { - "jasmine-core": "^4.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "karma": "^6.0.0" - } - }, - "node_modules/karma-jasmine-html-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", - "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", - "dev": true, - "peerDependencies": { - "jasmine-core": "^4.0.0", - "karma": "^6.0.0", - "karma-jasmine": "^5.0.0" - } - }, - "node_modules/karma-webpack": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.0.tgz", - "integrity": "sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "webpack-merge": "^4.1.5" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/karma-webpack/node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/karma/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/karma/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/log4js": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.1.tgz", - "integrity": "sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==", - "dev": true, - "dependencies": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "flatted": "^3.2.6", - "rfdc": "^1.3.0", - "streamroller": "^3.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.4.1.tgz", - "integrity": "sha512-sLODeRetZ/61KkKLJElaU3NuU2z7MhXf12Ml1WJMSdwpngeofneCRF+JBbat8HiSqhniOMuTemXMrsI7hA6XyA==", - "dev": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node_modules/node-sass": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-8.0.0.tgz", - "integrity": "sha512-jPzqCF2/e6JXw6r3VxfIqYc8tKQdkj5Z/BDATYyG6FL6b/LuYBNFGFVhus0mthcWifHm/JzBpKAd+3eXsWeK/A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "async-foreach": "^0.1.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "make-fetch-happen": "^10.0.4", - "meow": "^9.0.0", - "nan": "^2.17.0", - "node-gyp": "^8.4.1", - "sass-graph": "^4.0.1", - "stdout-stream": "^1.4.0", - "true-case-path": "^2.2.1" - }, - "bin": { - "node-sass": "bin/node-sass" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/node-sass/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-sass/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-sass/node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/node-sass/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/node-sass/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/node-sass/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-sass/node_modules/cacache/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-sass/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/node-sass/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/node-sass/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/node-sass/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-sass/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/node-sass/node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/node-sass/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-sass/node_modules/minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-sass/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/node-sass/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/node-sass/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-sass/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-sass/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-sass/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/node-sass/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-sass/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-sass/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-sass/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "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.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "dependencies": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dev": true, - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.3.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.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/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "node_modules/requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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/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-graph": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", - "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "lodash": "^4.17.11", - "scss-tokenizer": "^0.4.3", - "yargs": "^17.2.1" - }, - "bin": { - "sassgraph": "bin/sassgraph" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/scss-tokenizer": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", - "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", - "dev": true, - "dependencies": { - "js-base64": "^2.4.9", - "source-map": "^0.7.3" - } - }, - "node_modules/scss-tokenizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socket.io": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.2.tgz", - "integrity": "sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dev": true, - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/stdout-stream/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/stdout-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/streamroller": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.2.tgz", - "integrity": "sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==", - "dev": true, - "dependencies": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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_decoder/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "bin": { - "stylelint": "bin/stylelint.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" - } - }, - "node_modules/stylelint-webpack-plugin": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-3.3.0.tgz", - "integrity": "sha512-F53bapIZ9zI16ero8IWm6TrUE6SSibZBphJE9b5rR2FxtvmGmm1YmS+a5xjQzn63+cv71GVSCu4byX66fBLpEw==", - "dev": true, - "dependencies": { - "globby": "^11.1.0", - "jest-worker": "^28.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylelint": "^13.0.0 || ^14.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/stylelint-webpack-plugin/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-webpack-plugin/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/stylelint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/stylelint/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "node_modules/stylelint/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dev": true, - "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "dependencies": { - "qs": "^6.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "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/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", - "colorette": "^2.0.14", - "commander": "^9.4.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "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/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", - "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", - "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", - "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz", - "integrity": "sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", - "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", - "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz", - "integrity": "sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", - "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true - }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jsdoc/salty": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.1.tgz", - "integrity": "sha512-JXwylDNSHa549N9uceDYu8D4GMXwSo3H8CCPYEQqxhhHpxD28+lRl2b3bS/caaPj5w1YD3SWtrficJNTnUjGpg==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", - "dev": true - }, - "@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "dev": true, - "requires": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.0.1.tgz", - "integrity": "sha512-njsdJXJSiS2iNbQVS0eT8A/KPnmyH4pv1APj2K0d1wrZcBLw+yppxOy4CGqa0OxDJkzfL/XELDhD8rocnIwB5A==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "requires": {} - }, - "@webpack-cli/serve": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.1.tgz", - "integrity": "sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.2", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "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 - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "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, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "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, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001439", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", - "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", - "dev": true - }, - "catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "clean-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", - "dev": true, - "requires": { - "del": "^4.1.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "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 - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "core-js-compat": { - "version": "3.26.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", - "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "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 - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "corser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", - "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", - "dev": true - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-declaration-sorter": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", - "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", - "dev": true, - "requires": {} - }, - "css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", - "dev": true - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dev": true, - "requires": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssdb": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.2.0.tgz", - "integrity": "sha512-JYlIsE7eKHSi0UNuCyo96YuIDFqvhGgHw4Ck6lsN+DP0Tp8M64UTDT2trGbkMDqnCoEjks7CkS0XcjU0rkvBdg==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "5.1.14", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", - "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.13", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.13", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", - "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.3", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.1", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", - "dev": true - }, - "date-format": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.13.tgz", - "integrity": "sha512-bnYCwf8Emc3pTD8pXnre+wfnjGtfi5ncMDKy7+cWZXbmRAsdWkOQHrfC1yz/KiwP5thDp2kCHWYWKBX4HP1hoQ==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "engine.io": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.1.tgz", - "integrity": "sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - } - }, - "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "8.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz", - "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dev": true, - "requires": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "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, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "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" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", - "dev": true - }, - "globule": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", - "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "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" - } - }, - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-server": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", - "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", - "dev": true, - "requires": { - "basic-auth": "^2.0.1", - "chalk": "^4.1.2", - "corser": "^2.0.1", - "he": "^1.2.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy": "^1.18.1", - "mime": "^1.6.0", - "minimist": "^1.2.6", - "opener": "^1.5.1", - "portfinder": "^1.0.28", - "secure-compare": "3.0.1", - "union": "~0.5.0", - "url-join": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ignore": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", - "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "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, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "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 - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", - "dev": true - }, - "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 - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "jasmine": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.5.0.tgz", - "integrity": "sha512-9olGRvNZyADIwYL9XBNBst5BTU/YaePzuddK+YRslc7rI9MdTIE4r3xaBKbv2GEmzYYUfMOdTR8/i6JfLZaxSQ==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "jasmine-core": "^4.5.0" - } - }, - "jasmine-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.5.0.tgz", - "integrity": "sha512-9PMzyvhtocxb3aXJVOPqBDswdgyAeSB81QnLop4npOpbqnheaTEwPc9ZloQeVswugPManznQBjD8kWDTjlnHuw==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "requires": { - "xmlcreate": "^2.0.4" - } - }, - "jsdoc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.0.tgz", - "integrity": "sha512-tzTgkklbWKrlaQL2+e3NNgLcZu3NaK2vsHRx7tyHQ+H5jcB9Gx0txSd2eJWlMC/xU1+7LQu4s58Ry0RkuaEQVg==", - "dev": true, - "requires": { - "@babel/parser": "^7.9.4", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "karma": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", - "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.4.1", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "dependencies": { - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "karma-firefox-launcher": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz", - "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==", - "dev": true, - "requires": { - "is-wsl": "^2.2.0", - "which": "^2.0.1" - } - }, - "karma-html2js-preprocessor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz", - "integrity": "sha512-SiaPXNxIQjzBnxbi0mOT24zCzjFWBGaxWM/DqnEhp4WbI5kNpiZ35Jb/h7etrob+wiDSuDkltCuxE/fMSayqeQ==", - "dev": true, - "requires": {} - }, - "karma-jasmine": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", - "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", - "dev": true, - "requires": { - "jasmine-core": "^4.1.0" - } - }, - "karma-jasmine-html-reporter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.0.0.tgz", - "integrity": "sha512-SB8HNNiazAHXM1vGEzf8/tSyEhkfxuDdhYdPBX2Mwgzt0OuF2gicApQ+uvXLID/gXyJQgvrM9+1/2SxZFUUDIA==", - "dev": true, - "requires": {} - }, - "karma-webpack": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.0.tgz", - "integrity": "sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "webpack-merge": "^4.1.5" - }, - "dependencies": { - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "log4js": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.6.1.tgz", - "integrity": "sha512-J8VYFH2UQq/xucdNu71io4Fo+purYYudyErgBbswWKO0MC6QVOERRomt5su/z6d3RJSmLyTGmXl3Q/XjKCf+/A==", - "dev": true, - "requires": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "flatted": "^3.2.6", - "rfdc": "^1.3.0", - "streamroller": "^3.1.2" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } - }, - "markdown-it-anchor": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.4.1.tgz", - "integrity": "sha512-sLODeRetZ/61KkKLJElaU3NuU2z7MhXf12Ml1WJMSdwpngeofneCRF+JBbat8HiSqhniOMuTemXMrsI7hA6XyA==", - "dev": true, - "requires": {} - }, - "marked": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz", - "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", - "dev": true - }, - "mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", - "dev": true - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", - "dev": true, - "requires": { - "schema-utils": "^4.0.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "npmlog": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.1.tgz", - "integrity": "sha512-BTHDvY6nrRHuRfyjt1MAufLxYdVXZfd099H4+i1f0lPywNQyI4foeNXJRObB/uy+TYqUW0vAD9gbdSOXPst7Eg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.0", - "set-blocking": "^2.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "node-sass": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-8.0.0.tgz", - "integrity": "sha512-jPzqCF2/e6JXw6r3VxfIqYc8tKQdkj5Z/BDATYyG6FL6b/LuYBNFGFVhus0mthcWifHm/JzBpKAd+3eXsWeK/A==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "lodash": "^4.17.15", - "make-fetch-happen": "^10.0.4", - "meow": "^9.0.0", - "nan": "^2.17.0", - "node-gyp": "^8.4.1", - "sass-graph": "^4.0.1", - "stdout-stream": "^1.4.0", - "true-case-path": "^2.2.1" - }, - "dependencies": { - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - } - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", - "dev": true - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", - "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } - }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "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 - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "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 - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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 - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", - "dev": true - }, - "postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - } - }, - "postcss-merge-rules": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", - "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dev": true, - "requires": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-reduce-initial": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", - "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true - }, - "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "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 - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "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, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "requires": { - "resolve": "^1.20.0" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "requizzle": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz", - "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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 - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.1.tgz", - "integrity": "sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.17.11", - "scss-tokenizer": "^0.4.3", - "yargs": "^17.2.1" - } - }, - "sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "scss-tokenizer": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.4.3.tgz", - "integrity": "sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==", - "dev": true, - "requires": { - "js-base64": "^2.4.9", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - } - } - }, - "secure-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", - "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socket.io": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.2.tgz", - "integrity": "sha512-6fCnk4ARMPZN448+SQcnn1u8OHUC72puJcNtSgg2xS34Cu7br1gQ09YKkO1PFfDn/wyUE9ZgMAwosJed003+NQ==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" - } - }, - "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, - "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dev": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "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, - "requires": { - "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" - } - }, - "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, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "streamroller": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.2.tgz", - "integrity": "sha512-wZswqzbgGGsXYIrBYhOE0yP+nQ6XRk7xDcYwuQAGTYXdyAUmvgVFE0YU1g5pvQT0m7GBaQfYcSnlHbapuK0H0A==", - "dev": true, - "requires": { - "date-format": "^4.0.13", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - } - }, - "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" - }, - "dependencies": { - "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 - } - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", - "dev": true - }, - "stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "requires": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - } - }, - "stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "dependencies": { - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "stylelint-webpack-plugin": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stylelint-webpack-plugin/-/stylelint-webpack-plugin-3.3.0.tgz", - "integrity": "sha512-F53bapIZ9zI16ero8IWm6TrUE6SSibZBphJE9b5rR2FxtvmGmm1YmS+a5xjQzn63+cv71GVSCu4byX66fBLpEw==", - "dev": true, - "requires": { - "globby": "^11.1.0", - "jest-worker": "^28.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dev": true, - "requires": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "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, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "true-case-path": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", - "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "dev": true - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "union": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", - "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", - "dev": true, - "requires": { - "qs": "^6.4.0" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", - "dev": true - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "webpack-cli": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.1.tgz", - "integrity": "sha512-S3KVAyfwUqr0Mo/ur3NzIp6jnerNpo7GUO6so51mxLi1spqsA17YcMXy0WOIJtBSnj748lthxC6XLbNKh/ZC+A==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.0.1", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.1", - "colorette": "^2.0.14", - "commander": "^9.4.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz", - "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "requires": { - "iconv-lite": "0.6.3" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "requires": {} - }, - "xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/static/img/doc/bar-mark.webp b/static/img/doc/bar-mark.webp index c0cea9b5aea2ccf7e983b9ba84f41002e266fee0..7825e8ec976f436b889679f986e5f6a85b5e27d9 100644 GIT binary patch literal 173462 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 literal 42728 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�QWBOl?lWqOc;z7^^Pg1OfH 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 literal 18530 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 x4Rkx z*~3${!iS3uZN)!2a(DFbWfn>QSqsHkV&1>GJbbyVT@hNv+3OODBL#0ZZVQ_Fk}L&= znXTEb=u|T6wf)1Mb{IA!m?Mj95kfwfFM-~;8P>IwAK$9VPFe!_fx$LMnGef-_Dnw4Xn*d&$ezR4Rj#AuLiie@DN)e)ypvINQnIDhLG z({6AdaBPsvha}`-qyCHZqPF4PGk1su`OkF>BGkEDElU<_IP=5pCqL(X+@;{xD)gcX zl`)X!P*8`nGfEpu=#<*g9%iM>tI3JSFwz`@00`saAvFMW1%2SqDAdo~p4_Piavt-6 zm|iIG*uyjcMb$Ywba!QPWoV=MRGY#FV%?7AYDhYbteM*_rD5c6a!yd_P}jIc8$XZJ zXO2_Na>SUpk9(4cH*v&EG7YmdajIla_RZLGVHd9-i?<}8hyyhtWtKGkxshXdD6kT_ zQ^{S+fO!*CzzYzBCc?*vtg>muQ04!HBwyXQ`%6oDi+Zf~d`HnB8sBkf^o;xh$6?CT!#1uy0M-0*5$>^XB!c*JTcFe2H=WMb^~RIGzbha& z8!P@Yb80oA9Go7Q^&S|CMd6BIa5e;B6s|%po59%a;w4Hcz@Op+7W&cKeb>SdnFfA) zcM>AIWTEr73y9NY1BoMA4f#;}rr-v=Z(KH!6X}sMM}UK4NpUD6*^M24GVXws5u~u1 zxE>-cb;vzzWQ`n#WD~I?H>^j6REKm3$XN*Uj;u(C1@D1Cms+LQ!>Y6ASdc{vBz8x2 zmvkCqvg#R+??x1zzVU5+5z~VX(YUNZaQliYVAjj|*|FSy3HzB8b899gv0%^?@%NvJ zGQLgIQM>AuFw)K#c}s>%Vz4^oSVI~Vc6_Qv&Kp4TTxUZ8kGd&g05E6(*1;HR6%EVX zH2nG>QRR{VvidKA*h76Z5bHP*kEa@>$tDs>>Z*?O;qn<-x$qbQqaJDho)c z3bESRW?EYnN8_32F)zVDVgOCDpHKpLvJF9iB*)=Nd-a+wSOIr88iW}5EJ0RTv4#FP zL^i}|w(*HPR}O|1oLFm%EhIqE#yjh}SQEkJ(fVD5%I=Nva2`5eoq}3ESGu!6H~|EE zHD6r1JF;6KNT32C0RAO{r!dx-==P-iC)z%}@*a2sl^aHOjZ5`~2bs2VoOc6L$Fk>h zUjU++O&4I$C5qDvC+)t`UWPQ~-~X4J4@W@cl^&N_r6bof6AVOz>80pjaKxbDJv6$0 zbc@?$h+Ny@%(Zn9;-pGUKNXQu5)3W2aFsG&Agjz+OP3SWPT?e^$a3hz_sx-J&wm;Z z`-?j+Ce7Kw?07?M->_*K7?dT@qRE)4eecZA(5{R>gP|@POdX#hpO))sE$J3((!303 zADB$;ZJd`;Uy3!G@qDEu+M?dRr&=I!bWz3T#`5YR+D8*yosj$=64^y_@)@QFI=^UK z>Y!E_8~2K)Xqmr{%>&!R75_nS*$^`!eKi$BTx171VydKkm&){GH6jt zVN+5X6u&)+Fz*0b6m;Q82D%nC_sVq1dD4h*UW+pd9#H(vmmz{HfT$<#e%QKx%jK95TtfB;ai|pKXO=Di| z+vDak#cFQs?;LhD`Qj{H6%Q-!a&N36Bj!UzQ_Eb!ul$EjD_bu6DO5hna9Qk;@sDJP z^<~L8>|^HL9a+}MQFpv5=EMsbJh3D7HD<}*$Fpq!ij z=3ltdAjeLCfyGZ)EPL^G%ugPq5%z3X$schBTf);r4&6=z*jU?cZ$ro>|2gV1fwM(< zdDRKb2F7Ke{1Xs$%zcva5$#4n#)$#=RZG_zr`gd(k~E*z4~-+~e^zdG6#8H?f+Y6l zcMhDHpT2$w5YUPo0{-jd@?%VcJPquweGv9=Gf3-)+AL{Awd&QMba2*Z)L?S`SCT?; z+T=Gk$kqy7HZG~b?{j0d`1z)!BnN5S!G@-xy$qM2xi>SwD?1AjHn;oc~kRoYCzJFIVP zjO5zkmq?JZ37l{epqauXoS@W43&kd=bkwn>1xo#lixy|ytzu2}WRsH94_;d-pbubf^!kablmxrA&qTMj>9P^&|(^j)z-iV&9 z!-Re=0|=$BuIFA3#b-o#QR1Qe5)V(%0Wi}}i(9|o`5Q@aT#1g?8sc*ihQ-5_nIQg- zYduz<+~GUNDl1mQ>>+&@(Sw{P)aQa;Hf!H_~^ZPWB??3&;dL|;JOu03xg1&vm7 z!F{x11Kx4xUgL{caV#321gAV}3sVF1HZp~@)QG@N!#;UID)Kw*1XW2YD#uzff>@k~ zjB^cGoBTi4%UFJG=BoJaLaF^V6RJ8`QmOC`y@E5Oki8OyeK7;ZRaX3M*hdwy9^CSO zZ0hcbHM6IC`am%B2YF()USY-N$G`}-wjgGT7>oZAP9=Ep zxcA9zrJzZ%cu?9ySUM>ggg8;6qc2C4`+F-`BmEuUO-NRuj(f4XW>S}tXb5#4R@p?# zb+FC(9|CI9U`6Tl83S&e0+z*Eh@b;%D##KqVtr`rfCn80t#t08DM6>5Lv&~J+>Fxy zCs&R|ira&|Z^dM=Kxob;ML+-~$HHb&y3JoWW^DwIutDw8y4W_Lq%Rl?ul{<1-tz~B z^XZ5I2dv(Ny;V=``jot*KKw>Dg(}f-A25;bhK6ZuUVWC5q(ch8wRDodr(>~6Iy^&0 z207uDoP?VdHrg`yMc%4QxE2En4Fb~WkmRNW@bl(@QyqVFf2f0EO?Lgi5CPt0A)EkA z!V$>sdSEOE!l6NT2@3c!3fzyMJ)lG(E~HUvvdrFBJn$9TlL0(Ta{~ge3?)>JC&U5- zkpYDj(NY0`0omDt6+5gFVF>1RdWsE-3i9p^m2Wybu+|0Y%C=PnP+)qRsS^C&5!?)9+Jl~2Eoiris+~qY$;#2eTE}`)v>a0#; z3=hH6O)@%?jz$bQ7o@2A)beCk7CS=#b7ZPNk!g_!haSI&u&OU9X;EQ=JZAli4*wz= z^YgxI%+nHT>~3vXzxkrcrsBwS{=&wVtZ*F}7Zl8Hj55-o7A^M%2sFs0eqM=tr#;*0J^cwyjfXy1s zTcD5Df0U_ajICDaw4p-IDgLKuZg@QiIqQ7PTCI$ z6p+yGyBx_tZ*!J#mN!yk$}gyjLD?N?u`y_!s-YPZwPB**C($g^6vvbEAtClU0O{VG zp`<7&nh{hUL7$$SRYq6y`oMroVt6Dkt1>MP=y%8V!>u}_NYXVmNB; z6S1Vd9u6E=b6^g3vA3aVi^U3S$&Lx|vu-uL#$q};sP*ohL3eR`hAWIaX|UY2AleQg~o$s(Ru(U_y6;lv6CVV#S$HOM?ee#}-tbq}yn5K`UBp%Q=@R z!YVz!ZyERH^xjMDMJHd?I8ZGu_r^_|D7)P0PZG)9!}n$_?tZFS#jfv#>~MPA?PQFSDEo)}zuZ9~Gk_H9o8GcazXPN8 zM}`H)0WgL|w&&-BTSrLKz%knxNHBr#{r-wk@>&AR@sD@!q`xfMP` zAX~W?yqZj`U;MEqqzuu0mRg!_?tTL8*HR3FUHTP6UY5lg&Y@jEF~m3Kr>5<5IY-dM z`*>t3{@+gcIY?qi2GtSH9EcFOxzjEB?w!d{Xg!;;5~JOU0rd#{MSuj@#hb}NP)`!O zWlGNKCF8O#p`2LOu&)q2d8$kFLd_(b#z_05393#mKM!`E$U}U@vf{L1&f<#KGg;5` z-tG@Q@bhrqxP);(xkSoQ#DsCzFBQQ+3|?Ngs9nr8v zZXRX!yWRSBAQw3_r((Z8j(Hy*A!hi*-Ggdyy{CeB3%KSDG!CeX3n)w(Q;mwV@C=r7T z2fz56YGBop{&$-xmH=ZHGD^E^zL58^ztF$_^@1lnD;(~FhmG0!;BV+Da<$+5rE>bU z*^tC11XU=%fJ3uhqD_FA^>23POl(c=Y;l>wlXV+Oa%;>r#;YJ+y^X|{tk#}_mK%aY z^}JgHvq~UieaNqkTAZYKR&aZg(4;_*mzgJsE5n~qbbn1flHI27;%ai=rIL|wG(H7% z-zf*T+?q~*C*xI|RWNk^FTmK;uSsQA03*BBdRac#O!HN8x&(rqd3AlNLD%3V+xL!d zD!QxOhSvj0Gs@-q!{$u{sxHNE4M{xx9yDgi@xK|o)=IRF%!WQLIeZW0^k#-V9e+^g zJ@}9AzhD6hhyp39P^-<;xmHBiESGz)Q0?{ps3Gj-Qj6ML**cRqtfe$=*M$7eLCfg|JmkVt zS{Oed18iMWb=xyinpaNZE7P0K$^CKNTG*|>bVh0pMBMtxu8l(Eil7^h$Ny(>J_T}2 zMW>U>@nw}H^>1rWpWe}5n zqZ`VTP=dy?LFuC}sI_FLuhBM2Qh~n8<7U(s z*5cm@IE*LEoud9>7#cItLz!6n5|(42#Jq#Y7VF7?`Zq>NE$31B&6FR04|YQxD^U>c zCLb`tI^|6(N1@ATVR-H&m6g8hc?fFZT{3$T)Nv>G<$~*73|=iJ7n$Qs9-}6StS9^q zp7~dV9!61>VM6CtX4#XsU~;>YQ+4hH|3Lo^owH=R_=CF%N-eNa7KzlE=pVt=gO7eX z+gsY|y96D9`HEYU{q;qFGk&)bAUjPy8-k@ooKsQ;Naes;$=FG_JtZg@b$+{MLVm~Q z{#jUbaxrL*RZqWBMpEA#rPmu0{}N)r3P3|P`w5%yi*%N~KgfNn2&T3RW!oK=(x8Zl zDp)5EnY=ls3Eo@~8ubcIwPIy>*N38QR4r}n5P@G$Z;wAPC8g58N4spcX6-L%kHj{= z%CI8|^%2!4BK!8SNK*?^G6Q?Jme7Fi~VburZvjblA0Bhi|O_H z06mXiw-zqz8eI0j5bGjvF%Ncgwq9k<{kz?Mz^p>}nE>A__Oxo~UI~z>QO|F?0OXO` zVwowU8Aq_Miz@LmtpCQf>%p`?G3p!uhY6)fuxwkRdjzcGO%--%u9ZL(Mvn#0KE$U? z6S3DoR!r120FKMTlcQzCAcry9SZxRM{sOS_a7ijWhSObMT|sEjzjR{2l{&6lK64Zg4`Fa8sd`= zq}Gb1qz3>m<6jhiJq_>*Yow)H(VFhUnD4}v3sdm)uS)pWru4+f{YqoOJV3^DS?C5` zx}MP)&_*FhB}LidRDvq?8n@Vjr(8SgG^Z&uFUDo0mAhyg**E;AO2C13i9=Y2J*EM_ z08<>6Ku|ESogeaa516w*i3+K!`!w$9Al+yY0Z8|fm^#r0$a=zR2UjB&^(cyn9|qOV z^R%e0%&AnphY?m1`lJ%(=GWV*0)BMn;x2m$!B=y=WivZ!Tccd1%f^chVJgC0VY*)IVTiRU-y51d6h;Qc$<=3CEyFGfu@X3#S8w?; zDoM|>BL3f`m#sqOKUC2^!h(TAN<3};kN^skDOT%Br(*7<3*?q|T3rfF16)y0S7seR zvfU9bp&Q61gX= zlYHCOP*Rjz=~jV{jvSYZ$atQtF@s&#%}5*3#md{KefAnZesd2g|A4@NlI5Y)z^tEV z6}aC(AKGNPsp%sWZ@~tf!cUiv`yO+QI)0s*@nUdOH1Jhs@PKgvak;hExuVsXAOha` zH3$Gd+iAZ|UI?J1D$NEyf9=KC-9g64naKEsC?YLbz0UX0dSPo{nsr|h<;wqL6&;Y( z1*)2;t5YNhbl>f`MpRBKNR2gjYe&+KCeFGXQgs?#xRbTkxSBn%fm4mId_R_3swPl9huE~Ui8~u_t%Dx-)UQn{h! z02){dv%yS&^GB9+Ov;GG9lX@xfLk+m6#Vo|lvo7&ysaQVGAvmxkr=kUpg7m(IULn~ zvg14fUn4tg0l1Y;f>A~;w{5mh-oymT^g}?ICs&||wQF!K4I9}9v>~hYdnC$sgN{4` zvhRF{!yjOl=vROYGX&nNTnxjXRIKOYMD`rn@(&xLUARgxHUfaGJy8Fpk#|wZ_}qX{ zJT+1?A(ey!JTejhFs!M@`-V&di!S=r3;Ly04m6rvD38p%0LSH+^Wj#brWvO2s7bjC z#}}SJ;BFsO%8XAvW*&OZ2*t%Coqwt4D@Ka^;=6ByAzQ+ze4$rbT=pWVinBV^WW3QYIYRPkdC+LA9k`=LIm-7!a z(L1^L_c5jMQ+@f(Vh%8}DR7ZLR`wk5I8J-?p4Fe7lwtOv5M8dUbhT%f>4-#gUfoo{ z2;UT_qzxvlL4y_1A1XW%mOx=_TKb^K-W6GvwSI;Y2@qAzI5M~keCv2J3 z;p^3;R2~r(P3HC>OgHxpf)gxcj80kZ2URZyu7+j`J!asJormmhex_v^}Ai za2|r=c z1C{??m^YEqiJd|4aO0W``-%h-FTKA2U*F>cbYZ&b^>Ksax^hO!f~Y1!!p>DcPhLLY z7P9Emiyo`|8Btl|9VT*4!Bu$k6v?XF(A8a2fDqT8j+`pg%BE9B*#IfnET^whd1Y=Da6}lF3h$xR zN5lM$d2>c8vK0|eju<@Z!uwn(kqK#;0`4mpdVn9 zB}wqUFwQPuzJyxIrT3v(jIQ}P>$5nnD+!U`5*;rtd_S-GfM^OsFtkJu%e1+kJeA+= z1r&@G0ew_; zG+cly@2ft-GZ-Rl4#c!d0XPIcQ;Kai&bM?$-C!_QRpvi@J7A7LcW+7CPi?|{?%nll z0nKgxW;B;;|eraVAP!?&`G7+H9L^)6N;!Vx@gDkG9XoJ_yK3A4Olx z5y5Ndh9Da5LMcntcJwTvgSY-*G+kk;8qYLXIQZQ`C>CUX>o|sshcc&23QWH)00DPRL!)}Hb+Z~ zm-IbbVOMhg2XMWe>85l4`y|d*RJ?KEk|Gck0OqO&^8E#eb2}+;tG>QEI~S2zopigh zG~KVfE!*&#j_3(ZAs*}-WlwjsB$+d|gjiR6^2BaOc)qyZ0XFI1uZ0w@_Zip)fNkC- zgv9>qFh#VQS8kqQzk>MLfPXw5q@-2zjY*lJ%;vvi#+(vr3EONL#ngu&ChvoltY#LX z$v<*Qe=Vi)`Iov!R zo?Od*G22Z$d+!3xL2|%7VT_OfL1D3MM)jBVNO4`^5Epn=mn($h5cHGS!g>t$^(pJS zWX+8TX@ui;88h7+(6>pD2qYF$RO6~cS;!%Kovyjk6&+)Rae{GOawcLRZ~bE?~fK=s9{^_WP|JSFXwP-52zqM-7i*o{v>qBI*$p50uxh`pb_FNyiRvf-** zr*XpI{X5k)zzuu(u(6&00bgvZUqYUSTpQxsL7>u>2B&SdLxI@HJN`k>! z$d?2n=l%=B*6>bZ#!mUn^_;oYzVOl-^3hhm7$f8Zxs3Qg!FC{8Milqh@42$S1|=S* zE~s6Tw1~r0FS2A@k7cjs=TDK*H4-#7vSGTj8b#d4ohtE>6C7-2*>iR22S`3 zkJ;#~;EWTDYJItA5#yG$;>khze49b!08RCS5G<^8iG{`%Nwes!SWBs7WzE@9rjZ^m z#0LG zj31-;l6!ENNaYH@eq(G(!cF4CzKuNU8sM{Oxw0FFS$#P#vu+!EeDtfX$YrNFSAm2X zWj2?Rbo)|mZy{H2$9rxFfl6t*^pE^;$88T8XjGWFG;eI+W9%t5I85lI4Y4Y$gcDcj z+Vo`X%(d*%$BxKkj}2f(Wq(jqs{7QivoFs!u|a!I!NxS2)FRc>f1D9dgKaM$Onv9n z3zj-0U2=P4guIojBnFcCovT=`7zw{YAM0Uzxu{4vH0gJE5g)hn6vK)IQF$IL0670; z0TkTrOUAd%hVpr`D}9=n?T=(cv_=NIU13Ha^>*i5dNDsCu~{R=V#pLtJVCL(W@PL* zJaOS(S@z?i{#_e)lz#i+Xq_pj6fW8?GyBt^Gd{<^M-rCQep3iQ`SNUpx*c4_8sG!1 zWUW|TcPY-XL+e+chVy(H*X1dJ3rws8Xae||+F#z?$2H?BAWb!pzps0OON46~H>@51 z%QJ5-a;TLXu}n2eCX#6f`Xf^FMI0v)e176-G3#4s!aQ*s4@&=Fw(m+0E?M-D+53^d zkmzJi+-(NG7Hhs#XbYEZ{?63pkNuzl%;ngGc~401zK@U4WUBca)0*xaLbnok6XpSA zT({5Bc{)Vb!Q0p++$qLZZY*NeWvrh~`FpKTM*q?_CQALBL(NK{RYr#DgW;TOl=~%A zqDNa9Y55|m3T;RA02h+BCg+Xe##b9lV+1yNHuhYqFzmj(~OR zJR?sl;_yyfPdf!IFqDf{ps zt2rzhr64W{qq{Ccf|0cXV&OjBQOESMd3>u= zq%sUcu+YK8Xo)no*;qDr>3s@mFHX@*5R1QiDDALur4#$##(OVhW}2G#inLb7A$C?u z`{(Hb*Sw0R-B_$#?0-V+AcxFF!ch9VXVo=~Y;rkAHVum!n=jstXYx|ev$s&qp9tWl z)s>K}vKT|A9G4%Z)=BX&vv#^Py-@KR?$vB+YKU%<7Pd!72y2TxPuDw1Z#;qlX@cM# zM%|z7Bl;+OtNjKzz-}>lhu{`c6sF5h7_<84bQYgi63PH89?C<*6Jqa1V*$TJOe|y&O?6l)+mnSf z&#eo6(|AN~P>2^2Clq&nrXhIA=Ivm}jV8ZEZ^wqHU2jlN%5KFWkZ&v+E|znwknZ6L z*47w<_oQ&;umOD3-$rOmAOP$`5z_+gqt1>Y_o%m6Wj<2({d%PAyr`ST`+vvLQig}T zd^AW<-}7zZwkOTTxtGU9NO432FO7XWO6su}4J{S;om1o0rpvVNDTm_y{f8v$EV7*N z98s%LEbW7Fa{gMT+PM^-$$HQ))2rp*%u$Iz;od#%&%2)Z29;;dmWyBtVA(1>6a;ud z?>p_Uu@*P7w_Xf_`b8_)+JzZvVXWHBI@c9 zYRdBeo$NL!NI8bH5n2C2^6SN6ICa+;;2M$P>fIP4RO!5XQc*yjss}QYQAQN?+a3p| zjNHRPh%eDQYuev*RiqOQ?QM|2iB}W&!Zz0&xPvX)qB1PF_df&2@DBT6f}Hb4!|y*ZsXlX9Cr8q3h%dvdSbWz z44wjmuN%7<2#PyQ-2(GUu8|ZxADUUn%+IuW_NTJ?$@PGW27pG&u=)@vRavsO{0E8t z$t#Fp1SHZ)ua96UUPJV${YIx7jOGZxi>%)@J?4;pIxg}CbOQZva@}DzoWotw-;d{{ zsq*%&4G%=*x|e$;glO>c^nEZ=ah}(KYoS3)_`_zK+sOaBj5xM?ejsn9i$$ z4XEe~5c5)I>wdvmC<}l;$2irvlpXiq6#v5ebbLP1IV_Oo#B5FElg}^13UjQRe1DST zCc+?xT1E2%V3)fVGLy#=86c|1<9p+Q-R=_u@5$H3SiL$?EWDb%<-jCr*S}jAFz6? zG=#^MIb;l_u`!xgfj*GHebFqnttTtT>b$(i<+|1$8CxFgu@pbl(Z+ts!(QyhS?J%6N#^8g8z{f4 z84$R;eO8qg>u5qJ9;y1-c174FpW;>TC8K+1h<)FSQ}#9Rp_5G7=D@-o5VHeVOWUx+ z2;4?@sh1Uf-G4oAg0t{rfUoYpER#kzm1aRY@_D;eawK>>gRxsB+)lCKzl@pW!&ZKvfUWWb+on4<+= zaV!zX+E*sET5$};F@b*zC=doSuygW#2dFUeV*_qhfb^t%3*WmF9nOJN(*-+k4uZ%- z?Ae!tPqYdrF*-OqBaOibYC-#c&)ZXK?PS zC`ysN3)F1+3J3GcqkI)X?x;n@V6iwMTKqfl)k0c>aK&)XI}C(VB7AvYkNsd4+%Vy% z|DxQ>O%g8v0;+24O(%w|hnR!!hzCf!Xr4bylaYTO(T{V(`(vp9ujw{6)?p}mh*e0e z(0U|+a=i|vT}@)Snug?TOqA0SrhPd|Ia$%rRN^7gesHuFbk&u8CDK0_UMgwkn`FMY9spCg|DZ;< zNtdc_(`JmwD`Y-TjQH8CM4?E?_Acet4}tW~meItu8E0U0n~inIL-2vRbl?*3c`xpM znh%44ROLCq5i`x3$w6i$t=7baUm8(Wr8xr3fw=;&8d66sMt^L%>s*YP3FXyVLEzpt zpg*bb(mR!O*)!uUYJ}vN_ zs&-uPW=9Fv*?QZrWUl7#7ZN}N+A>Un0au%=l1=sRYHU^F5xLbnSqO=~k)D%B-}8{#STW~9D3F6wP94S=Gu=n#cN^roy$!EzP0AzCY@&04;tHGrivZ>MsCK#DW?eNpo-Ez& zBC=aiD**4;XrKyLo^K2pND%;3_qFIeYj!tKM$|wP>}`~)y)d@$bH#okKC%9UH!I&H zZ$~g~F~V|YEtn2w9|Yn0-|Rs4IRa3F-V*2rXX#Sxbs7z{87N#chs#T6ncF|B@q#L< zC^q#z?|BTh+;vFbTz(ckQ1$h1riE+e(?3IDo&Vq3)_}=<$66eGq^5 zd2ND}W}IP2fT_aZ`Dks-&V@H?|04+l92O38DQ-L(Ai4JHO~%cN@{{L-C$TF>`=-?8 z&&wECXgon684mY557BkC84(G=ru~X%vVji|A)LN_*67B@v*eZSUvTGfd+=8TZ`NXc-x(;lBUf{uF$UXPAN8TfVX^WM z`eUmqO0MyDtCpu~z4xLnh{T%+)uUX9W`=GAsS`C#Sm!0x9t)L3n9JCa4gWFslK0*L zoX&@Ys%d6*V-<5qn!eBW)xP7|%1LOr2%2n%LeZ^hzStUVBd54Rmam z8>FZ_m0Ap6Ms3Wmq^+R|>tecu0kU{8J|CR%7j*z&d2Be1gDGCxhULL)e<-T%#{B^SL~J@EYEa=!O92*z=9CWseQP!Lt4= zN53vx2Y(vVfwvicSKfSljf;A?P`rpXUJb1*|nH zwCxWpsXTf|2uceiXKV^2x^R4aDD`ibZg$I9w!IHwO~9F4lv#mGm^}h##%;c5Rnrjw zO0Z4TV^;CMGdg-rW(ezR$R+X!$1e|G9n``79h|=x7o~A^zvP2TymK6hQIS3 z<+Rf>GK?>yt{F>!Y#oPoME6gczBMG=mOY&V!Bd~!_`2t_t8sdB)e3jK1FFy;Po$7} zfq>){55R!n@rQFcv09yW`n-j_i}Q2kF|HYGuW(?Uzy_4-YXrNMX&2lnZv z(l9v-VyNV`g!kU|Rh5l6c`XBOK~gAU)!pL$m(r18n?VH>atDNN=@PFEE8|-ZsPAYU zu#YdzB1JL(@K3D7q-el8JgD%MgK5B(!KNMg5L0D^P4(95N80Wv`~E~iv*HwsRB35a zlq?xBWy1=zX8%CdbGQd{WnIGof~Kwd8ptC?Q$^Enen`Ki2*`-Pm2p8q#tBO4*QFxJ zWm%naa_ZgP{kO#-;i|8Ss|NI9+x#C$A7o!{wintMR)9W^xPnJdLYY**sUPcpEJvEo zrcrDe56BUPAT7WXXNK^3v6X0KfC!&KJ7S#X(*}7SXQzuJl1&B7-nWz#W$@{Po@wy_ zW(3WK)@hu2iXpbh_u_2#*DAIpm+bm#I;!I=xVW~s53ECN=rbBir#U&$MQZL=*D~YT zIG;7l54XMq)rWR!(IL}+m6Q^HP*#QU>TVD7p(%x!w^$_8D+Hh7_xM6eSZd||u@AuCSDtnLC z*+%nJjYYTrA!)qXV=Xt4Xu5{?UrR#B;)iLv zjb_Fz5R{Tx{+oYnW#7AN1@U)5M+NHl6+q4-rPJL#I>i!JhCq`^_>D`-&xRtBa4PRs{cI^OWg&NWa`X(qz zl*9lL7hiqgK!k|lRo)Mzzcm6x9a~_FtH8VjB~yuajF33q#ziJk9OrrC{VmBNoj-9T zqnEg=dGE_JEcF)hroB_-P00k57g_4W7VO@m5^^5yb27L^=jEJ=V-ZrXs!{F^p2Vv{ zh6_f3+6ZcI9P;8e+9oXVg><`#LV(KI_-nQdp;jMi(uQ5+stq$E`!fRSpY3smSVUu3 z%Wy!pspIyJh!sHVRR?;>5CrPPl=|H7hppg-5#jl4Xp&J%Ya7EmqfG7_W#)sYouzv! z8~S3vX`=(6ib)FkB*(%Ag<+%(!KICJk`^)^Fu$N2J921OnyOQqMiehytr<3A@ai42 zCiWb4<)VxiFg^j-1qM@3*M>XE%Sf=@wRTG>scJ9X_1K#fg|;Dbmj@k%m?~R|qVUA7 z>k$K>@rcCVgms;D|9`Rmu%}SMQY={Pn>R$NeSrGEx?{J3vZ|{u{@`UOo6Yvs47ltT zbWK%vQ`p~Z;*q+OPoWT|(=EPTg4U4m8>zcazD{mW}FPxTnmMk8wF>g%;Z+Ase zi=$sXRbh_Yr;>(8Iq>H8_0uHEIerx^k;twfLXsNlTte%|Ql;Rt(r} z0%@C2rk-s;a~eFm%p#2j9)X<~+jSagg|RvRW>XrWT#tn&R(+MP z-slt~2=e^LHFu&KMJ@ASZ>#7hM1Lrb2DFgm3Soe6%cqS&5_)sCtS_oL8EO#0HXG&a z7UYKYk;i7}`33D;!AapQRCS_-n|c7Haul^Tg(7E4AKi>^O(A<+gQapyV$sZU^uz3e zV}YO}W0@M&^8nxx^TOfXE8oYMq}yS` zXheUB$Kf5fT8uE5vD&&}P4_|Q4<##qK;IV<@8o7fZOYyGvLagG!)Z|s0{VR5m=bAb z)})_i^RTvDQ3|fM18oV}+{DN5Vc$q^aa-dz6TA3iOCPWcx!cLCgdqRq$3~$6gAJbZ z?huG^r=tgAld)x>=^qkZVzuuWHZQY^@RH1;T+iQ)KRg*2e-BFHh|g|*Cphz0rCwTC zly6#s4)X(V@N;`n*nH@$Cf7Yl>tVtD!hqRJXWCQ4azvReM0Z(M6 zr%5d#TqB_wF!z6Bld*)pQP?tkpUYp6DHnU4!N+>)6q?QY%6Y(T9cS0t>S0Eb6<|pd zh~+qN=2|Mt?<48BhN6jX&BuMDnqOKT-K$x~$YSP+8=5sg08XAx@Ygj~<|+^o=R#Bm z{E=@KOvI6`7wtzq?P6Gg0<}rll*ap9rg>ov%)-Q5O4t}T<0)Yk)piG!>7s59Z8v!I zb>ad7XVH70dwWW&HYHxAanXBjWBA4Rj*_aT7*gE0RM<3fpLgF}VXC|sv{B%`FBsci z7u7YIiLN3x%RY`KA%_3t_%1Zo*LgA@^`r@^^7(+8M>$DNAHB17AH5`A3TP>(d)j&( z)R}{FuUfFnjTw#2jb-X)=pgZyFxJR9p1H%t@5Pc(K&jUe$cHv`6D&Wd6l15FAaP4m3x0(j)UX7!D9;P;ej z{5r+Z)7CQG$a#9InEXt$-LsyUn_Qim9Ej@rcB!v(&_oy*xg9-U=Fu&gT6NB$(1;JM zY4*Dff5y(DL_hnHhh4b3uVn~05{?WhO)r1Cwv3oYn@*|J5Q zGmA|U*=D&Ikj5bkTdfRGFi4u-g4gLKOM*58!@+8a3J%UYx#qA;D(w=~kfB#4*YiSC z&FeRTOar|u?9pGYAdD_G(!qKYol(0Eoclm878*aQH3-j)qJ3paO?x>>?v zyulyDlP!zwf7DgP*(UJ>&=b46VWFAZO-HbBI<|j%c z_XoIuNtM#S(0PEjfx93C{86HGKJfo@;Ic>6V7A#p67Dx0F+4+XgZ(Pk>pM3>cd=tw z$^C}%RE&9IgWg{lohXE46i|n zBDQ!@4)BugBL~<|`DABgz3Gqj^;kqjm0);-hrI_&^mWUu3qeEQotl^=PFec`!?yc> z+*JbXHFjyHE=!^np%z>YhYA|s>Rqzh67kUkG0^Mx7>}g#uYlg-)CIj*Wf15)B zZQHhJ6L21InQwl^K|PrQ5xKPD|6bPVedYcq9vGiIABk35$Z}zd9BE~fO2+Mj3cc4qbNYzuUvvNU)fUG z$@+x1C8Osnv8-Oftk2`Bg6(X!1?-^27*DTa8}L@=fVmmf=_;ie9Zt}`3LzS{`Vhl@ zzeBa^#K1YT#%@(@))SKD};R@@tS>YG;Q^Q zb!IaHERB{m(J)%tTVkZN`qVj?iUbyO#t+G^URDPpW`}wdsf)b^E@s7$WVmY3sGbb4 z2faVf!j|seF=;3n$4U5Z#kBc<8F-9)Io{?3^vlcQ)=zmyIUlWByJf0~ASBq7`pv9w zgB|PfFuXQsKF2_EZ%vacXFk^V2NJ%&A`yd9U)8gTfV>}*%rn0+1dS#T&C^tHv4(AW zAg`tYlDtq)(?rWnh1KzFZ_Vq-_3q|r*=Jf6Tjuv*>*~u}?uzTTbYm%du=HRwM7gwy zo0j0A$HDC9V>*-A*8s{kwAhQxg0Hz4ioTW^d}Gt-GoJf z{g^T=W2I*1{6$x0{P>X5p@~>2sSB9QH(t`=T3r_wbsl-)BmubQE08h`ywu)XZ%6U0yMdp1Bj-hzX>DN-m`z~x5F;6#T zg7Q@+NXSEGmKF2e`S!AC#K=FJJVKxami6-GC#SUJj5bUqp)!j z31-}UHd|d%5Z>d*MYWtFLHfV`|!c}M~VL?cf?38wgs=uQW#I<0~8@$L99AB z>j2RLXz3yGRe7`j&H4h0ZscV=YO@e^;4HyMn1_hL_Ut0Y=azAvguz+?5F`{Ll3G~k zk~lCAe3zHM3$4B_vmWlhAlxLU^~EAAk7+(UAsQl&x-Bm~eCvRh!=AUaRt>I1-!u|_YNeHtT3Va+;jWW z5`R@h^uxQofZfUcd8_ofTi2GkX;~k|#i-bU?Ag7y_O=D+OK9EpsyZVCyjN__QO$D{-tKkah%`|D} zz~O=yu%E?^2wAG~&KROjIbkW2#}i)wFF=MIi!d*o%iwb>5L3uvN=m%I5XzX_Cy^m?bmX zycRoVe34OHk354g50f#eYv9ArwK+oYo^u+-b!K;}`FPv4ef09!IbK@z2Dowi4I4@f zn>!5yh&l*enZxjLP(#BCN_x_O`{*UHL+L%UveeZWaNfmN;!^EqEu6Kv1 zQYa^4Na$tzC32vk+T991g?dKdiHK|9Wa?{7B z6tDp1LbkC|T@3G~|63B|A7R7pqqgVl&KaI%)_}|A7Y28u0pUM3Qsp7+e}IRoas#YS zn4yP8H4IQK#C}p|PqQARc6(Bscv1ALX3`X1dB)8Az&CWb z4BevyPfXAW8-k+W$N8e6M%Iyc7k=fw>Iw9*VfeQk1p$j23BQnE``NM|FwcB+0Z|i% zM)PdOG6d$xb$?>wqSZNx!$7lr_ql^vxIIp>j9xBut~%IRFjNaUBDlNM+SC(mNx61j z-kdT~Wn=;%Wh;(w>zA1;LzSJ{grAF@&a;y@nX0>SVji(Uek z{m`zZRz=YLrPT)S#`$h6IosFeS>yOV=c6AZ+_Tv+UhIdyk{;4*#>vFqEn)iklg z|Cd1WNOsW+&wZgbhdheWLikPBa2TPYp57ge zs%$gT*Dc9YKGSQ82QS1Ow&XCF{3D1qw-Bj4_>M|;TY4V5C@dzxcXN**k1%i8HjV|> zIk5~Cs|@F~5obiVnpgX|6V?2C+^1nMhCS$I0WvWy$Epf+Xl<=F6vb5&eG{!M8n!?l zI{z%V)Du*1yel~BRA~Tqe1(oBUBJ!OO$5*ni(V14u00C8;UBkaV*O@B2SToxNhoqu@u(mr3gP%x7 zw*Ib0@X3~V%y$OU@<*7S#8ridYZJ7ae8rp#2i}iKk=js-qCB%40}6j18T>#Yzz#2N z3B0dVR1sd^z^ol_2+e{V$PNUQW#pBxP=WZ%J4RLRj^R`Yl&XRc$wt5eb?$l{R3xPI z*g#45?XLmJ+I#!~NmZMYIqythz#^?tP+ppj^R{2jb|ngzkh++=2?5vZ_k+6oM;n+A zEVHGnW{R{=b8b~5!pTF8*?TO$+j^J2YXv?&=+*D`L2F-s_g%DpLr=Pft9EvNu;&dm zmvbbYOPRCZ82_2>o3P&a$?$kJ6_wr!TP=w|cy%yS7LUo`e9n0U;1Wg@w6A<5rspCx z&b?7!upNW&#p%G_|9k6l#GRFmuhrd0w|uAL2@)J$Qz@5qVZO@t*OC>|T@X=V`aj&w zWqysq9nUuLIxJxwjYa1y`oe(v+HoIZr5; zA5|9^B{@y-kzmw*ySt){tmlOrnby5sLMMy?q`1q&K69IjuF5L#k|i^ju5bH@d(mRi z1=dOvA{*6H8v8H#lb)vQuqyOUxRp`Q#*_;5!V29WFs*gz ztGA?Z8wb1{WX`f#&gK=#iRht^eorC&$?-lyKC%8R26BG*$<}W1YU5Z-a`2OIzPIUk zr4oUjN-tEj>PIJ=w`08Bdt1=R6WX7yKEqClkAralLsuHTMvp#V=>$LwqOJeoNz3pd zo>W${V9#$DA6{HG2u@uR-W9Fq7i$aiFBSi{=sd=Wc$L_zbF=%I`5DQzpg8*=dffZu zKR@~LlP%Unf8Q{E%GfsDw|GBg2!S0a9lmNeLl3$-P%z++*sc1}&BR5|mf4paR(y~n zeMX=JMq9u!Xqp#Zo52`+T|x}e5V2hTh%pab<8k{H9o=1FmME}isq4|mA^7a4i5%K4 z;hpkH2wd?Se+xQGVCj@+YX@w8Dro2(7KST-m+v5wU(3ez1hsYNrK@|m`oEQgI{W*j zPA><~LSlXvu@im(cMV6%62;9G_MDUzArJHQA4cGlt_yjr2rjQVUPe5dJI!Rm@Vb*9DnkC(_bq- zLp99E&${z%Nx~&Jo*7wc)hoB+?V4*&e-G>Hf`Sms#5AV_)Z0C2yviR^JJtLhORTQ0wn zGId+vXessyEStCrq*izv_q9X+y_*;SBiAfAmd*yh%{!EGxKi5mS*>~HrR*%YKj0!9 z-I0KtjJ;Y3s#UZI!PfkO%Z|Q%HwYvC6uDg*+LE}*4{`QdLkH!?YZo^dE!vtrv?!85 za~2a0x8lAP-J%Nox}mR>>AwS!pPwo@*kPq0*2q%RFZ=~{G6F#1@SHCtFl-f0OVl%1 zyFg_a@PW&CgD8O{E(^GR)CqhbIqn`8qN!dJL8=ng%Q?$Hq@5%`(({HZV|BlsqUu5# z!{(f5!l-coh7(jwZpPJedl|{+YqKP?tXt6u|)Q|A+u3?u|e+A`@P08MLSMb*v4KN?|oMVKsgSyK!QNQ#nu1 z0X55MD;F&ON;h~Zk?X}>3N%2tHn8pV#%jGS?eVL&Qsl z$EXnN^dWAsEkQZfQHA8ILZcxtLW89EEhamY9$a%fF|%}2s+!4LUdR4nmeHyMdD3!3 zX@rFB`=n8^ag!CSQ=7L*%Z=Nly(n`}_{8i2Zb>&gee@7eICu$O{tE=(hrW#Xzll}T zD}><_YZzz<&+?*RER^Bx;&xf%+@ctR#jiG8jRsi?5`;K^v-vb zYS=yYD1Z{X_v=U#S*7yv%bgJgw_(|k`W5lYmxyzm%9uZx^@=6P6gMXY2+7%tq>DPg zRoT$>-0NG|9d65T>EI3{6qRdbEWvL%uE#(!(k;zTyRuvaQ6-bvlt4O0HM2wvsM>M5 z+M`@TIUMGTZrWhF`Y{AD9~L(s3bRGuCrtUP8r~a!tmUOuqGTAa1CdaSt!{(Hwk#EKhL^_vC4l|Acj>w2KH`cv47_oGS_&6yee z^)H3iIw6MEhbddya*f+=%7wlEr-~T^=5 zRX~kTL_A2?77Hyezel9PAD!8CG{lhM{JhG`3|blGXZZ>f2f!B60$Wv4ZG!@Tl{8EL z$8$&~6;ac66hGmAcBT5!(wzoqhVgn9v-_cp4B>m8M^kgZDr`THAIAUeOPf9o>O~dH zqRvV`Z{y{n#NPO!$)#pHX8T&TQXLP1LtuKHP|&0B`ucs$ z4|s!ExIMrtuh{VCNMp-`Lg8R6m7)W8w45R6I8?@Ahme3BRQZy)v$+D<4eoVy;jTUk z%J}v}7trC^rPLr(iD;~U@)1?s9wmp$BL7=Ck`;tDp_Gd+M+UCd1) zF?=rs%ZSfj5uSPddQ}t=>U-wKJ*dP48YXP25jBQ<$6%={%-i@a?0koLq;yJBwU;1% z_WfkB@BenHlygb4YNIwnpqZRM4n3LWfacIxu(P?Ou_?|=)K&E0zfo)JTnyt8aOQsx zFE1^_GXTgJG(G1#NQbYp$0S{cYZ7TF)hEI>l_oqEZ^yrz7SgkVAp*#cqWHfZn_?4f znaDhDV?*qqron(#c`j`Vuu^Zl7gO8IVE0Rngc5N=Wuiy3fhRu8b1!t;+gIaz%H@Kn z@%!yf0bF?Q+Tw%vzEVfp(0lj#YXy#&!xJZ?=q54%?wy&6-=X5ibf% z$o5JuV1%;IqQ-d{Ytr?i_W8*UUZxYl@qFp=E0Q1qDF`D?x}JG zj`l=b4j+dl_rtOm;qdnSEr*ZYp=G`mEpgH_LiOF9q`Bg3SsV9~N7&7&!^t{?ua2`p zueXOR`i9qQ^!)$Bw@WZN9HUyqM+R|q{k{p4s^0(_@ZTB#iez=>{=ZM$|AX-{TPAN`roN_^!vgGu#II{? zrDFaymM`o3Z1`ovEjMe$M0edM`^b$ zjE>Nyv4}ZtyBg?0+g3TbpZaxa$*j(+aAc~~{r$R_v-bDLFyiUE-jx#}15g5&|I@O7O) z_W>gTm%QLq!)eR81_aqaP4@I$SC4Q0L>H1l(DIrC*+&EV`dY(CUPP?CqW1DX&}7K3 z0t2CBQ9@X7<8<$D^e=1V-Tcl``oN?*!>t`Yni3%N+6*PYZZSlZP|LKk+2&0|J$1>0q-^p0!%JCrxe{ zar(Y8>Fb**KVgOK?YJm;zv4oE^ONmDAvyK?0-Vt2C`%|poj3e|BzO>yd=))eGG3PF#w+O5R8GdmV0uUoMUu})0MHXPb z@yM4(yXJ7`_si0NAvYzJFaq}nTcp=l&^dk}F{PCHO4kS3pDg%wl4o=90c0znll@_3 zouk**dtYLuWCu)0O2$st(hBefEPfpH8dU+kdR;3kR&Z2HXS~FXsnPW5wB9TA*6=~a zDz=gewmToBy%{N>n+Gqq}tKBh}s;_$kX( zJ!j*?DO<^-+i(T8g&jIUk!yh}rL<3Ff&Cqv23Eq$Ig6mnLoq60!2-{25Bd8;ZH;Va zC~fHWJw2j;rrh1EKh)wIYtxm7ea|ar`J1Wn6hiwN|HW0w_;nenCwh9}H({*n-zglv z+;>ONvkYA^v(5(Nzz#Dxt{pt}|7a)?S~#M#fM6ewaIPPvs$XRm?m3%*a$hF`BgXCM z3Oxt@S=w@JvH$MqQSYf2qe(DVi%%yZHQF5vo3k(yCs!!mCsU0IYZvmaXLm|91F^S` zoD(26tFHEFV*u+Nk2ae#7}3Lc2r5(JeIB%hlU-Bc8$j?)0?-if&yQ;3yQy^B1Zm}g z#Vj62HWd#*+6Dh`zB63GlU*_iFF4M;n2AhC=4fdSm|?s@QIiKdCGBnOCsx!aBjo)V zIIG^tU`xll&pG1}HExkB&15El+GXC}Du-2KDmky0uPFDK^!fRJ$d!?=M}19L4x(OI zYlBrq<||X?eFfbb8xj!k4qr_ugPa$yb3VO#!{bkf;8aPE3N2Ie?PPG`*JW%t6ApY2q zyxPVFy067fBU)w81Nz%MEaaN-|C9Xtb3P%`R29);KRb=k0K12-8TNr<1g(obl0I*=6|U5eo;4!^&X`nmuncAxk5xkSmwfSI15s9EbXiSK~LTODrV z5f>*wGpoo|e{-OuSut9C32%e|1~EmH zZJ`N5q8G!*_MSRSr~$-#oDTGy?ky#U=!dnVJO>$(_fG;mj^@}6=vKVQwODLGu4s^( zUvZZIsZ_ZJN zz3AVZ;;3EORy0<(XlPTHLJE5d8gQGO5Mb74C%#EXtU_nvK>1GcIeb;UGxo@1@qUVOiZ*1t!2ppKqM(!sOvzYNrK0obs|zLl-x?5IdKH#2r-*j ztMG(SR@++fP2iW}soS(TESU^3EU)$k4a{^^iuzFK{J2P3xU?b=p`UBvZjYbYJLanK zADJ4mMrMITljbo)I3}t%UE=Gvh1SNawW%#gbSGZMn6ra#v6LOSJe@ega46?Y@kr!e z&I=*9%l@4`H5G9*OAH(xD~?Aeafwzh;`n`-0gP-j!BPzkO&$Z3GrZBgVZy7#6&tgx zi#4aMyV7DVxa@%uffI~Ud%;T{CBtDR=mzi;t7~Q>-8~mI!Kwb-eP+`rjh8uib6@ddfGb~3f_T?LGU|+9L3gWS83XM8?i-UwGTWH@|K>z zFk2*C5N)*vdsd+ooZUBW6qm3s=R(Dplb2KcrBy-83KKS4e;M-qx>DBHn-jc~0g-pz zm4WJvQLq+~Tdkhhc}CJ86@l=pnxD*IHh!dmoVj{0*Mxj6Clk3bwD5z(&3&7<8}zs~ z&uu612;Au3Zi2Ys;Y9pI*p{1kOzP$Pt+TTzO*F^Kbdl->#5(+v;m^4|CS>Rk;T6_0 zWioB)@vCSF4>wPGrv5hZPWhQL_m`BGppUc2fU1bLmC|ggxB16B%}SB8XCvBtU1Rylljo+IL&^z10TIN*~eW6GNMFRxgY{?$f zW&_7vjFC3Fq|;xX_w`Ah=YCg&BlU=6#gWh42 zH4UEHfK&OLTu5Y{n(j0jYPrqnk8@2`kShBl@Ox|!{09Ox%v!Hg&Jg@`dy`N2waWKj3S#xAC~z0Gd?>e7=J zB_Vzt*C^Ib)dz!pk&MT}ZRlWlKwQ-PW?sIyg>LW-5)T@?y z(wU`h+{SN}(GZR+Z*PJ898AW+P$v0_hHb7fO1K3-%D?K#m_nbKr>T~ZZ_fE|N(#$! znSHpcKtodCxqHjJwI&j4%l#5AVe1h-i0eMITaB~Y{eh4P{7=_s{Rrh|%pXS!dWRT4 z$Lijn#OT2@#1f_($QltWf}R@s++bj*(Ke^xc2CSN_KBd5Y(xP#3Al_c|v!SY}v3!aTpa+c5- zL{5@g$V*4O&LakrvD)RJ>%t+URdqjRdCaXximYV*Goz{T*(+?N5AZ+z#7iTXiZ6`r zf(O8#!&`9xQw}w^hG}I$_s~PE*VT?lk9VKM{q4jH?%VJZjXhE24Uv0d!p8tY0VYtZ znklzq3Hh*;i}lA0HvPUy*gWrWoY+3%VnBKlvRa!fcY(Gymg}r8KBkfHZ^ZL_!yupk z5di%R-;R`II@)&dlil2`PG`S~bwkuP$CcmvnwUL00Z6HUHAyp{F`g@Za+hL*fpN;( z$d3a{bprhLycwh9tb*M&Gga-uw4cvaZg~fm3#2zI7X6On>)2u-wfu6v3~l&6J9Ho z?gbHM&SL>%PJOJhDT>f4EHC!itiP8(b%ynN%u-Tq21iDI`e_BJa~fnEx^)q-%Qn& z6;FGje~6G!2A2hio+v7?b_LDvYPw&U%g|=Z5s5zcQ_JlLfn)UE*s;$7_OO!rHzJkS zif6!_0}A#6qmpwMI$$o7+VrKmBpN`vY+@_?h8cS?NMgLzL+Kww{(5m+T}XgcJH z3C|UhU^4vUs>KGZT5y_WWd9$@Mxq0u_IDzTU6ITrd%dz6jy0jWBEOdcvgVx9^mVTE<)!U z&YsPG+X>Wfo7^bwxJ{UEEDi^suGbS-Wyc(BfCK}J!^6=FG)#M)hL1$H`~BmD57~c0 zeKhYfktg5WSH7dol@^i4U8!6}3ZimmBg%cbe)fQ2b^5*y6Ej$Rlr%pnehJnnzFi9h zYY))OF|T6EPuzz~%Ab8j9~Ka-C+EszC#A$IZ(%2wakEcwZhtO^w)V%Y<;VF+1dhTv|DBxsl+ND76_={yH&D9s(|#YZNu_ZQX+ zxrFbvcmNzfP8fj#XS3c?<-y@tZu|xKPI@-^0U@V|6**faFHCqarSMH0abmrF*g7Zx z@uzsTJa2DdlUKG}ayXJ!uIcqgE6Ph(KluI1GRQtM&@)X>cCt^8J#t4c@pTBxgppf; z#NFH*JM;6z*22NH?hNPf`_TL4kwPO>)Gfb55_?rN8U-U}B2d!vZ$$#sZT?MA)IM<$0=e?&fi+TS0Y4!jRN*v#d+38X4QvK z#~N+=6ER%`gYIKT(mft7I;q&jzb0u%9LGoSo2>iB-$&W{UZ|1K0orn{wN$c@ z{p<^TeE22T50>r`uh6GTnU(1!zz@I)g;w0TsA&%dd@b$EA9mnGQ~_jK)zt$#Xz%qY zX7-yB!}4`r!xPsi6EX&D%lHLPmj1#sBQj0(Jd+Nzq})^vBGI#%yg(EqWA^J70e%lB**dEjg(fCGgU&PE>DxyPHeh}LT08eSW5u;~ zGw5}Cyk=^vN5!X?t!zYaf?>oxY?d-WoIt~Rw0N6>z=by=QZ#3}Z~P(g8%#*4t>o0;slHQ9%s=`LEAskAXr5+)xaA>63LjW(X$>~8Fo zUx~QHxbB={5jvF_Y_&ogqKql+B>{lf$={iJ{yY}wQ{C7RfBe6YiSMf*DbcLjsq6W1mM@ zyxb^z?;Ck7p^0&P_y}`^g}jDI*hE7I(pHx~J9u_#ZLIY) zTSS5(`B1Cd?RJjrTomF}V=(*ZrD;=XiQ{t#64H&EDk7~lsOu{xu6#Z@m?oSPP(kvT zP3mqt69gSuUKcoV76TLqOy657?Ig{9yxHxsjGS(Z+?+(kP5TChu{7DTtS%b*BN9Dc ztT)?Bk?_qA?MH>IyiZu?p!-AS)gDIYa+50+p^bs&9Q=4I2!z|w>Vw5;%9UPBW$1V`VRH~e|59s;)i zaM_1=<`l!jq}Sq8ON9xtdek44yCkO#fU?sq%lpUghv)^6^Z|;IlKwGQJtUN3@fIrGEb1&{3CdQo?{ylG1((c#a30Hfo8f<6Q*x7L~m># z+LJl1?>NqWEaZVwbq6v8Jlq;yl7B~3++uhH)3wUnhbGb05^}R506Rd$zmq87CiDsT zyL-|pCk-bjo9e&2b||8VBpZ*85mwK1wQKQ-ov?Z8ro%ljKp~6sEEf@ipQ$}t+gSzI zXELF&Ua)ti-&>i5hT<_(Cnv?LI-A23&IgsXNY=mFqgwC9_SW{ULA6EdAQg;36^#T}fk+0Ao1Y4dJQOe=nx!K>jMG%wR1YaD{hI-fx4s zmwj%8`l1~#$f9eI#ON3jR&iWn9V`eq=bqA>B3)+o=wbzQcGq{z4#G98wI0FWi6y?z zmxyLuAvgl_|BCD~vz@)8*M}EEIi!N34 zF6h@zt=NcujLE7H-_u~)^#dY^8E`f2%kgj?IM_WVA2jSowUVvNA!VI4_XJ2aVeyY@ z4Q}65yEGE^Ew`+Z581)&{14gh+BRpH`x0|BAOiLQkaycT-mcSl(~Umiti!hczDZ@s z#ZFW)Bk;@)g|x^rJC3<(M@N(tC*sxyv$aG~%QeKnDbMDNTmcA(AgAW{Es%s1ecLYd z2sipAV*!f~U7g#i!b3a&3~ynS_^8Cfvh;w4lbEZ|B3&unYN-`O%vTPfW6T_fyaSHs z1Aw0P7xEPsi~Pa@ssk^U9*jZRwd7d&*0k#);j zjS|H(4Hk`LyR0wZiFP<{+M~dyh(Co8+}h<(Y|bU5TJ@zCG97L;wn#_+%q=A}>DvKl z4qHGpF8s}+U>w8IQ!wzU{eRUG!kY^3Il`}(N|9R(iUZ@3_vn{<@x0y<TwEfGv`hs;NEwGVyPmTStLnEkqxv2>ej@d4*+=n;{a=k?3OEorMAmR zibiQkdaB32XWkfvM)7IaA5j-DOvCOtN!j-{3KO`P?7(qL3fo`-7OB+1?^w&i^u^!@ za5R`lzSETi@5hcFsk)ju#GE<#(6R*QPSKFImbla^!!fk|} z-p$LXKkhKS{u+$(9nD*u&(whOKlNA-p|r=eNqRP#3#i_sW*C4gBGTy5tbtU-lQSZY zWY9Wg*?yYlykFE^$FBwEOn?o1|91=Q+}j;#i|Rvzla1a8q{@WB2Y*ywWf+sf7dEmB zaaBE;)>D{6TX?#BVfe9+r*m>r`QJvd4L4k<43q_`H4)q{1yFw&L`bRg1)YSj<~QNy zu=_-{w~RgF5l!kzl6rIo+Dg+1Sk-x1yS8t~Z8u5{Jf;=p-yVz-w~PAhCKwT=$wYH_ zpoZFa>-j-e%hsRGald?EKUf*K{Gf9?V&t$fCe&)$X7;Hm>N~S~B??@`1111`1TO+s;I)+Av@y{XU2W-h&_pzN7bV4rBq^0YudL z0BcdcQAm(P-A8M!h3{G|P?70pZ8sI1+1<8-$gqpj0nQx+T2>8<1A{@g+KI&OJ`5H` z))W>cem%D$SCvvkbkw5nCkc{toZb-@m>IuWUAns_Wz!gI52+rMiS7A0){5?grOsa} zRl7LqGpG113e+WUVHW!u)j~G#0BvsgWKgzUjtw#e^xm!)`8tguRO7W&vHq>3SnZ^o zxw9vvQd(gKmQuF@~en+$@rR^qp)kw5cLYM#g2FiF99 z8Ejk>8RiO-OyNSuWfZGgbP_C<9Zt-&CYs-bhbls-vx@Fw#DlK^Eg@m%c;f4UtYz(^ z8Ss5&Os`YN!=^0hmzUS5WjZHe{Hh(O8GRMWerNBI&0RS0iQi;B43aJOXtaZpvlruu zeefzu-SjA@Hw$;LSL#DULM4m*WHxDFdYZ+xEYv4oU4X;63E24IsWTg3)4yz;%)?;; z6~FZ>>$Fl=)rh&_)TqRDqK$OZH7d*?31>itYhm#@sgQvgDfLldG&x*m=?*n^s_vt& zxAd^^TJ64ZZ-8#f3D5%Knu~yetK|up5TQF3pCpJ`&au;HAu)&;YPWt;L5G<9GSdZl ze4`9jxO=VvI95QW{3+V(+|Ki?br)LVowUd+>81*z%?kSXHwMfBJSi-25vcE6WKd}O z`lyi16UQ9iub8)N&5s!u%W4?J(PB2N`6i(R6h4opV?4M!&C;K!I@1%J`H&qfUXDDWp}7r03gPPPrRUv>Q7tLGc$u~%|gBB+vpOQ z6zI;RhA z1~Ou~R&cN-CgakXywRcaf(nw4@g&Nc(qz$M#{`CG8K^FJqymKrNf1h1I?MARfZS9q zMz2xa*sQgRhHz4trbzrJm2}zqF-W|DVs40#hEt*La&y@p=4y#+3=YMIa(_zn34sAC zI*7p_se*499fo~J#{%qyir%M)SsaUo0I@Z^ZgWs?#k^ENkqKEPM}>)edx*XIB&Wp}=~|4JznK#|rbrM9jNHOClK2`D4gniRqR9w>IhoUAB74!3_w9!YE$w z37GsU01^*~n$5Y)tr`xS{P{;3UY$4Liu6fo?9l#PD~H9^G21J*;%Io~jkA4!7C_G# z$Vxy6(m>vQ;k-csGpFkqTAfS9bUG0n?iwYkJxc7 zOB`SKB45V&pB-nfr&m&D+SK3(L@?;^IZ4L0l3Wz>!8f4Pwa2u}QMajmd4Ju*3lh;> zsA@xWnLCkp`w}pB@vz`StYSbMAAkSX@6sqr*5OWJ#XE%(V{M%f({<6@n7gpT{gF{teFQ2>wvfqO@?YBQMpb443@cY)Nh zsxQE*`Etp^snLitP#x`(JqVh9S9_y$7w5pn_O3hLfBB`vjZ=zepH%)7i)QkvR)lqk z>N7#V1y&bf6)-dGFaLn{b-^(A*zsB#5G=?>Jf&eV3WSxXQVRJBfErom)5irm-;VA^ z;woSz2xi&h=n+fh`<@t;z13?ooEEu9i6mWuRrR?3)}v>}WWIQaKXxa$^1k?x4Vb-j zJ7_CweUba}^(QAa8}F;ne+(sA5!#%N%9={Ld%m-|$2C>IN1HDO4YjeC0>J2i|KL}p zL9zaI@Zszh-T{;}LdvzF6Kvk{mZx@7c_+N%(2APuLwV_T>3oN4usoOT0yGr{Gya7x z-ShhEXA zOlm`y?GnFDaf|3RiLo#;#*slD9f{P6CeivZtC|6|qka{z z6OO+z9c^QGty^}*0mQ%6lt(rSQ4kjBpwZA>h|>z6YKakL?p=>2zak+n_Yr^mVcq2S z{1yKt_3}-CnXt%vd@Ht{S`Yw$+e;k!}x;r&0W6IGjo)ZY(Cg3ndegLg^y&j zvc~pdih^QxsoqYTYr|AyS>0L={uU$-o*Sc+^LbW)q6ECqb(0kBe4+q!u5oN#4=&bA!UMbENTTdW%NuelH=ab_nDpdIQH)K=;#qp{w+Ie*AGm2MMD# zSzW4^m@~!Ot+j2=!&XGZx>~ObcIrL$`9P;5i&P-sO_P!uOFm|bNkEv#sQ_b;hCx^% zs3zr2(AS`kyc9cmenTEl%{@1yc{;~8P+jn5i{g~A+B=Q+`c+Jc&y2>|6>9&HNEz&$ zGML~9JifG(=~~Ynuob&gK|wnE2oo02dViTP_h{(|z?MuVAUwprUiG3o%PkPb}!YeRKC`yUg25C6&I5%kN7B0-P zF+}g?8eAZ8Ijs?1-!id}NOSH7uMNI}C<<@T_PvHyfIGDkQtBmkpcjo0X7Yo#X!;-C z9hpYrNE4w>Ky^!{=~T8RE@LqkN^iUHIt|Ha`7iX@B2EKa$8SejC>Fw{Z-=0u&mj(# zk!}B=%O7JcXqU3|oy*NQhsR}YfhX^IcQDpt!xBc53eZ?V8!Vrg3*j%4;izm4nv%2i zzKNQY#^^)u+|=FbuAJf%No9ON5wumlSX3CYw`>p()=YF%mgsVa$vMQl`TjXUY!L@T z_BdZFLpN{f8kNchFi4Zo>jM5ajtN+trrFMmrwaPO){-ifdXjNR6$D#W1rsoKue1us zeJ=C5*(4>6^@i)L;MzEyW!V(Bc71r!_)4v_Ei3y+*7DKvl|S@#A@-`-aT3I0K;M*% z<$iW!a;aOf+XCiP5{6CO7-}r8u$Rw??yG*Wgq>CJMZ!@00Q|I)wQt*goxn=ss)=+1 z77wsx5J^aPNlSh@w9pvRV}apQ9~N_v*vkkLB}u{PrY4fPXU#0i>< z<^Ka#M^kw~!K`&AD9%qPtTr7F#;$yYZFvW00vYoL zLb|jMA!76Hap(8Ytq4g+3<}U_JVvfae|rbCYV-XKUo$h0=M!rgi5)+x^^=hgSK@WKiHdc<) z(CaI?x#5>LTA0Z8v%BU;1LY2KFR18OpuR)>IU^~NJo|*gYzy*X4PFox<*aGD=22vt zGtu3g)c^fZ@LHzs4poi4xWAdscjBra?sadag+%{{YyW}qopFq7*J>8nTfgdYK>mnS zKk6EqRo>&e)=gKdS97XPR(62V7%mpxPAY0kkI?8EjgI$Nk!R0HeO|KN7x%mP>Bb6E zq;1h)vWd=L&QE^yOSIDU_)(S`l~?usW=~yR*xU~4YgHXPRJDD0;RxGwHI;9lhk6 z;&*1$(8qMGkBbmx@4ojfK)cLPrw${fcKe@tyIei}d4C;UdZo79!o|kpj?qjYWg7B% z{IU)0>cVOO+|kT;zV4jLhAY--_rvdFG?U$xOG#u0X@lAVb9TMI4ZUb#e#|R1OY2S7 z+1@2ZSmX&W!okTcZD4t6ahARFR0SA!fe|*l9MwC9`l7a zc2FbZ4CZ&|2lY0jcLTweS=SzKr~qBN^B;%HBfRhLvVe)8li=amBCu^xcv3pr2tK<7 zr(_g!iI2ps$U800WUTb8C6>Fx5++8ZB??cZ7uuzax6(sk3S8=PjOS2alK{Y5b9`gc31RNcwLQOdMS6a2yh`jKBve*dnk$MW6J z?Kh=u4uVuXz&P3bF_hzT(cK&6f^KdDEGaVsC2ts8=gv8NucVjxlSQ5u2L|h^D5|AR z?beMLn3enTk5^$HQcKQaEq?nm8#7;0ow8A~D`xL&qpvT~TW2U%)lxbk8n?BU`%byH4J;opk%>1|{}S4a1 zzGaL{KYqNWu~e&==#sX3AmF}0ZFY%?6*ym&2sw_#cZz_xwS5GZ6L^^LpY1l)a%urm z5Q4uxOtSKv4Mdi{b6w!vRRzj}sx)A_&5MMklFKZ;{XK|Emudz+A6@FPDFS5?5V9J` z#)+5&H?tHn)LD7RV<6xG?yuW<`P*pxZC>$Ckyst`pEU?+wV#DecqZ(v^z}E1%8ag) zLZQXZ+7#IUS&2)wghyNtakR)7TtRJ#(1&wSC#Rjgm@8u(lg%w-4W>lbwYHlOy4~fW z&|fULoyMV)0nydya$JuquynE*ryT#&MlR<3BVCL$5RuZD3)J-T_Xr3D>auGM5oQ*G z`~9jtli}VMU5iF4^59bvDskbk^xVyI9O1;|SDLOn4DlO&+LYZf9vuwd>l7shh9;Yv)Mi)TQW&Xy<*Anx#zhRGU>%`#SEmT|}^ymk+y2bd^VR^ji z>DPw)*M@#&9qFDvSOAj$;TlInez2=x-v4N@?KC!BoWUU|{y@V-{M%mUyP_dZIqKK*WS&bPP6}U>%43@m2d)#_5f|2H41|_&06r3PzNo)%~n^h`+W^; zW{w3YypAkD7xJD@dBHnb&9QtPYl)G zcd(=qw3q zw&&%sjOj4!e1+?-pVuMLQ+p~%S}EV%RSWEPd0E+I{M|JnGwx)0nE(~KG?;`V{oQTE zIsq3DLT)DwWR~GcnS0jtAp;O^41F>;s8E$&o{_t=>%MoNS~t)GFlB248c2rdBqIEn z?b?$M&0K&GfZ&yOF>4Ei@le-s1dbs&wi4QwrZyPA#gHE|&5Ft1>OYAgb>X2coR=fg z-&NKFaDo2S14CrJLY1+@FE6xBHpZVIwQ#N;TkX}&=`k~&4^^deW?eN~XrlnXtu zJ~*7AwVpC|en!_-6Yuwf-{)vBtf9jbjy|eIf({|11pi}8V%cEWnnWV39gQ@HWcT^{ zf5Ks!(?e?%`Se<~b&s7a*%_c{ij+9agcf%Kjei#?;H2(xcV$ ztco#Z?Yn#*I;($86PB#T? zZvcZoeN+*Ya{v{~G|nH!k|z6`zT@Ri6e2IaN!$KWoaslvec@diK+}}yV*t(dRqee` zGx2tS{%Y-#ma;?ncdiu)$0XdL&(OOj65T0v6@7QApi#cD{d!7CUFJ10q2wLbw>iN* z3VeLY$=WW{4#3EC@i8zG7;rgFNdb+stAFA4rB#6?qiS$)TgTn*voOWRh^6u??VY>K zqM(Uwmp&f(v^0c&^nKpS%F8;Mtgo-mr6Ou;Ea5-h)l+yIO0-c>fNna^*}elC0V8yK zgP&hYB`S(YDn0KX6gn%|gtS~Ni%{?a7$caGv#*2q#a47I$yJwDrMriZD&8z(KFQLf zn0ycuD%AbqPyPTh4`tY!e8S-Sykn;o(V~1F(ZbyP#IN$&Xmnop8~|pqoeAauy>HLNEDpea=n9^N%9ccg_1m_#(R7AeZO;`jJ~PmV4-jh;Qe60 zgemzWeahKi57Ur`cBOjT24;E3NIVD-O8kkY-dnN94H$7P09r^3JZwJrdGchLAiAj^ zG(PfGrZ%-AeiwxNl@(U76^o3vIw1OGAaA@wzl$@^^(lOlP2qO4iB`MRCz0>hxW=B4 zacwlM&4q@n3XGk^QM6xH~J`mL~tb5VJN( zK0deEsY!tR+4FF;l+1!t(E?4hmy~X7%|#_fj_e{MQ1H)2m{l+$xvCJje~UU7xTwP5 znm|7I3tG9AITXdS##cy^UM_VK>bZIG!^;oiq>{^J3>YCX$R&bjDZF-^EMKGHf&>!S z7h|{CNo@si4HN7xCTu94YC}h6BOb*$g=oeRj#lEsna3S6lqpQ6wMS_DmE_)*cB&fwM*TB-i*+w$xA?gmSinsS`!Vp;~3A|SjS#81#r){k& z%xv`YDgYdma3e3@u+=6k8Qhy+7GL-YZwU<3ZKDF%JZF1Q+?+MPL>_=x<^?1f7W!`` z%0z`7;JD&SQ#^g8A@Fz?S|BUkxt^AJPZjf(OIMn^AMf;6*0YJqJnwBMtt?}u?e_ZD zN*Kap&>#XT2Yfi&{0n-s8(WwY@gaUe-YOQ_!mjyzzxO`dC}C_5X}ezHcs&up(K9$M1kZ$! z$#_ZzzwcJAol@Ac&wRP=@C6gYXrxr!UyXXWM8b;e3Sf63wuSIO`;1e`64}SfiOlc+fXgfEXF(yAuQvyrb3op1#G7}nEuUV7DXw*R+i8cIMU{@% zUM!JAN9LCZYf5-LzxhwCb+-4MXJrMW$Q{Ud{cAzrp0cSOlu|#2F!BPjqXXNn`l@2q z{jJq2)Ic$OR}y7`8f%o+HKMOV3$Sss<7eD~90`ovirdSdwfO>5Zna?RyoRnmNd1zG zTxG|~tIth|&J!O|wC1Hys_$xO`{9Mgo1L;NS70@&et6-`n&e+DASC}a7#pVTWJ{=^ z8WzN=X~<3tkHAAt7!BL2&4S~mU$FrxZkvvEPBEYG?sM~~2I^%MyT$6Fg&MZFk==g{H-X^!d(JP&gFS;m@n#FE@KMnIP4>qUx zyTKIBJb) zE!FYfxMomrY|q7)@*}+jj+fAE9sg0RvE4+^HyQcX$jhI^2Yl<<F#9hI4%id2P4G=FD*Z8t(WzLds}XasrS5d znwt?X4FQ9V+?KC9!|DzQu)67-eAn=;Kgg6uVvG?Dc!+PBNYZxtOJvEmr={$V>@~3G zr5#-Or$s{jBqkXefD&OLDI6}E2#(O-F4}q$OX9UT5(SEySP{SgzS|vI1Z(76et@HD4XCEFIGq^aS2BofL7Da%0FAR%sZCKFkPZnxpt7XGae&3nbIX-_h#ll4+G$8zAzRZo}%J{(VZvB zr+_!`1V&LaYPnQIVkq}i3Q7)NY5+&|3lmZmlPg365bN1uSM1(XeF{R7hq)3mGEh(X zIH+GkvFwy-=yLx6AEg4a$2`5I93wmPzbq4Zp$|3Mv?RXn z*<9>g{am+k<(fx<#(u7YIqH88$J~}Ha|HP!r;MFod*~47+1EH7$fAIQJ4%x7Q5+9b zVZvV=CFjvMNmggyFza-GUqEOy;*@c?F@nk+%SaKv%=p`mn%7K>ReDYv{geRW2*U_~ z3r%XSXOF4ef&}wWp_#5QcH1Nyo^DOf{IWm&KoO@asc{#=FYR^NofWRy_Bx1h0|x#0 zK{})A03I=IP)WR4O|7Fs_0J3>?H4W~gpZIpvVE!kcnz#XWcGgMtVT*C-vP4wW?a<1 zJT=j20Z3&x*9l!9UfGQiXpyelyTKMb^6W12Yq9Ji!VXTk_YD${2 z=H;L=WwFQzYd|(tarMn7AHtj>c_C5))|;-Ip3Q&&a1@Q zSalfD=l=2@;@p)u%cSjA{-AMFc#01#+SZQjk1ps=5%HJ-;ZqQGeYh|bP%*wMBaH?( zdM;v`0<&^eI8<=d@h8Yhk_c~`ks$P@rD%M{&pLc?E7%wu`f#eAYHwEv`h{jb_dXws z6pL}j;;v7zMaDJ7`?V_DcEW@EWgZ?Z$>;psjT?@CLK^zrZi!EZu||6K;-QQ}8V zpKl{Gb^taLn*Fm*|2B^uO@eB(;5lJBHxwqG_Pn6#0ealI#OX2w!ynW16 zaF@%cOFEGudx1&0ratjEpZG5O&jxa$F4|1R?LeoX>$nKn3=tLa^16iOz(8x1V8R`u z%f6QwoT2xLH$*`a%jJK89<>dHb4I99#pI%L=;)l%(v@OfxdIf!0 zBw$KFT{La8M7v;yCXcN>Jvc-D29tpFzl1F^5 z_70N6jOBmeA#w4u;msakV0^g)dw|&;;75fHfqBI|qxgqBX>r3fZ8qB6@L+sg9eS&bMF`fln z!KKZ-3TFAV1zIVfusQ$Yt%q#Bpw`xRE%8c9RQVCc?xo4xc7{UbjU6IH0)bq=&HLDU zRb!SyTueUp6V#6mb%aD) zj&qZvfAbdmb@-T68_=qmO4J`JHXi4hc#n@n>YDqne>3s&k$oC(Dtl&<0cXgS3y(?- zsE=U!Wey;@90X$ip&9*Gyp|sbeyar|gKD8@5zths`tN&cW=cTj^zeQjjB;;m@O!Ti zEP+U_we^ugl&jzZ#hdwyi^=9_*K)cOUc{WPR zT06kN1uBwN3C=t1wfd?6Z7jZnECq%Y6cOq>v-hrC z{=XYyL{ESEMi~SAssL8;(bSz5jtSwA>UHL$EZ^n$6}A@WK)GmnnE_WzgrdM`1U8Ex zYAgQA^aB(-SNIyp^k*7Z!;p2yTx=>MqzAHX8_P}sUy;IrG8p1>vokRX81NFmHI&m@_hF{@wUrfIyK2jS`>s6j%T@}suK_}@Cv zwM^dJ2p6m2eLzSHpjE1BSaB6iSB?p`=e&;Rwg0fQ;*;3_82?0Imcl>`qyd$t;^&Cb z=y($>dw2+mela9%85pMD@p!gZoY z6Stsh|HsOVQp})EaXv5?fAQc%Qq_WBGiSHu^zw-C{t3hi^2NaGq_Q;+%u<;_cLi;> zuVq!`x4(wxPYMK)zD^ztjKqi}qn0QbO{Y4vi+Gvnock4y$Fo)Nkaid%oF4CWp7~4_ zLh@9j`L_7rx~93wb`wRx0k#6TIMSe*&5u|_exlz{*aGxHzr5lotUS|UrdHLp5poi2 z2_&Y?xOe|JX3Aqol9HxNIl&?jV$3#+!Baq{gJ&cw;2`Qj3kB5nV_xV6mZG3Wc-;%w zwgcv_?@KR|KkGFbEFcthkATL|Sy=KBenU1 zP^)c3sue$PKfFy^*20(o1304k9|`k{I1?1>1CqWu5Pei+<5D5Oor`%oC&scr?pXI8 zKDSi_q_w}@pBP~?q$%kI!Oq4C82=FsD8ZZo%e;jaozY9 zSQGGvi@fINa)eLubraz!<;_TJ;bCHLF_)-64t)K;@Z~ja`$Jc5^B*#yxuPAviE#G7 zzOcse{xbhDqEPapT&pRFrG?I*^-8$?`d#<~CbkNCxOGjiKfsZH-eQ3H z$+`ihzif}H)5owjlb24rEzDe%d%}J``Q;rq_K@F2VR2E4Q|-0fq1o)fmz-#V)O77O zv8XZXTRaAPZpGkj{3<&9$kZOy>1?g^{I1rlvFGd=ZPLkz#6|3Q%~&+Acz*crJN7C1 zj&7$|c(=h!E*w>P)vgmyZ#Ob6{nkIz_8V%Z&T~l(#f@>=6nj+?ZcavY{ zEG8uHjEiZ8z!_b7lAg3l5oAMK!;m$?!dF2S=LseB3?%kw{d1z#msT}K2XQm!APIz$%qZXq@neE^SY>;w z{rr*qsUIf%p>8ELI_YluY+(E~hF;$#ia!qxK=$3@z@U{&TiLJ9hAFH+l;{T``+VQ~ zwbLMP#K$VHz}m!NkTxGl-MlKX^pk9oIxmMqJv?2dpH{pbh(QYkj0?7o#4JxeL$Y3L z7E{f6)J`>!yu6<~)-o$-b}kDYqkXT)K3|ZL<3ra-R<^(m%>svx{LhF0yCmvU!Hd&d zMS6!oKe#x+TxwrQ_#K(o%{pU`S>L8&IP^!N0&FI7k)dIIGP&yncjd|Mu8&tA5elw7e+Gtd5sxYlalof8863fG~h|sS@Z&hO4Vs?@QFXUfETVIN0wxMu* zVV;ro3i(bDKVTdHo}ZkNeKA;8$ypKzzHK=9rU0!G#TOh0Fy_(fqZLUk5QbL8rP`$l zAIc}+^O0^FSGni)GPjLV=RWwcmUwtA=hSS(MQ^Wp(m-K_McEAzmD*;ST7NIpOwq=4 zf-`0Sbfh$SrkpnQ)=0gqrZ6+QtV{+FHPVU)hKdQ1S5iKN*OYqOk zS<&Iq34wFl(CM&KTvqd+!wKXA$<{GY`i^_`lGOZ<`P^gJ^+5RKiIy&0OdKS^Fw$eM z#+p52jUT8)ZbkL9cXU%=%pfO~)-@bri@|x9)Xy?UXHS<=iwX#@u2jTTptGWvuRraS zr5YUdTo$+h_^Ufn-#rRBKu9HpiHRxVq1wmff^>tTB1{^$La$NKZ~{Suai9ZQkD2Ia@!hLwVP`ZXy9|Oy=D3$h^ z2Q|}J>S+hGwZ8$0S8O3uV-|_j(~hp(cUuwU6aoSLNLkuZ%Wz|P*EkgupY3DY3D+*l z-cdSj-^)Er))s;TzrOiuPRKzt=sRo0SC-6NmXi6uBl?e2umQk7BHUZTYC{sM$ag^>VGwb>!o(Vey=DG*0C zJ>3O&ceIKm&ErK4l^<{Qa*66Mzip@x$pr7!A$$%okbZN$)DHH2{y=uht66>x2l6Aq zfp``&no3eUj7zv;34FgGo1@vr!UkGPO1UhMbv1;cxnbv3r)BUQ@&t(lifk0H+t5NC zhITXyEL65GSy!ET8OngD{yN#jzH=0Td_6?h`gPW%PL*)^X)^)q_T zR}tId2UGoV+DuDkt;DwX0xPOza29&SY1J}t4x^QC2!CPTEJXDr0X9PlU|U`*`Cr=g zTAUhLuYRVR`yN!J=4lO<%8AlnuB%?HS2_0Q%+z~8u@_W3*j5iaWFdJ@vjTv+?NKy& zY-8F(J6!f)Zr`13yMGEntHKd?joCL2uY6{L-eepN&U1l?Wpy(6lA=hF_xRB6AwRqQ zza49l0jA9UE6?m1?iGygjN8G8qU^EG#|k2yfEd1b+Nm|rJyGpU4#srlKJ`mAGIoEuEZ%M_HkpQx|#*DLKB>E_Npw*#jPcIr<22c2E$@y zQ_s-XiM|?124(m;PgKr^bO`6DD|WhxY?N!ComfprgwQwpdz z>UhJ6^m%Pd6)oB^%3Tlbrx6q4`F`0|RGf*21%ujVof|tH`jP+nWcY$FsKVP_JDgjA zL@=WITO_l2C%q>FpUU~W~G%v5(ly(N8P#&qi~ z<`sI~vLy6sv-F0lD~(_Vtg^BnkDYyeI33lhe6lAODx6&PSg2~+urugMAZ4krQKD)| z{nL`p3U)FeV0^ml!-gB+T>s?$*H(ct2nj#S_lv$b=E~xD8PdR)*vuHBUF(j#c3>WU zY?2?r3;my?i18kzNLqzNkN_4%s^g)l|F z=tVpftte=ZL)7GTL72gw^`18*nEPQ~GW=5@Xh4ImE11h+`NLmYNp;Jm7YRVw9=_9s z60|ezJ1*UnksgNe^T2%mO&4Z+aIsNoi8v&zgHTJV?9_vL&_3#Y;O3RSdV5i;SPxfs z+lvV~^^c$p7W(?BBe0>@I_;!|Tk|*g@SFZinlTVX?FeP0gO?WzehKFjL@7r(;3i9I4QYm9n1f>EH10Y7!r-N>%F|R5zc$9;_R1W70@f#p$_B;BVCR( zIu`|a!UsZv>Z7gG0SW)g`+i7W-%OYIfGfYYkiYk)EZxR&RS^Nv?E?}!2yLsPAP+kM z#;7k$Fb3-;039crKl=)6=vjQY8c@cZZRg#zX#KMQGODoRFuclg(2DufGbhvxCc^9} z06oVOtY)R)*eQxDK)X+R=$58NnYN>Sy_l|iSjvdjvRXf7%bZ3_?sN+fHdi!(GfQ8H zNxPOiMl~mu_YN29V>RyagH47h@?t+U(k3q^U-?!GF*!(3?=I0!Lm*$jsXWrE&^#xo;7zRFI+UkxNbb@hNCJG-LhLZ&kciX_bAm_gN?R7#w!gp)G>{uW} z(3L{!DPChP2P228Q#=$)n6+({0JJbddDi-Q$nq54f z#hip7gwy2XXGq=Or$LuYTxYooLby|DpJV?FYkJ@R}n$!LZtTtDJ(8@|Yi zuVFcca8x*{3$r#=Me8Cgt0Gg$1?+TE2=ECXP%&h44snZ$`1((#Y_HPo8ET+N%X;o_ zBi1O|;XDdn^8{q~E36I?am4$Ar7uRMqb32=t%ZSWl15wWEe0%oO!>*mSwogNW?wmI zT4$C%#k3s&AS&d3Adr-(=DjwKjc@I8RoAYZS?@Q$Og(_Kr=W?dB-^L^){#1)!`KFn zsFmsmjpnYWZ(9ClUJ;sk)w+xlVzG7DGQx-#jL7h+PX;dQJibfXtiTHqF=fc7Gbh$|Y6GKAa z?&}IZl4tcffEh8oX~9J7gn9-ZJ6{_yx!GnYrhMqYr^ZUX- zQUGj@0!fvCoh_$kwgl@HdZ8gUBGJMJBXS%SCl`cPLoJh(V<1s%O{y{C*%*ra65=6g z436!V&S)luITLSqm_>$4Vrg~$_|*U9ZRiSv($u0d{)k`)s#BEL4xTH}Y&c8G`!ig2 zRP#YkevE$&QX*|A3A{wvZErE7h9t|y9WtZ|&hR)F^^fMyO4g>^7sF16euxqw-? z(vqNPEpxsr{c~n0;3Dn}f4K8`;mJY617!u$#AUC_^hlh0&yQP(tzx?-MX-T4<{u;i zO&GVo#@WufRVLcIB-KS-17(Iw^&|%yKPuJk#5pw2^j>c%olfF16O>ZTRk_Im?Vexx zGIpNtHDgne{9sfVP&0`+Jj&UoVmNlk8Aqgl0-1BHqRSdhbhJA3Sz{;&8uNzIBx?gG z9PN-AwG=q~fRv=vvVPvJbkY1waWpTzizHd8i>~CyDSkDH4Z4eYLV(-Ko1fABvJJ3u z&R2H|frS;Aas+Ej3HjG~PIzzSg{j(n)eoCeh*)a5;@7Ws9(uhd@YK`w?lVayyS+4r zQchPW)_cnbDkm!Ao6kJI$+c8J+dn|vp; zq8!hYcL6g&f7Bt0Tc!#0Ksl=m8^%}RIhiW)iiRlchqJNM=E_Ha95=Q?puo<(jNcpT zs_=OYfM7V`y_wDj+Z_=>c3hKY{m85Y%Bcf}XH<+{G1Vtn{~*__xt6A(rlRD&1a^;S z-cv+!n4LIHQ$MVLTt&QCDU;xaS{2`$0^N`bV)AXnQao&J(xJ#9Ln#|w${OPve`xAn0swt7)L@7&=@P2_yo!R;vvE2|k!444jYjuWFa&Q+ zDMQok?`6+_8QR1cYKiw%99ENT#z@B&P4iWPzo1OTGrqmnT{Um zrf1&69weLIlORFuW`Gv)fy@Fq_>aX%Gv1CX
    \n * This component handles the whole BeerCrackerz app. It includes the map manipulation,\n * the geolocation API to update the user position and process any map events that are\n * relevant to an UX stand point. For more information, please consult the application\n * description page at https://about.beercrackerz.org/\n *

    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