diff --git a/.gitignore b/.gitignore index 978c511aa1f259d53646f17e9551b88dcc11eb5f..724a02d35ec519dd5fc690430e98ff51d71bbc98 100644 --- a/.gitignore +++ b/.gitignore @@ -75,9 +75,6 @@ mobile/Preview.html # /!\ KEEP THIS SECTION THE LAST ONE !.gitkeep -#Report bundle analyser -public/ - # CSS src/styles/index.css src/styles/index.css.map diff --git a/.vscode/settings.json b/.vscode/settings.json index bebf60a861ec7d68cb7291e9ffda595b275add63..dcb2207f4c2d3818afac11c4d71708ec949624ff 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -39,15 +39,14 @@ { "type": "GitLab", "domain": "forge.grandlyon.com", "name": "Forge" } ], "editor.codeActionsOnSave": { - "source.fixAll.eslint": true, - "source.fixAll": true, - "source.organizeImports": true + "source.fixAll.eslint": "explicit", + "source.fixAll": "explicit", + "source.organizeImports": "explicit" }, "gitlab.showPipelineUpdateNotifications": true, "sonarlint.connectedMode.project": { "projectKey": "ecolyo" }, - "gitlens.remotes": [{ "type": "GitLab", "domain": "forge.grandlyon.com" }], "cSpell.language": "fr,en", "cSpell.words": [ "authform", @@ -70,6 +69,7 @@ "désembouant", "désembouer", "doctypes", + "Doesnt", "ecogesture", "Ecogesture", "ecogestures", @@ -134,7 +134,9 @@ "pseudonymisées", "reduxjs", "Reinit", + "sendmail", "SHARAPOWATT", + "shortcodes", "splashscreen", "swipeable", "Swipeable", @@ -142,8 +144,8 @@ "testid", "Tétris", "timestep", - "timesteps", "TIMESTEP", + "timesteps", "UNCOMING", "Unstarted", "UNSTARTED", diff --git a/CHANGELOG.md b/CHANGELOG.md index d1277f8a49b616e456b258a03277413cbe4cef93..89bf774603d7414a071f1b960bf21a70dfabcd8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,42 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.8.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.7.2...v2.8.0) (2024-02-28) + + +### ⚠BREAKING CHANGES + +* **deps:** upgrade react to v18 + +### Features + +* **analysis:** off-peak hours ratio ([b500293](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/b50029384b2704bea682d57238f490e1230f4033)) +* **dacc:** deleted unused indicators ([cda8c3b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cda8c3b652a4a3570daf00f6b7a72bc2152d4750)) +* **FluidChart:** new screen when halfHour data retrieval has failed for more than 3 days ([13a6911](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/13a691195a93d96e01bf252fe76646c649557e58)) +* **mail:** unsubscribe newsletter ([cedbe14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/cedbe1481f542e08dc5e689e22ae7d16b34db711)) +* **newsletter:** campaign mode ([0cbeaf4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0cbeaf4a428ac5d769c140840e6d46a933a5bb75)) +* **onboarding:** small evolutions ([ef66c43](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ef66c4361f25545c6661117b145fd644f81816c2)) +* **options:** replace report button with switch ([6de1961](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6de19616497b443065c7851e37b8f32462efe3d7)) +* **ui:** add to transition progress bar ([7f4225b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7f4225b921336a72c1e4311791ac55868968d867)) +* update gas price estimation text ([542c3a4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/542c3a44c979135217534ce8d15f9653067ff0b1)) +* updated ecogesture n°78 design ([bf80fea](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bf80feaa73dc5483b2f970133b9f6e04116b2a12)) + + +### Bug Fixes + +* **conso:** placeholder value for half-hour ([7315d4e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7315d4eb321c771ad2b4cd83e2e4d6a6c09fe4d6)) +* **deps:** upgrade dependency cozy-scripts to v8 & react 18 ([7613960](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/761396035f5f90c793b6b42af826f1b1739fa0b7)) +* ecogesture filter button ([5bc3297](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/5bc32977e73033cb3a6ad2959797c88933074f87)) +* new DJU API ([65ef63f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/65ef63f8f5fe27fa799897f3949c1310fbb99d3a)) +* **newsletter:** previous month year in January ([6f60a3f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6f60a3f0258e7e151447de663f94bd590b6f1b40)) +* profile equipment alignment ([754103e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/754103e5803c5b0277a46ab755d551212261060e)) +* **profileType:** equipment label & alignment ([99e3175](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/99e3175aee6fc4e030a6b2e974e78303024f1ad4)) +* remove hard coded texts ([0ee3d33](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/0ee3d33a38b6b6d4c60b21e460410899c4010ad8)) +* removes "ma bulle" ([71aba15](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/71aba15259bf08a0c86ba2d41f5888af3b95fabc)) +* **tests:** leap year breaking tests ([87046a1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87046a1eaf503c8d5c730163661cb0c3e4d7a01a)) +* updated link to Self Data Docs ([aab41cf](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/aab41cf3042b4ce4416856341289e153a1bb2203)) +* **wording:** disconnect konnector ([dedd4b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dedd4b87a7f7079a7e9a9e6fc94eaae652121cae)) + ### [2.7.2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.7.1...v2.7.2) (2023-11-30) diff --git a/README.md b/README.md index d7c001cc9d082083d57eb945fe5471638618d406..b25b56912533e54d1338a32e278e0107c0112791 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Ecolyo uses "konnectors" for fetching data. More on : ## Development -For a more complete look at our project, check our [Self Data Docs](https://doc.self-data.alpha.grandlyon.com/) +For a more complete look at our project, check our [Self Data Docs](https://doc-self-data.apps.grandlyon.com/) _:pushpin: Note:_ we recommend to use [Yarn] instead of NPM for package management. diff --git a/app.config.react.js b/app.config.react.js index 7dba378a9311428eefd03c8b39dfb743be15bee0..20b70d3b6722534e63100a7a4b1462b29136a067 100644 --- a/app.config.react.js +++ b/app.config.react.js @@ -58,6 +58,23 @@ module.exports = { from: './src/assets/icons/email', to: './assets/', }, + { + from: `./src/targets/vendor/assets/icon.svg`, + to: 'public/', + }, + { + from: `./src/targets/vendor/assets/favicon*`, + to: 'public/', + flatten: true, + }, + { + from: `./src/targets/vendor/assets/apple-touch-icon.png`, + to: 'public/apple-touch-icon.png', + }, + { + from: `./src/targets/vendor/assets/safari-pinned-tab.svg`, + to: 'public/safari-pinned-tab.svg', + }, ], }), new webpack.DefinePlugin({ diff --git a/app.config.services.alpha.js b/app.config.services.alpha.js index f7edfa4873f55398b17f2550558f30e0709b7faf..c142fe8086c9b2a6227d1fa5196ec33885007de9 100644 --- a/app.config.services.alpha.js +++ b/app.config.services.alpha.js @@ -14,7 +14,7 @@ const fs = require('fs-extra') const paths = require('cozy-scripts/utils/paths') const { eslintFix, - getFilename, + makeFilename, target, } = require('cozy-scripts/config/webpack.vars') @@ -45,7 +45,7 @@ const config = { entry: servicesEntries, output: { path: paths.appServicesBuild(), - filename: `${getFilename(false)}.js`, + filename: `${makeFilename(false)}.js`, }, target: 'node', optimization: {}, // reset optimization property diff --git a/app.config.services.js b/app.config.services.js index edc28bebe027e4eff44d83d445c34422023ff0c7..90e088558552dd7c1855b974a0a05a0f2682d111 100644 --- a/app.config.services.js +++ b/app.config.services.js @@ -14,7 +14,7 @@ const fs = require('fs-extra') const paths = require('cozy-scripts/utils/paths') const { eslintFix, - getFilename, + makeFilename, target, } = require('cozy-scripts/config/webpack.vars') @@ -45,7 +45,7 @@ const config = { entry: servicesEntries, output: { path: paths.appServicesBuild(), - filename: `${getFilename(false)}.js`, + filename: `${makeFilename(false)}.js`, }, target: 'node', optimization: {}, // reset optimization property diff --git a/manifest.webapp b/manifest.webapp index bab84280f862fdf7ea1424e350fd26bf7555c25e..37f256c9d8be3c63a3d719a68302624c8180dee5 100644 --- a/manifest.webapp +++ b/manifest.webapp @@ -1,9 +1,9 @@ { "name": "Ecolyo", "slug": "ecolyo", - "icon": "icon.svg", + "icon": "public/icon.svg", "categories": ["energy"], - "version": "2.7.2", + "version": "2.8.0", "licence": "AGPL-3.0", "editor": "Métropole de Lyon", "default_locale": "fr", @@ -162,6 +162,11 @@ "url": "https://www.grandlyon.com/" }, "routes": { + "/public": { + "folder": "/public", + "index": "index.html", + "public": true + }, "/": { "folder": "/", "index": "index.html", @@ -235,7 +240,7 @@ "verbs": ["GET"] }, "ecolyo-dju": { - "type": "org.ecolyo.dju_v2", + "type": "org.ecolyo.dju_v3", "verbs": ["GET"] }, "dacc": { diff --git a/package.json b/package.json index b673860e1c4d66ea9d2670b67db9109a6b16fbca..2a58e3818da63ee5b0aa447af6bd0074946b757c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ecolyo", - "version": "2.7.2", + "version": "2.8.0", "engines": { "node": "16" }, @@ -19,7 +19,6 @@ "lint": "yarn lint:js", "lint:js": "eslint src -c .eslintrc.js --fix", "load-data": "cd test && importData.bat", - "prepare": "husky install", "release": "standard-version --no-verify", "start": "cs start --browser", "start:stack": "cs start --browser --stack", @@ -59,7 +58,7 @@ "cozy-keys-lib": ">=4.1.9", "cozy-logger": ">1.7.0", "cozy-realtime": "4.2.8", - "cozy-scripts": "6.3.10", + "cozy-scripts": "8.1", "cozy-ui": "81.9.0", "d3": "^6.0.0", "detect-browser": "^5.1.1", @@ -72,8 +71,8 @@ "mjml-browser": "^4.10.2", "null-loader": "^4.0.1", "object-hash": "^3.0.0", - "react": "16.14.0", - "react-dom": "16.14.0", + "react": "18.2.0", + "react-dom": "18.2.0", "react-inspector": "^5.1", "react-redux": "^8.1.2", "react-router-dom": "^6.6.1", @@ -86,9 +85,8 @@ "devDependencies": { "@babel/preset-typescript": "^7.7.4", "@testing-library/dom": "^9.3.3", - "@testing-library/jest-dom": "^6.1.3", - "@testing-library/react": "^12.1.0", - "@testing-library/react-hooks": "^8.0.0", + "@testing-library/jest-dom": "^6.1.4", + "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.5.1", "@types/d3": "^6.0.0", "@types/file-saver": "^2.0.5", @@ -98,10 +96,9 @@ "@types/luxon": "^3.0.0", "@types/node-fetch": "^2.5.7", "@types/object-hash": "^2.0.0", - "@types/react": "^16.9.15", - "@types/react-dom": "^16.9.8", + "@types/react": "^18.2.25", + "@types/react-dom": "^18.2.11", "@types/react-lottie": "^1.2.3", - "@types/react-router-dom": "^5.3.3", "@types/redux-mock-store": "^1.0.2", "@typescript-eslint/eslint-plugin": "^5.56.0", "@typescript-eslint/parser": "^5.56.0", @@ -114,24 +111,21 @@ "eslint": "^8.49.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-jest": "^27.2.3", - "eslint-plugin-jsdoc": "^46.8.2", + "eslint-plugin-jsdoc": "^47.0.2", "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "^4.6.0", "git-directory-deploy": "1.5.1", - "husky": "^8.0.1", "jest-canvas-mock": "^2.4.0", - "jest-junit": "^15.0.0", - "lint-staged": ">=8", + "jest-junit": "^16.0.0", "loglevel": "^1.6.6", "luxon": "^3.0.0", "mjml": "^4.10.2", "mjml-web": "^4.10.0", "prettier": "^3.0.0", - "prettier-eslint": "^15.0.1", + "prettier-eslint": "^16.0.0", "raw-loader": "^4.0.2", - "react-test-renderer": "16.14.0", "redux-mock-store": "1.5.4", "sass": "^1.49.11", "sass-loader": "^8.0.0", @@ -139,16 +133,5 @@ "typescript": "^5.0.0", "uglifyjs-webpack-plugin": "^2.2.0", "webextension-polyfill": "^0.10.0" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "lint-staged": { - "{src,test}/**/*.{js,jsx,ts,tsx}": [ - "eslint --fix", - "git add" - ] } } diff --git a/scripts/config.template.js b/scripts/config.template.js index 5988a8518c26e209466edbd60a6d6dd19637c901..730db3441b0abe091627cb8c1de72f316e78e0cb 100644 --- a/scripts/config.template.js +++ b/scripts/config.template.js @@ -6,15 +6,15 @@ const authorization = const cookie = 'cozysessid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -const startingdate = DateTime.local().plus({ days: -120 }).startOf('day') +const startingDate = DateTime.local().plus({ days: -120 }).startOf('day') const endingDate = DateTime.local().plus({ days: -1 }).startOf('day') /** Elec starting date */ -const halfHourStartingdate = DateTime.local().plus({ days: -15 }).startOf('day') +const halfHourStartingDate = DateTime.local().plus({ days: -15 }).startOf('day') module.exports = { authorization, cookie, - startingdate, + startingDate, endingDate, - halfHourStartingdate, + halfHourStartingDate, } diff --git a/scripts/createConnections.js b/scripts/createConnections.js index c857d3f6fac014027eb3f1af41151dd75c7a3e41..728531c3b77fe2b8c8aaeabd37294406c72348a5 100644 --- a/scripts/createConnections.js +++ b/scripts/createConnections.js @@ -23,6 +23,7 @@ const dataEnedisAccount = JSON.stringify({ data: { consentId: 43, expirationDate: '2023-09-26', + offPeakHours: '22H00-6H00', }, id: '70e68b8450cee09fe2f077610901094d', identifier: 'address', diff --git a/scripts/createDayDataFiles.js b/scripts/createDayDataFiles.js index 2159ee996e6ff1e157ee57e3972b8ca8d8817391..1302b0384c784baaba9e3df4b934989f1e2c5f3b 100644 --- a/scripts/createDayDataFiles.js +++ b/scripts/createDayDataFiles.js @@ -6,48 +6,25 @@ const fs = require('fs') const { DateTime } = require('luxon') const config = require('./config') -function getRandomInt(min, max) { - const minValue = Math.ceil(min * 100) - const maxValue = Math.floor(max * 100) - // NOSONAR - const result = - (Math.floor(Math.random() * (maxValue - minValue)) + minValue) / 100 // NOSONAR - return result +function getRandomNumber(min, max) { + // Generate a random float between min and max + let randomFloat = Math.random() * (max - min) + min + // Round to two decimal places + randomFloat = Math.round(randomFloat * 100) / 100 + return randomFloat } -const generateHalfAnHourData = (_startingdate, _endingDate, min, max) => { - let parsingDate - - parsingDate = DateTime.local( - _startingdate.year, - _startingdate.month, - _startingdate.day, +const generateHalfAnHourData = (startingDate, endingDate, min, max) => { + let parsingDate = DateTime.local( + startingDate.year, + startingDate.month, + startingDate.day, 0, 0 ) - const halfAnHourDumpArray = [] - - let lastDay = parsingDate.day - const dayDumpArray = [] - - let lastMonth = parsingDate.month - const monthDumpArray = [] - - let lastYear = parsingDate.year - const yearDumpArray = [] - - let dailyLoad = 0 - let monthlyLoad = 0 - let yearlyLoad = 0 - - while (parsingDate <= _endingDate) { - const load = getRandomInt(min, max) - - dailyLoad += load - monthlyLoad += load - yearlyLoad += load - + while (parsingDate <= endingDate) { + const load = getRandomNumber(min, max) halfAnHourDumpArray.push({ load: load, year: parsingDate.year, @@ -56,107 +33,20 @@ const generateHalfAnHourData = (_startingdate, _endingDate, min, max) => { hour: parsingDate.hour, minute: parsingDate.minute, }) - - if (parsingDate.day !== lastDay) { - dayDumpArray.push({ - load: Math.round(dailyLoad * 100) / 100, - year: lastYear, - month: lastMonth, - day: lastDay, - hour: 0, - minute: 0, - }) - dailyLoad = 0 - lastDay = parsingDate.day - } - - if (parsingDate.month !== lastMonth) { - monthDumpArray.push({ - load: Math.round(monthlyLoad * 100) / 100, - year: lastYear, - month: lastMonth, - day: 0, - hour: 0, - minute: 0, - }) - monthlyLoad = 0 - lastMonth = parsingDate.month - } - - if (parsingDate.year !== lastYear) { - yearDumpArray.push({ - load: Math.round(yearlyLoad * 100) / 100, - year: lastYear, - month: 1, - day: 1, - hour: 0, - minute: 0, - }) - yearlyLoad = 0 - lastYear = parsingDate.year - } parsingDate = parsingDate.plus({ minute: 30 }) } - - dayDumpArray.push({ - load: Math.round(dailyLoad * 100) / 100, - year: lastYear, - month: lastMonth, - day: lastDay, - hour: 0, - minute: 0, - }) - - monthDumpArray.push({ - load: Math.round(monthlyLoad * 100) / 100, - year: lastYear, - month: lastMonth, - day: 1, - hour: 0, - minute: 0, - }) - - yearDumpArray.push({ - load: Math.round(yearlyLoad * 100) / 100, - year: lastYear, - month: 1, - day: 1, - hour: 0, - minute: 0, - }) - - return { - halfAnHourLoad: halfAnHourDumpArray, - dailyLoad: dayDumpArray, - monthlyLoad: monthDumpArray, - yearlyLoad: yearDumpArray, - } + return halfAnHourDumpArray } -const generateData = (_startingdate, _endingDate, min, max) => { +const generateData = (startingDate, endingDate, min, max) => { let parsingDate = DateTime.local( - _startingdate.year, - _startingdate.month, - _startingdate.day + startingDate.year, + startingDate.month, + startingDate.day ) - const dayDumpArray = [] - - let lastMonth = parsingDate.month - const monthDumpArray = [] - - let lastYear = parsingDate.year - const yearDumpArray = [] - - let monthlyLoad = 0 - let yearlyLoad = 0 - - while (parsingDate <= _endingDate) { - const load = getRandomInt(min, max) - - monthlyLoad += load - yearlyLoad += load - + while (parsingDate <= endingDate) { + const load = getRandomNumber(min, max) dayDumpArray.push({ load: load, year: parsingDate.year, @@ -165,58 +55,51 @@ const generateData = (_startingdate, _endingDate, min, max) => { hour: 0, minute: 0, }) - - if (parsingDate.month !== lastMonth) { - monthDumpArray.push({ - load: Math.round(monthlyLoad * 100) / 100, - year: lastYear, - month: lastMonth, - day: 0, - hour: 0, - minute: 0, - }) - monthlyLoad = 0 - lastMonth = parsingDate.month - } - - if (parsingDate.year !== lastYear) { - yearDumpArray.push({ - load: Math.round(yearlyLoad * 100) / 100, - year: lastYear, - month: 1, - day: 1, - hour: 0, - minute: 0, - }) - yearlyLoad = 0 - lastYear = parsingDate.year - } parsingDate = parsingDate.plus({ days: 1 }) } + return dayDumpArray +} - monthDumpArray.push({ - load: Math.round(monthlyLoad * 100) / 100, - year: lastYear, - month: lastMonth, - day: 1, - hour: 0, - minute: 0, - }) - - yearDumpArray.push({ - load: Math.round(yearlyLoad * 100) / 100, - year: lastYear, - month: 1, - day: 1, - hour: 0, - minute: 0, +// Function to aggregate load data for a specific period +function aggregateLoadData(data, period) { + const aggregatedData = {} + data.forEach(entry => { + let key + const entryCopy = { ...entry } + switch (period) { + case 'day': + key = `${entryCopy.year}-${entryCopy.month}-${entryCopy.day}` + entryCopy.hour = 0 + entryCopy.minute = 0 + break + case 'month': + key = `${entryCopy.year}-${entryCopy.month}` + entryCopy.day = 0 + entryCopy.minute = 0 + break + case 'year': + key = `${entryCopy.year}` + entryCopy.month = 0 + entryCopy.day = 0 + entryCopy.minute = 0 + break + default: + break + } + if (!aggregatedData[key]) { + aggregatedData[key] = { + load: entryCopy.load, + year: entryCopy.year, + month: entryCopy.month, + day: entryCopy.day, + hour: entryCopy.hour, + minute: entryCopy.minute, + } + } else { + aggregatedData[key].load += entryCopy.load + } }) - - return { - dailyLoad: dayDumpArray, - monthlyLoad: monthDumpArray, - yearlyLoad: yearDumpArray, - } + return Object.values(aggregatedData) } // Create data folder @@ -226,67 +109,53 @@ if (!fs.existsSync(dir)) { fs.mkdirSync(dir) } -const startingdate = config.startingdate +const startingDate = config.startingDate const endingDate = config.endingDate -const halfHourStartingdate = config.halfHourStartingdate +const halfHourStartingDate = config.halfHourStartingDate -const Elec = generateHalfAnHourData( - halfHourStartingdate, +const elecHalfHourData = generateHalfAnHourData( + halfHourStartingDate, endingDate.endOf('day'), 0.12, 0.36 ) -const Gaz = generateData(startingdate, endingDate, 16, 68) -const Eau = generateData(startingdate, endingDate, 200, 300) - -const dumpElec = { - 'com.grandlyon.enedis.minute': Elec.halfAnHourLoad, - 'com.grandlyon.enedis.day': Elec.dailyLoad, - 'com.grandlyon.enedis.month': Elec.monthlyLoad, - 'com.grandlyon.enedis.year': Elec.yearlyLoad, -} -const dumpStringElec = JSON.stringify(dumpElec) -fs.writeFile('data/dayData-elec.json', dumpStringElec, function (err) { - if (err) console.log('error', err) -}) +// Aggregate all half-hour data available and generate more daily data between startingDate and halfHourStartingDate +const elecAggregatedDayData = aggregateLoadData(elecHalfHourData, 'day') +const elecGeneratedDayData = generateData( + startingDate, + halfHourStartingDate.minus({ days: 1 }), + 4, + 8 +) +const elecDayData = [...elecAggregatedDayData, ...elecGeneratedDayData] +const elecMonthData = aggregateLoadData(elecDayData, 'month') +const elecYearData = aggregateLoadData(elecMonthData, 'year') -const dumpGas = { - 'com.grandlyon.grdf.day': Gaz.dailyLoad, - 'com.grandlyon.grdf.month': Gaz.monthlyLoad, - 'com.grandlyon.grdf.year': Gaz.yearlyLoad, -} -const dumpStringGas = JSON.stringify(dumpGas) -fs.writeFile('data/dayData-gas.json', dumpStringGas, function (err) { - if (err) console.log('error', err) -}) +const gasDayData = generateData(startingDate, endingDate, 16, 68) +const gasMonthData = aggregateLoadData(gasDayData, 'month') +const gasYearData = aggregateLoadData(gasMonthData, 'year') -const dumpWater = { - 'com.grandlyon.egl.day': Eau.dailyLoad, - 'com.grandlyon.egl.month': Eau.monthlyLoad, - 'com.grandlyon.egl.year': Eau.yearlyLoad, -} -const dumpStringWater = JSON.stringify(dumpWater) -fs.writeFile('data/dayData-water.json', dumpStringWater, function (err) { - if (err) console.log('error', err) -}) +const waterDayData = generateData(startingDate, endingDate, 200, 300) +const waterMonthData = aggregateLoadData(waterDayData, 'month') +const waterYearData = aggregateLoadData(waterMonthData, 'year') const dump = { - 'com.grandlyon.enedis.minute': Elec.halfAnHourLoad, - 'com.grandlyon.enedis.day': Elec.dailyLoad, - 'com.grandlyon.enedis.month': Elec.monthlyLoad, - 'com.grandlyon.enedis.year': Elec.yearlyLoad, - - 'com.grandlyon.grdf.day': Gaz.dailyLoad, - 'com.grandlyon.grdf.month': Gaz.monthlyLoad, - 'com.grandlyon.grdf.year': Gaz.yearlyLoad, - - 'com.grandlyon.egl.day': Eau.dailyLoad, - 'com.grandlyon.egl.month': Eau.monthlyLoad, - 'com.grandlyon.egl.year': Eau.yearlyLoad, + 'com.grandlyon.enedis.minute': elecHalfHourData, + 'com.grandlyon.enedis.day': elecDayData, + 'com.grandlyon.enedis.month': elecMonthData, + 'com.grandlyon.enedis.year': elecYearData, + + 'com.grandlyon.grdf.day': gasDayData, + 'com.grandlyon.grdf.month': gasMonthData, + 'com.grandlyon.grdf.year': gasYearData, + + 'com.grandlyon.egl.day': waterDayData, + 'com.grandlyon.egl.month': waterMonthData, + 'com.grandlyon.egl.year': waterYearData, } const dumpString = JSON.stringify(dump) -fs.writeFile('data/dayData.json', dumpString, function (err) { +fs.writeFile('data/loads.json', dumpString, function (err) { if (err) console.log('error', err) }) diff --git a/scripts/importData.sh b/scripts/importData.sh index 3c3f3fb341b55d4748d25e419056189d09f2bb60..feac52a29b5b4022fb0ee19fb5b0400cf17bb2fb 100755 --- a/scripts/importData.sh +++ b/scripts/importData.sh @@ -1,4 +1,14 @@ -cozyssid="" -read -p "Please provide Cozyssid (can be found after connection in browser dev tool): " cozyssid -ACH -t cozyssid -u http://cozy.tools:8080 import ./data/dayData.json -rm cozyssid \ No newline at end of file +# Drop previous data +ACH -u http://cozy.tools:8080 -y drop \ + com.grandlyon.enedis.minute \ + com.grandlyon.enedis.day \ + com.grandlyon.enedis.month \ + com.grandlyon.enedis.year \ + com.grandlyon.grdf.day \ + com.grandlyon.grdf.month \ + com.grandlyon.grdf.year \ + com.grandlyon.egl.day \ + com.grandlyon.egl.month \ + com.grandlyon.egl.year + # Import new data +ACH -u http://cozy.tools:8080 import ./data/loads.json \ No newline at end of file diff --git a/src/assets/icons/ico/bill.svg b/src/assets/icons/ico/bill.svg index d1a3cb9d7f3e96c134239a1fc450c7d48227530c..21f23850367492d12ecd2ee7ba9e4d739770bd52 100644 --- a/src/assets/icons/ico/bill.svg +++ b/src/assets/icons/ico/bill.svg @@ -1,7 +1,11 @@ -<svg width="48" height="62" viewBox="0 0 48 62" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path fill-rule="evenodd" clip-rule="evenodd" d="M0 11V62H48V0H11L0 11Z" fill="#B2C0CA"/> -<path d="M11 11H0L11 0V11Z" fill="#8DA1B0"/> -<rect x="5" y="20" width="21" height="19" fill="#EFF2F4"/> -<rect x="9" y="23" width="13" height="3" fill="#8DA1B0"/> -<path d="M16.9902 10V7.13672H18.9219V7.47461H17.3691V8.36133H18.7129V8.69922H17.3691V10H16.9902ZM18.8789 10L19.9785 7.13672H20.3867L21.5586 10H21.127L20.793 9.13281H19.5957L19.2812 10H18.8789ZM19.7051 8.82422H20.6758L20.377 8.03125C20.2858 7.79036 20.2181 7.59245 20.1738 7.4375C20.1374 7.62109 20.0859 7.80339 20.0195 7.98438L19.7051 8.82422ZM23.9043 8.99609L24.2832 9.0918C24.2038 9.40299 24.0605 9.64062 23.8535 9.80469C23.6478 9.96745 23.3958 10.0488 23.0977 10.0488C22.7891 10.0488 22.5378 9.98633 22.3438 9.86133C22.151 9.73503 22.0039 9.55273 21.9023 9.31445C21.8021 9.07617 21.752 8.82031 21.752 8.54688C21.752 8.2487 21.8086 7.98893 21.9219 7.76758C22.0365 7.54492 22.1986 7.3763 22.4082 7.26172C22.6191 7.14583 22.8509 7.08789 23.1035 7.08789C23.39 7.08789 23.6309 7.16081 23.8262 7.30664C24.0215 7.45247 24.1576 7.65755 24.2344 7.92188L23.8613 8.00977C23.7949 7.80143 23.6986 7.64974 23.5723 7.55469C23.446 7.45964 23.2871 7.41211 23.0957 7.41211C22.8757 7.41211 22.6914 7.46484 22.543 7.57031C22.3958 7.67578 22.2923 7.81771 22.2324 7.99609C22.1725 8.17318 22.1426 8.35612 22.1426 8.54492C22.1426 8.78841 22.1777 9.0013 22.248 9.18359C22.3197 9.36458 22.4303 9.5 22.5801 9.58984C22.7298 9.67969 22.8919 9.72461 23.0664 9.72461C23.2786 9.72461 23.4583 9.66341 23.6055 9.54102C23.7526 9.41862 23.8522 9.23698 23.9043 8.99609ZM25.4805 10V7.47461H24.5371V7.13672H26.8066V7.47461H25.8594V10H25.4805ZM29.0762 7.13672H29.4551V8.79102C29.4551 9.07878 29.4225 9.30729 29.3574 9.47656C29.2923 9.64583 29.1745 9.78385 29.0039 9.89062C28.8346 9.99609 28.612 10.0488 28.3359 10.0488C28.0677 10.0488 27.8483 10.0026 27.6777 9.91016C27.5072 9.81771 27.3854 9.68424 27.3125 9.50977C27.2396 9.33398 27.2031 9.0944 27.2031 8.79102V7.13672H27.582V8.78906C27.582 9.03776 27.6048 9.22135 27.6504 9.33984C27.6973 9.45703 27.7767 9.54753 27.8887 9.61133C28.002 9.67513 28.14 9.70703 28.3027 9.70703C28.5814 9.70703 28.7799 9.64388 28.8984 9.51758C29.0169 9.39128 29.0762 9.14844 29.0762 8.78906V7.13672ZM30.0938 10V7.13672H31.3633C31.6185 7.13672 31.8125 7.16276 31.9453 7.21484C32.0781 7.26562 32.1842 7.35612 32.2637 7.48633C32.3431 7.61654 32.3828 7.76042 32.3828 7.91797C32.3828 8.12109 32.3171 8.29232 32.1855 8.43164C32.054 8.57096 31.8509 8.65951 31.5762 8.69727C31.6764 8.74544 31.7526 8.79297 31.8047 8.83984C31.9154 8.94141 32.0202 9.06836 32.1191 9.2207L32.6172 10H32.1406L31.7617 9.4043C31.651 9.23242 31.5599 9.10091 31.4883 9.00977C31.4167 8.91862 31.3522 8.85482 31.2949 8.81836C31.2389 8.7819 31.1816 8.75651 31.123 8.74219C31.0801 8.73307 31.0098 8.72852 30.9121 8.72852H30.4727V10H30.0938ZM30.4727 8.40039H31.2871C31.4603 8.40039 31.5957 8.38281 31.6934 8.34766C31.791 8.3112 31.8652 8.25391 31.916 8.17578C31.9668 8.09635 31.9922 8.01042 31.9922 7.91797C31.9922 7.78255 31.9427 7.67122 31.8438 7.58398C31.7461 7.49674 31.5911 7.45312 31.3789 7.45312H30.4727V8.40039ZM32.9863 10V7.13672H35.0566V7.47461H33.3652V8.35156H34.9492V8.6875H33.3652V9.66211H35.123V10H32.9863ZM11.4082 15V12.1367H12.3945C12.6172 12.1367 12.7871 12.1504 12.9043 12.1777C13.0684 12.2155 13.2083 12.2839 13.3242 12.3828C13.4753 12.5104 13.5879 12.6738 13.6621 12.873C13.7376 13.071 13.7754 13.2975 13.7754 13.5527C13.7754 13.7702 13.75 13.9629 13.6992 14.1309C13.6484 14.2988 13.5833 14.4382 13.5039 14.5488C13.4245 14.6582 13.3372 14.7448 13.2422 14.8086C13.1484 14.8711 13.0345 14.9186 12.9004 14.9512C12.7676 14.9837 12.6146 15 12.4414 15H11.4082ZM11.7871 14.6621H12.3984C12.5872 14.6621 12.735 14.6445 12.8418 14.6094C12.9499 14.5742 13.0358 14.5247 13.0996 14.4609C13.1895 14.3711 13.2591 14.2507 13.3086 14.0996C13.3594 13.9473 13.3848 13.763 13.3848 13.5469C13.3848 13.2474 13.3353 13.0176 13.2363 12.8574C13.1387 12.696 13.0195 12.5879 12.8789 12.5332C12.7773 12.4941 12.6139 12.4746 12.3887 12.4746H11.7871V14.6621ZM14.2324 12.5156V12.1074H14.6094V12.4297C14.6094 12.6042 14.5892 12.7298 14.5488 12.8066C14.4928 12.9121 14.4056 12.9915 14.2871 13.0449L14.2012 12.9062C14.2715 12.8776 14.3236 12.8327 14.3574 12.7715C14.3926 12.709 14.4121 12.6237 14.416 12.5156H14.2324ZM15.1973 15V12.1367H17.2676V12.4746H15.5762V13.3516H17.1602V13.6875H15.5762V14.6621H17.334V15H15.1973ZM15.9785 11.9609L16.2383 11.4141H16.6992L16.2695 11.9609H15.9785ZM17.8418 15V12.1367H18.2207V14.6621H19.6309V15H17.8418ZM20.0918 15V12.1367H22.1621V12.4746H20.4707V13.3516H22.0547V13.6875H20.4707V14.6621H22.2285V15H20.0918ZM24.7949 13.9961L25.1738 14.0918C25.0944 14.403 24.9512 14.6406 24.7441 14.8047C24.5384 14.9674 24.2865 15.0488 23.9883 15.0488C23.6797 15.0488 23.4284 14.9863 23.2344 14.8613C23.0417 14.735 22.8945 14.5527 22.793 14.3145C22.6927 14.0762 22.6426 13.8203 22.6426 13.5469C22.6426 13.2487 22.6992 12.9889 22.8125 12.7676C22.9271 12.5449 23.0892 12.3763 23.2988 12.2617C23.5098 12.1458 23.7415 12.0879 23.9941 12.0879C24.2806 12.0879 24.5215 12.1608 24.7168 12.3066C24.9121 12.4525 25.0482 12.6576 25.125 12.9219L24.752 13.0098C24.6855 12.8014 24.5892 12.6497 24.4629 12.5547C24.3366 12.4596 24.1777 12.4121 23.9863 12.4121C23.7663 12.4121 23.582 12.4648 23.4336 12.5703C23.2865 12.6758 23.1829 12.8177 23.123 12.9961C23.0632 13.1732 23.0332 13.3561 23.0332 13.5449C23.0332 13.7884 23.0684 14.0013 23.1387 14.1836C23.2103 14.3646 23.321 14.5 23.4707 14.5898C23.6204 14.6797 23.7826 14.7246 23.957 14.7246C24.1693 14.7246 24.349 14.6634 24.4961 14.541C24.6432 14.4186 24.7428 14.237 24.7949 13.9961ZM26.3711 15V12.4746H25.4277V12.1367H27.6973V12.4746H26.75V15H26.3711ZM28.0938 15V12.1367H29.3633C29.6185 12.1367 29.8125 12.1628 29.9453 12.2148C30.0781 12.2656 30.1842 12.3561 30.2637 12.4863C30.3431 12.6165 30.3828 12.7604 30.3828 12.918C30.3828 13.1211 30.3171 13.2923 30.1855 13.4316C30.054 13.571 29.8509 13.6595 29.5762 13.6973C29.6764 13.7454 29.7526 13.793 29.8047 13.8398C29.9154 13.9414 30.0202 14.0684 30.1191 14.2207L30.6172 15H30.1406L29.7617 14.4043C29.651 14.2324 29.5599 14.1009 29.4883 14.0098C29.4167 13.9186 29.3522 13.8548 29.2949 13.8184C29.2389 13.7819 29.1816 13.7565 29.123 13.7422C29.0801 13.7331 29.0098 13.7285 28.9121 13.7285H28.4727V15H28.0938ZM28.4727 13.4004H29.2871C29.4603 13.4004 29.5957 13.3828 29.6934 13.3477C29.791 13.3112 29.8652 13.2539 29.916 13.1758C29.9668 13.0964 29.9922 13.0104 29.9922 12.918C29.9922 12.7826 29.9427 12.6712 29.8438 12.584C29.7461 12.4967 29.5911 12.4531 29.3789 12.4531H28.4727V13.4004ZM31.043 15V12.1367H31.4219V15H31.043ZM34.1348 13.9961L34.5137 14.0918C34.4342 14.403 34.291 14.6406 34.084 14.8047C33.8783 14.9674 33.6263 15.0488 33.3281 15.0488C33.0195 15.0488 32.7682 14.9863 32.5742 14.8613C32.3815 14.735 32.2344 14.5527 32.1328 14.3145C32.0326 14.0762 31.9824 13.8203 31.9824 13.5469C31.9824 13.2487 32.0391 12.9889 32.1523 12.7676C32.2669 12.5449 32.429 12.3763 32.6387 12.2617C32.8496 12.1458 33.0814 12.0879 33.334 12.0879C33.6204 12.0879 33.8613 12.1608 34.0566 12.3066C34.252 12.4525 34.388 12.6576 34.4648 12.9219L34.0918 13.0098C34.0254 12.8014 33.929 12.6497 33.8027 12.5547C33.6764 12.4596 33.5176 12.4121 33.3262 12.4121C33.1061 12.4121 32.9219 12.4648 32.7734 12.5703C32.6263 12.6758 32.5228 12.8177 32.4629 12.9961C32.403 13.1732 32.373 13.3561 32.373 13.5449C32.373 13.7884 32.4082 14.0013 32.4785 14.1836C32.5501 14.3646 32.6608 14.5 32.8105 14.5898C32.9603 14.6797 33.1224 14.7246 33.2969 14.7246C33.5091 14.7246 33.6888 14.6634 33.8359 14.541C33.9831 14.4186 34.0827 14.237 34.1348 13.9961ZM35.0469 15V12.1367H35.4258V15H35.0469ZM36.8242 15V12.4746H35.8809V12.1367H38.1504V12.4746H37.2031V15H36.8242ZM38.5488 15V12.1367H40.6191V12.4746H38.9277V13.3516H40.5117V13.6875H38.9277V14.6621H40.6855V15H38.5488ZM39.3301 11.9609L39.5898 11.4141H40.0508L39.6211 11.9609H39.3301Z" fill="white"/> -</svg> +<svg width="17" height="26" viewBox="0 0 17 26" fill="none" xmlns="http://www.w3.org/2000/svg"> + <path d="M0.5 25.5V0.5H15.6379V19.9276L10.2769 25.5H0.5Z" stroke="#E3B82A" /> + <path d="M14.9916 20.5L11.0687 24.7264V20.5H14.9916Z" stroke="#E3B82A" /> + <line x1="2.68967" y1="3.08594" x2="13.4483" y2="3.08594" stroke="#E3B82A" /> + <line x1="2.68967" y1="5.77539" x2="13.4483" y2="5.77539" stroke="#E3B82A" /> + <line x1="2.68967" y1="8.46582" x2="13.4483" y2="8.46582" stroke="#E3B82A" /> + <line x1="2.68967" y1="11.1553" x2="13.4483" y2="11.1553" stroke="#E3B82A" /> + <line x1="2.68967" y1="13.8447" x2="13.4483" y2="13.8447" stroke="#E3B82A" /> + <line x1="2.68967" y1="16.5342" x2="8.96553" y2="16.5342" stroke="#E3B82A" /> + <path d="M2.68967 20.6203L4.48277 22.4134L8.06898 18.8271" stroke="#E3B82A" /> +</svg> \ No newline at end of file diff --git a/src/assets/icons/ico/ecolyo-glow.svg b/src/assets/icons/ico/ecolyo-glow.svg new file mode 100644 index 0000000000000000000000000000000000000000..c217712d3af655e3615f344afdb22fa23a324017 --- /dev/null +++ b/src/assets/icons/ico/ecolyo-glow.svg @@ -0,0 +1,58 @@ +<svg width="228" height="249" viewBox="0 0 228 249" fill="none" xmlns="http://www.w3.org/2000/svg"> + <g filter="url(#filter0_d_4378_69559)"> + <path + d="M110.852 212.899C112.838 213.7 115.162 213.7 117.148 212.899C198.86 179.9 195.538 133.68 191.154 66.0254C190.872 61.6752 187.352 58.2489 183.005 57.844C159.608 55.6649 138.398 48.2952 118.552 36.7284C115.741 35.0905 112.259 35.0905 109.448 36.7284C89.6016 48.2952 68.3915 55.6649 44.9949 57.844C40.6482 58.2489 37.1276 61.6752 36.8457 66.0254C32.462 133.68 29.1399 179.9 110.852 212.899Z" + fill="url(#paint0_radial_4378_69559)" /> + </g> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M181.256 67.6897C183.459 101.819 184.876 127.581 177.021 149.071C169.536 169.547 152.867 187.663 114 203.547C75.1333 187.663 58.4641 169.547 50.9795 149.071C43.1242 127.581 44.5412 101.819 46.7439 67.6897C71.1918 65.1969 93.3787 57.4376 114 45.5387C134.621 57.4376 156.808 65.1969 181.256 67.6897ZM117.179 213.892C115.174 214.703 112.826 214.703 110.821 213.892C28.6299 180.652 31.64 134.145 36.0399 66.163L36.0913 65.3684C36.376 60.9693 39.9309 57.5045 44.3202 57.0951C67.9456 54.8915 89.3631 47.4389 109.404 35.7422C112.242 34.0859 115.758 34.0859 118.596 35.7422C138.637 47.4389 160.054 54.8915 183.68 57.0951C188.069 57.5045 191.624 60.9693 191.909 65.3684L191.96 66.163C196.36 134.145 199.37 180.652 117.179 213.892Z" + fill="#FFC600" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M181.256 67.6897C183.459 101.819 184.876 127.581 177.021 149.071C169.536 169.547 152.867 187.663 114 203.547C75.1333 187.663 58.4641 169.547 50.9795 149.071C43.1242 127.581 44.5412 101.819 46.7439 67.6897C71.1918 65.1969 93.3787 57.4376 114 45.5387C134.621 57.4376 156.808 65.1969 181.256 67.6897ZM117.179 213.892C115.174 214.703 112.826 214.703 110.821 213.892C28.6299 180.652 31.64 134.145 36.0399 66.163L36.0913 65.3684C36.376 60.9693 39.9309 57.5045 44.3202 57.0951C67.9456 54.8915 89.3631 47.4389 109.404 35.7422C112.242 34.0859 115.758 34.0859 118.596 35.7422C138.637 47.4389 160.054 54.8915 183.68 57.0951C188.069 57.5045 191.624 60.9693 191.909 65.3684L191.96 66.163C196.36 134.145 199.37 180.652 117.179 213.892Z" + fill="url(#paint1_linear_4378_69559)" fill-opacity="0.75" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M114.002 214.5C115.089 214.5 116.176 214.297 117.178 213.892C199.369 180.652 196.359 134.145 191.959 66.1631L191.908 65.3684C191.623 60.9693 188.068 57.5045 183.679 57.0951C160.054 54.8915 138.636 47.4389 118.595 35.7422C117.177 34.9145 115.589 34.5005 114.002 34.5V45.5402C134.622 57.4382 156.808 65.197 181.255 67.6897C183.458 101.819 184.875 127.581 177.02 149.071C169.535 169.547 152.867 187.663 114.002 203.546V214.5Z" + fill="#DB8300" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M114.002 214.5C115.089 214.5 116.176 214.297 117.178 213.892C199.369 180.652 196.359 134.145 191.959 66.1631L191.908 65.3684C191.623 60.9693 188.068 57.5045 183.679 57.0951C160.054 54.8915 138.636 47.4389 118.595 35.7422C117.177 34.9145 115.589 34.5005 114.002 34.5V45.5402C134.622 57.4382 156.808 65.197 181.255 67.6897C183.458 101.819 184.875 127.581 177.02 149.071C169.535 169.547 152.867 187.663 114.002 203.546V214.5Z" + fill="url(#paint2_linear_4378_69559)" fill-opacity="0.75" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M79.9999 92.0462C79.9999 87.8785 83.3785 84.5 87.5461 84.5C91.7138 84.5 95.0923 87.8785 95.0923 92.0462V144.916C95.0923 146.081 94.1479 147.026 92.9829 147.026H82.1093C80.9443 147.026 79.9999 146.081 79.9999 144.916V92.0462ZM106.95 119.001C106.95 114.834 110.329 111.455 114.497 111.455C118.664 111.455 122.043 114.834 122.043 119.001V144.921C122.043 146.086 121.098 147.03 119.933 147.03H109.06C107.895 147.03 106.95 146.086 106.95 144.921V119.001ZM141.452 100.672C137.284 100.672 133.906 104.051 133.906 108.218V144.918C133.906 146.083 134.85 147.027 136.015 147.027H146.889C148.054 147.027 148.998 146.083 148.998 144.918V108.218C148.998 104.051 145.62 100.672 141.452 100.672Z" + fill="#FFC600" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M79.9999 92.0462C79.9999 87.8785 83.3785 84.5 87.5461 84.5C91.7138 84.5 95.0923 87.8785 95.0923 92.0462V144.916C95.0923 146.081 94.1479 147.026 92.9829 147.026H82.1093C80.9443 147.026 79.9999 146.081 79.9999 144.916V92.0462ZM106.95 119.001C106.95 114.834 110.329 111.455 114.497 111.455C118.664 111.455 122.043 114.834 122.043 119.001V144.921C122.043 146.086 121.098 147.03 119.933 147.03H109.06C107.895 147.03 106.95 146.086 106.95 144.921V119.001ZM141.452 100.672C137.284 100.672 133.906 104.051 133.906 108.218V144.918C133.906 146.083 134.85 147.027 136.015 147.027H146.889C148.054 147.027 148.998 146.083 148.998 144.918V108.218C148.998 104.051 145.62 100.672 141.452 100.672Z" + fill="url(#paint3_linear_4378_69559)" /> + <defs> + <filter id="filter0_d_4378_69559" x="-9.15527e-05" y="0.5" width="228" height="248" filterUnits="userSpaceOnUse" + color-interpolation-filters="sRGB"> + <feFlood flood-opacity="0" result="BackgroundImageFix" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset /> + <feGaussianBlur stdDeviation="17.5" /> + <feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.776471 0 0 0 0 0 0 0 0 0.5 0" /> + <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4378_69559" /> + <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4378_69559" result="shape" /> + </filter> + <radialGradient id="paint0_radial_4378_69559" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(73.9661 56.9075) rotate(72.5541) scale(133.533 139.851)"> + <stop stop-color="#2B2D37" /> + <stop offset="1" stop-color="#15161B" /> + </radialGradient> + <linearGradient id="paint1_linear_4378_69559" x1="110.766" y1="208.686" x2="53.0926" y2="55.609" + gradientUnits="userSpaceOnUse"> + <stop stop-color="#CB6E00" /> + <stop offset="1" stop-color="#FFC600" stop-opacity="0" /> + </linearGradient> + <linearGradient id="paint2_linear_4378_69559" x1="163.588" y1="209.225" x2="113.998" y2="44.2909" + gradientUnits="userSpaceOnUse"> + <stop stop-color="#793A00" /> + <stop offset="1" stop-color="#DB8300" stop-opacity="0" /> + </linearGradient> + <linearGradient id="paint3_linear_4378_69559" x1="148.998" y1="144.874" x2="83.234" y2="84.5002" + gradientUnits="userSpaceOnUse"> + <stop stop-color="#DB8300" /> + <stop offset="1" stop-color="#FFC600" /> + </linearGradient> + </defs> +</svg> \ No newline at end of file diff --git a/src/assets/icons/ico/offPeakHour.svg b/src/assets/icons/ico/offPeakHour.svg new file mode 100644 index 0000000000000000000000000000000000000000..6eaab48884b42a653e2bf0ec5e3219ec1c53240b --- /dev/null +++ b/src/assets/icons/ico/offPeakHour.svg @@ -0,0 +1,11 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="40" height="41" viewBox="0 0 40 41" fill="none"> + <path + d="M33.4768 9.34225L28.9552 5.58922C28.3386 5.07612 27.4137 5.14942 26.8852 5.77981C26.3714 6.39554 26.4595 7.31913 27.0761 7.8469L31.583 11.5999C32.1996 12.113 33.1245 12.0397 33.653 11.4093C34.1815 10.7936 34.0934 9.87002 33.4768 9.34225ZM8.40231 11.5999L12.9093 7.8469C13.5405 7.31913 13.6286 6.39554 13.1001 5.77981C12.5863 5.14942 11.6614 5.07612 11.0448 5.58922L6.52319 9.34225C5.90661 9.87002 5.81852 10.7936 6.34702 11.4093C6.86085 12.0397 7.78572 12.113 8.40231 11.5999ZM20 7.86156C12.7037 7.86156 6.78744 13.7696 6.78744 21.0558C6.78744 28.3419 12.7037 34.25 20 34.25C27.2963 34.25 33.2126 28.3419 33.2126 21.0558C33.2126 13.7696 27.2963 7.86156 20 7.86156ZM20 31.318C14.3333 31.318 9.72357 26.7146 9.72357 21.0558C9.72357 15.3969 14.3333 10.7936 20 10.7936C25.6667 10.7936 30.2764 15.3969 30.2764 21.0558C30.2764 26.7146 25.6667 31.318 20 31.318Z" + fill="#D87B39" /> + <path + d="M20 14.25C18.8063 14.25 17.6325 14.5552 16.59 15.1367C15.5476 15.7182 14.6711 16.5566 14.044 17.5723C13.4168 18.5879 13.0598 19.7471 13.0069 20.9396C12.954 22.1321 13.2068 23.3183 13.7415 24.3855C14.2762 25.4528 15.0749 26.3655 16.0618 27.0371C17.0486 27.7087 18.1908 28.1167 19.3798 28.2225C20.5688 28.3282 21.765 28.1282 22.8549 27.6414C23.9448 27.1545 24.8921 26.3971 25.6068 25.441L20 21.25V14.25Z" + fill="white" /> + <path + d="M21.009 21.5821L25.5227 24.3753C25.9915 24.6546 26.1388 25.2831 25.8575 25.7719C25.5897 26.2467 25.0003 26.3864 24.545 26.1071L19.6563 23.0485C19.2411 22.7971 19 22.3363 19 21.8475V15.2555C19 14.6969 19.4286 14.25 19.9643 14.25H20.0447C20.5804 14.25 21.009 14.6969 21.009 15.2555V21.5821Z" + fill="#D87B39" /> +</svg> \ No newline at end of file diff --git a/src/assets/icons/ico/prm.svg b/src/assets/icons/ico/prm.svg index 249dcf0b28e50c0e35c06ca74f6b71db78f989d2..284a3099253431268073bc5598de813c8413465b 100644 --- a/src/assets/icons/ico/prm.svg +++ b/src/assets/icons/ico/prm.svg @@ -1,106 +1,145 @@ -<svg width="205" height="134" viewBox="0 0 205 134" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g filter="url(#filter0_ii_115_37752)"> -<rect width="205" height="102" fill="#C8EA40"/> -<rect x="37" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="45" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="45" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 45 27)" fill="#696C55"/> -<rect x="45" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 45 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 43.5355 35.25)" fill="#696C55"/> -<rect x="37" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="45" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="49" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="57" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="57" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 57 27)" fill="#696C55"/> -<rect x="57" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 57 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 55.5355 35.25)" fill="#696C55"/> -<rect x="49" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="57" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="61" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="69" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="69" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 69 27)" fill="#696C55"/> -<rect x="69" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 69 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 67.5355 35.25)" fill="#696C55"/> -<rect x="61" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="69" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="73" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="81" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="81" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 81 27)" fill="#696C55"/> -<rect x="81" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 81 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 79.5355 35.25)" fill="#696C55"/> -<rect x="73" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="81" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="85" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="93" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="93" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 93 27)" fill="#696C55"/> -<rect x="93" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 93 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 91.5355 35.25)" fill="#696C55"/> -<rect x="85" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="93" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="97" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="105" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="105" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 105 27)" fill="#696C55"/> -<rect x="105" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 105 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 103.536 35.25)" fill="#696C55"/> -<rect x="97" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="105" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="109" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="117" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="117" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 117 27)" fill="#696C55"/> -<rect x="117" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 117 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 115.536 35.25)" fill="#696C55"/> -<rect x="109" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="117" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="121" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="129" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="129" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 129 27)" fill="#696C55"/> -<rect x="129" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 129 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 127.536 35.25)" fill="#696C55"/> -<rect x="121" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="129" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="133" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="141" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="141" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 141 27)" fill="#696C55"/> -<rect x="141" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 141 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 139.536 35.25)" fill="#696C55"/> -<rect x="133" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="141" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="145" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="153" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="153" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 153 27)" fill="#696C55"/> -<rect x="153" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 153 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 151.536 35.25)" fill="#696C55"/> -<rect x="145" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="153" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="157" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="165" y="29.75" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="165" y="27" width="1.83333" height="6" rx="0.916667" transform="rotate(90 165 27)" fill="#696C55"/> -<rect x="165" y="47.167" width="1.83333" height="6" rx="0.916667" transform="rotate(90 165 47.167)" fill="#696C55"/> -<rect width="1.91848" height="5.75543" rx="0.959239" transform="matrix(0.737154 0.675725 -0.737154 0.675725 163.536 35.25)" fill="#696C55"/> -<rect x="157" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<rect x="165" y="38.917" width="2" height="7.33333" rx="1" fill="#696C55"/> -<path d="M43.1207 69C43.0107 69 42.9257 68.97 42.8657 68.91C42.8057 68.84 42.7757 68.755 42.7757 68.655V58.86C42.7757 58.75 42.8057 58.665 42.8657 58.605C42.9257 58.535 43.0107 58.5 43.1207 58.5H43.8107C43.9307 58.5 44.0207 58.53 44.0807 58.59C44.1407 58.64 44.1757 58.68 44.1857 58.71L49.1657 66.36V58.86C49.1657 58.75 49.1957 58.665 49.2557 58.605C49.3157 58.535 49.4007 58.5 49.5107 58.5H50.2307C50.3407 58.5 50.4257 58.535 50.4857 58.605C50.5557 58.665 50.5907 58.75 50.5907 58.86V68.64C50.5907 68.74 50.5557 68.825 50.4857 68.895C50.4257 68.965 50.3457 69 50.2457 69H49.5257C49.4157 69 49.3307 68.97 49.2707 68.91C49.2207 68.85 49.1857 68.81 49.1657 68.79L44.2007 61.215V68.655C44.2007 68.755 44.1657 68.84 44.0957 68.91C44.0357 68.97 43.9507 69 43.8407 69H43.1207ZM57.1507 69.15C56.3107 69.15 55.5857 69 54.9757 68.7C54.3757 68.4 53.9107 67.945 53.5807 67.335C53.2607 66.715 53.1007 65.92 53.1007 64.95V58.86C53.1007 58.75 53.1307 58.665 53.1907 58.605C53.2507 58.535 53.3357 58.5 53.4457 58.5H54.2107C54.3207 58.5 54.4057 58.535 54.4657 58.605C54.5357 58.665 54.5707 58.75 54.5707 58.86V64.98C54.5707 65.96 54.8007 66.685 55.2607 67.155C55.7207 67.625 56.3507 67.86 57.1507 67.86C57.9407 67.86 58.5657 67.625 59.0257 67.155C59.4957 66.685 59.7307 65.96 59.7307 64.98V58.86C59.7307 58.75 59.7607 58.665 59.8207 58.605C59.8907 58.535 59.9757 58.5 60.0757 58.5H60.8557C60.9557 58.5 61.0357 58.535 61.0957 58.605C61.1657 58.665 61.2007 58.75 61.2007 58.86V64.95C61.2007 65.92 61.0357 66.715 60.7057 67.335C60.3857 67.945 59.9257 68.4 59.3257 68.7C58.7257 69 58.0007 69.15 57.1507 69.15ZM64.0533 69C63.9533 69 63.8683 68.97 63.7983 68.91C63.7383 68.84 63.7083 68.755 63.7083 68.655V58.86C63.7083 58.75 63.7383 58.665 63.7983 58.605C63.8683 58.535 63.9533 58.5 64.0533 58.5H64.8033C64.9233 58.5 65.0133 58.53 65.0733 58.59C65.1333 58.65 65.1683 58.7 65.1783 58.74L68.3583 64.8L71.5533 58.74C71.5733 58.7 71.6083 58.65 71.6583 58.59C71.7183 58.53 71.8083 58.5 71.9283 58.5H72.6633C72.7733 58.5 72.8583 58.535 72.9183 58.605C72.9883 58.665 73.0233 58.75 73.0233 58.86V68.655C73.0233 68.755 72.9883 68.84 72.9183 68.91C72.8583 68.97 72.7733 69 72.6633 69H71.9283C71.8283 69 71.7433 68.97 71.6733 68.91C71.6133 68.84 71.5833 68.755 71.5833 68.655V61.275L69.0783 66.165C69.0383 66.265 68.9783 66.345 68.8983 66.405C68.8183 66.455 68.7183 66.48 68.5983 66.48H68.1333C68.0033 66.48 67.8983 66.455 67.8183 66.405C67.7483 66.345 67.6883 66.265 67.6383 66.165L65.1333 61.275V68.655C65.1333 68.755 65.0983 68.84 65.0283 68.91C64.9683 68.97 64.8883 69 64.7883 69H64.0533ZM75.9625 69C75.8525 69 75.7675 68.97 75.7075 68.91C75.6475 68.84 75.6175 68.755 75.6175 68.655V58.86C75.6175 58.75 75.6475 58.665 75.7075 58.605C75.7675 58.535 75.8525 58.5 75.9625 58.5H82.1575C82.2675 58.5 82.3525 58.535 82.4125 58.605C82.4725 58.665 82.5025 58.75 82.5025 58.86V59.43C82.5025 59.54 82.4725 59.625 82.4125 59.685C82.3525 59.745 82.2675 59.775 82.1575 59.775H77.0575V63.06H81.8275C81.9375 63.06 82.0225 63.095 82.0825 63.165C82.1425 63.225 82.1725 63.31 82.1725 63.42V63.975C82.1725 64.075 82.1425 64.16 82.0825 64.23C82.0225 64.29 81.9375 64.32 81.8275 64.32H77.0575V67.725H82.2775C82.3875 67.725 82.4725 67.755 82.5325 67.815C82.5925 67.875 82.6225 67.96 82.6225 68.07V68.655C82.6225 68.755 82.5925 68.84 82.5325 68.91C82.4725 68.97 82.3875 69 82.2775 69H75.9625ZM78.4525 57.75C78.2925 57.75 78.2125 57.67 78.2125 57.51C78.2125 57.43 78.2375 57.365 78.2875 57.315L79.4125 55.965C79.5025 55.855 79.5825 55.785 79.6525 55.755C79.7225 55.715 79.8275 55.695 79.9675 55.695H81.0775C81.2675 55.695 81.3625 55.79 81.3625 55.98C81.3625 56.05 81.3375 56.11 81.2875 56.16L79.5475 57.585C79.4675 57.655 79.3925 57.7 79.3225 57.72C79.2525 57.74 79.1625 57.75 79.0525 57.75H78.4525ZM85.0592 69C84.9492 69 84.8642 68.97 84.8042 68.91C84.7442 68.84 84.7142 68.755 84.7142 68.655V58.86C84.7142 58.75 84.7442 58.665 84.8042 58.605C84.8642 58.535 84.9492 58.5 85.0592 58.5H88.7192C89.8492 58.5 90.7442 58.765 91.4042 59.295C92.0642 59.825 92.3942 60.61 92.3942 61.65C92.3942 62.42 92.1992 63.05 91.8092 63.54C91.4292 64.02 90.9092 64.355 90.2492 64.545L92.5592 68.535C92.5892 68.595 92.6042 68.65 92.6042 68.7C92.6042 68.78 92.5692 68.85 92.4992 68.91C92.4392 68.97 92.3692 69 92.2892 69H91.5692C91.3992 69 91.2742 68.955 91.1942 68.865C91.1142 68.775 91.0442 68.685 90.9842 68.595L88.8092 64.785H86.1842V68.655C86.1842 68.755 86.1492 68.84 86.0792 68.91C86.0192 68.97 85.9342 69 85.8242 69H85.0592ZM86.1842 63.51H88.6592C89.4092 63.51 89.9692 63.355 90.3392 63.045C90.7092 62.725 90.8942 62.255 90.8942 61.635C90.8942 61.025 90.7092 60.56 90.3392 60.24C89.9792 59.92 89.4192 59.76 88.6592 59.76H86.1842V63.51ZM98.2936 69.15C97.4436 69.15 96.7136 69.005 96.1036 68.715C95.4936 68.415 95.0236 67.96 94.6936 67.35C94.3636 66.73 94.1786 65.955 94.1386 65.025C94.1286 64.585 94.1236 64.165 94.1236 63.765C94.1236 63.355 94.1286 62.93 94.1386 62.49C94.1786 61.57 94.3686 60.805 94.7086 60.195C95.0586 59.575 95.5386 59.115 96.1486 58.815C96.7686 58.505 97.4836 58.35 98.2936 58.35C99.1136 58.35 99.8286 58.505 100.439 58.815C101.059 59.115 101.544 59.575 101.894 60.195C102.244 60.805 102.434 61.57 102.464 62.49C102.484 62.93 102.494 63.355 102.494 63.765C102.494 64.165 102.484 64.585 102.464 65.025C102.434 65.955 102.249 66.73 101.909 67.35C101.579 67.96 101.109 68.415 100.499 68.715C99.8886 69.005 99.1536 69.15 98.2936 69.15ZM98.2936 67.875C99.0636 67.875 99.6886 67.645 100.169 67.185C100.659 66.725 100.924 65.98 100.964 64.95C100.984 64.5 100.994 64.1 100.994 63.75C100.994 63.39 100.984 62.99 100.964 62.55C100.944 61.86 100.814 61.3 100.574 60.87C100.344 60.44 100.034 60.125 99.6436 59.925C99.2536 59.725 98.8036 59.625 98.2936 59.625C97.8036 59.625 97.3636 59.725 96.9736 59.925C96.5836 60.125 96.2686 60.44 96.0286 60.87C95.7986 61.3 95.6686 61.86 95.6386 62.55C95.6286 62.99 95.6236 63.39 95.6236 63.75C95.6236 64.1 95.6286 64.5 95.6386 64.95C95.6786 65.98 95.9436 66.725 96.4336 67.185C96.9236 67.645 97.5436 67.875 98.2936 67.875ZM108.702 69C108.592 69 108.507 68.97 108.447 68.91C108.387 68.84 108.357 68.755 108.357 68.655V58.86C108.357 58.75 108.387 58.665 108.447 58.605C108.507 58.535 108.592 58.5 108.702 58.5H112.107C113.137 58.5 113.967 58.655 114.597 58.965C115.227 59.275 115.687 59.735 115.977 60.345C116.267 60.945 116.417 61.685 116.427 62.565C116.437 63.015 116.442 63.41 116.442 63.75C116.442 64.09 116.437 64.48 116.427 64.92C116.407 65.84 116.252 66.605 115.962 67.215C115.682 67.815 115.232 68.265 114.612 68.565C114.002 68.855 113.192 69 112.182 69H108.702ZM109.827 67.725H112.107C112.797 67.725 113.347 67.63 113.757 67.44C114.167 67.25 114.462 66.945 114.642 66.525C114.832 66.105 114.932 65.55 114.942 64.86C114.962 64.56 114.972 64.3 114.972 64.08C114.972 63.85 114.972 63.625 114.972 63.405C114.972 63.175 114.962 62.915 114.942 62.625C114.922 61.655 114.692 60.94 114.252 60.48C113.812 60.01 113.072 59.775 112.032 59.775H109.827V67.725ZM119.044 69C118.934 69 118.849 68.97 118.789 68.91C118.729 68.84 118.699 68.755 118.699 68.655V58.86C118.699 58.75 118.729 58.665 118.789 58.605C118.849 58.535 118.934 58.5 119.044 58.5H125.239C125.349 58.5 125.434 58.535 125.494 58.605C125.554 58.665 125.584 58.75 125.584 58.86V59.43C125.584 59.54 125.554 59.625 125.494 59.685C125.434 59.745 125.349 59.775 125.239 59.775H120.139V63.06H124.909C125.019 63.06 125.104 63.095 125.164 63.165C125.224 63.225 125.254 63.31 125.254 63.42V63.975C125.254 64.075 125.224 64.16 125.164 64.23C125.104 64.29 125.019 64.32 124.909 64.32H120.139V67.725H125.359C125.469 67.725 125.554 67.755 125.614 67.815C125.674 67.875 125.704 67.96 125.704 68.07V68.655C125.704 68.755 125.674 68.84 125.614 68.91C125.554 68.97 125.469 69 125.359 69H119.044ZM131.817 69C131.707 69 131.622 68.97 131.562 68.91C131.502 68.84 131.472 68.755 131.472 68.655V58.86C131.472 58.75 131.502 58.665 131.562 58.605C131.622 58.535 131.707 58.5 131.817 58.5H135.627C136.367 58.5 137.007 58.62 137.547 58.86C138.097 59.1 138.522 59.46 138.822 59.94C139.122 60.41 139.272 61 139.272 61.71C139.272 62.42 139.122 63.01 138.822 63.48C138.522 63.95 138.097 64.305 137.547 64.545C137.007 64.785 136.367 64.905 135.627 64.905H132.972V68.655C132.972 68.755 132.937 68.84 132.867 68.91C132.807 68.97 132.722 69 132.612 69H131.817ZM132.957 63.645H135.552C136.292 63.645 136.847 63.48 137.217 63.15C137.587 62.82 137.772 62.34 137.772 61.71C137.772 61.09 137.592 60.61 137.232 60.27C136.872 59.93 136.312 59.76 135.552 59.76H132.957V63.645ZM141.441 69C141.331 69 141.246 68.97 141.186 68.91C141.126 68.84 141.096 68.755 141.096 68.655V58.86C141.096 58.75 141.126 58.665 141.186 58.605C141.246 58.535 141.331 58.5 141.441 58.5H145.101C146.231 58.5 147.126 58.765 147.786 59.295C148.446 59.825 148.776 60.61 148.776 61.65C148.776 62.42 148.581 63.05 148.191 63.54C147.811 64.02 147.291 64.355 146.631 64.545L148.941 68.535C148.971 68.595 148.986 68.65 148.986 68.7C148.986 68.78 148.951 68.85 148.881 68.91C148.821 68.97 148.751 69 148.671 69H147.951C147.781 69 147.656 68.955 147.576 68.865C147.496 68.775 147.426 68.685 147.366 68.595L145.191 64.785H142.566V68.655C142.566 68.755 142.531 68.84 142.461 68.91C142.401 68.97 142.316 69 142.206 69H141.441ZM142.566 63.51H145.041C145.791 63.51 146.351 63.355 146.721 63.045C147.091 62.725 147.276 62.255 147.276 61.635C147.276 61.025 147.091 60.56 146.721 60.24C146.361 59.92 145.801 59.76 145.041 59.76H142.566V63.51ZM151.27 69C151.17 69 151.085 68.97 151.015 68.91C150.955 68.84 150.925 68.755 150.925 68.655V58.86C150.925 58.75 150.955 58.665 151.015 58.605C151.085 58.535 151.17 58.5 151.27 58.5H152.02C152.14 58.5 152.23 58.53 152.29 58.59C152.35 58.65 152.385 58.7 152.395 58.74L155.575 64.8L158.77 58.74C158.79 58.7 158.825 58.65 158.875 58.59C158.935 58.53 159.025 58.5 159.145 58.5H159.88C159.99 58.5 160.075 58.535 160.135 58.605C160.205 58.665 160.24 58.75 160.24 58.86V68.655C160.24 68.755 160.205 68.84 160.135 68.91C160.075 68.97 159.99 69 159.88 69H159.145C159.045 69 158.96 68.97 158.89 68.91C158.83 68.84 158.8 68.755 158.8 68.655V61.275L156.295 66.165C156.255 66.265 156.195 66.345 156.115 66.405C156.035 66.455 155.935 66.48 155.815 66.48H155.35C155.22 66.48 155.115 66.455 155.035 66.405C154.965 66.345 154.905 66.265 154.855 66.165L152.35 61.275V68.655C152.35 68.755 152.315 68.84 152.245 68.91C152.185 68.97 152.105 69 152.005 69H151.27Z" fill="#696C55"/> -</g> -<rect width="93" height="29" transform="translate(0 104.5)" fill="#DADADA"/> -<rect x="39.5" y="116.5" width="14" height="5" fill="#8A8A8A"/> -<rect x="95" y="104" width="15" height="30" fill="#DADADA"/> -<rect width="93" height="30" transform="translate(112 104)" fill="#DADADA"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M161 116.5V112H156V116.5H151.5V121.5H156V126H161V121.5H165.5V116.5H161Z" fill="#8A8A8A"/> -<defs> -<filter id="filter0_ii_115_37752" x="-4" y="-1" width="210" height="107" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> -<feOffset dx="-4" dy="4"/> -<feGaussianBlur stdDeviation="3"/> -<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/> -<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.35 0"/> -<feBlend mode="normal" in2="shape" result="effect1_innerShadow_115_37752"/> -<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> -<feOffset dx="1" dy="-1"/> -<feGaussianBlur stdDeviation="2"/> -<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/> -<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"/> -<feBlend mode="normal" in2="effect1_innerShadow_115_37752" result="effect2_innerShadow_115_37752"/> -</filter> -</defs> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" width="306" height="156" viewBox="0 0 306 156" fill="none"> + <g filter="url(#filter0_ii_4116_50996)"> + <rect width="274" height="102" transform="translate(16)" fill="#C8EA40" /> + <rect x="70" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="78" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="78" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 78 27.5)" fill="#696C55" /> + <rect x="78" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 78 47.667)" fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 76.5355 35.75)" fill="#696C55" /> + <rect x="70" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="78" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="82" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="90" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="90" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 90 27.5)" fill="#696C55" /> + <rect x="90" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 90 47.667)" fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 88.5355 35.75)" fill="#696C55" /> + <rect x="82" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="90" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="94" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="102" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="102" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 102 27.5)" fill="#696C55" /> + <rect x="102" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 102 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 100.536 35.75)" fill="#696C55" /> + <rect x="94" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="102" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="106" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="114" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="114" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 114 27.5)" fill="#696C55" /> + <rect x="114" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 114 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 112.536 35.75)" fill="#696C55" /> + <rect x="106" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="114" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="118" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="126" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="126" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 126 27.5)" fill="#696C55" /> + <rect x="126" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 126 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 124.536 35.75)" fill="#696C55" /> + <rect x="118" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="126" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="130" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="138" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="138" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 138 27.5)" fill="#696C55" /> + <rect x="138" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 138 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 136.536 35.75)" fill="#696C55" /> + <rect x="130" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="138" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="142" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="150" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="150" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 150 27.5)" fill="#696C55" /> + <rect x="150" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 150 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 148.536 35.75)" fill="#696C55" /> + <rect x="142" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="150" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="154" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="162" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="162" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 162 27.5)" fill="#696C55" /> + <rect x="162" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 162 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 160.536 35.75)" fill="#696C55" /> + <rect x="154" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="162" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="166" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="174" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="174" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 174 27.5)" fill="#696C55" /> + <rect x="174" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 174 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 172.536 35.75)" fill="#696C55" /> + <rect x="166" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="174" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="178" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="186" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="186" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 186 27.5)" fill="#696C55" /> + <rect x="186" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 186 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 184.536 35.75)" fill="#696C55" /> + <rect x="178" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="186" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="190" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="198" y="30.25" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="198" y="27.5" width="1.83333" height="6" rx="0.916667" transform="rotate(90 198 27.5)" fill="#696C55" /> + <rect x="198" y="47.667" width="1.83333" height="6" rx="0.916667" transform="rotate(90 198 47.667)" + fill="#696C55" /> + <rect width="1.91848" height="5.75543" rx="0.959239" + transform="matrix(0.737154 0.675725 -0.737154 0.675725 196.536 35.75)" fill="#696C55" /> + <rect x="190" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <rect x="198" y="39.417" width="2" height="7.33333" rx="1" fill="#696C55" /> + <path + d="M76.1207 69.5C76.0107 69.5 75.9257 69.47 75.8657 69.41C75.8057 69.34 75.7757 69.255 75.7757 69.155V59.36C75.7757 59.25 75.8057 59.165 75.8657 59.105C75.9257 59.035 76.0107 59 76.1207 59H76.8107C76.9307 59 77.0207 59.03 77.0807 59.09C77.1407 59.14 77.1757 59.18 77.1857 59.21L82.1657 66.86V59.36C82.1657 59.25 82.1957 59.165 82.2557 59.105C82.3157 59.035 82.4007 59 82.5107 59H83.2307C83.3407 59 83.4257 59.035 83.4857 59.105C83.5557 59.165 83.5907 59.25 83.5907 59.36V69.14C83.5907 69.24 83.5557 69.325 83.4857 69.395C83.4257 69.465 83.3457 69.5 83.2457 69.5H82.5257C82.4157 69.5 82.3307 69.47 82.2707 69.41C82.2207 69.35 82.1857 69.31 82.1657 69.29L77.2007 61.715V69.155C77.2007 69.255 77.1657 69.34 77.0957 69.41C77.0357 69.47 76.9507 69.5 76.8407 69.5H76.1207ZM90.1507 69.65C89.3107 69.65 88.5857 69.5 87.9757 69.2C87.3757 68.9 86.9107 68.445 86.5807 67.835C86.2607 67.215 86.1007 66.42 86.1007 65.45V59.36C86.1007 59.25 86.1307 59.165 86.1907 59.105C86.2507 59.035 86.3357 59 86.4457 59H87.2107C87.3207 59 87.4057 59.035 87.4657 59.105C87.5357 59.165 87.5707 59.25 87.5707 59.36V65.48C87.5707 66.46 87.8007 67.185 88.2607 67.655C88.7207 68.125 89.3507 68.36 90.1507 68.36C90.9407 68.36 91.5657 68.125 92.0257 67.655C92.4957 67.185 92.7307 66.46 92.7307 65.48V59.36C92.7307 59.25 92.7607 59.165 92.8207 59.105C92.8907 59.035 92.9757 59 93.0757 59H93.8557C93.9557 59 94.0357 59.035 94.0957 59.105C94.1657 59.165 94.2007 59.25 94.2007 59.36V65.45C94.2007 66.42 94.0357 67.215 93.7057 67.835C93.3857 68.445 92.9257 68.9 92.3257 69.2C91.7257 69.5 91.0007 69.65 90.1507 69.65ZM97.0533 69.5C96.9533 69.5 96.8683 69.47 96.7983 69.41C96.7383 69.34 96.7083 69.255 96.7083 69.155V59.36C96.7083 59.25 96.7383 59.165 96.7983 59.105C96.8683 59.035 96.9533 59 97.0533 59H97.8033C97.9233 59 98.0133 59.03 98.0733 59.09C98.1333 59.15 98.1683 59.2 98.1783 59.24L101.358 65.3L104.553 59.24C104.573 59.2 104.608 59.15 104.658 59.09C104.718 59.03 104.808 59 104.928 59H105.663C105.773 59 105.858 59.035 105.918 59.105C105.988 59.165 106.023 59.25 106.023 59.36V69.155C106.023 69.255 105.988 69.34 105.918 69.41C105.858 69.47 105.773 69.5 105.663 69.5H104.928C104.828 69.5 104.743 69.47 104.673 69.41C104.613 69.34 104.583 69.255 104.583 69.155V61.775L102.078 66.665C102.038 66.765 101.978 66.845 101.898 66.905C101.818 66.955 101.718 66.98 101.598 66.98H101.133C101.003 66.98 100.898 66.955 100.818 66.905C100.748 66.845 100.688 66.765 100.638 66.665L98.1333 61.775V69.155C98.1333 69.255 98.0983 69.34 98.0283 69.41C97.9683 69.47 97.8883 69.5 97.7883 69.5H97.0533ZM108.963 69.5C108.853 69.5 108.768 69.47 108.708 69.41C108.648 69.34 108.618 69.255 108.618 69.155V59.36C108.618 59.25 108.648 59.165 108.708 59.105C108.768 59.035 108.853 59 108.963 59H115.158C115.268 59 115.353 59.035 115.413 59.105C115.473 59.165 115.503 59.25 115.503 59.36V59.93C115.503 60.04 115.473 60.125 115.413 60.185C115.353 60.245 115.268 60.275 115.158 60.275H110.058V63.56H114.828C114.938 63.56 115.023 63.595 115.083 63.665C115.143 63.725 115.173 63.81 115.173 63.92V64.475C115.173 64.575 115.143 64.66 115.083 64.73C115.023 64.79 114.938 64.82 114.828 64.82H110.058V68.225H115.278C115.388 68.225 115.473 68.255 115.533 68.315C115.593 68.375 115.623 68.46 115.623 68.57V69.155C115.623 69.255 115.593 69.34 115.533 69.41C115.473 69.47 115.388 69.5 115.278 69.5H108.963ZM111.453 58.25C111.293 58.25 111.213 58.17 111.213 58.01C111.213 57.93 111.238 57.865 111.288 57.815L112.413 56.465C112.503 56.355 112.583 56.285 112.653 56.255C112.723 56.215 112.828 56.195 112.968 56.195H114.078C114.268 56.195 114.363 56.29 114.363 56.48C114.363 56.55 114.338 56.61 114.288 56.66L112.548 58.085C112.468 58.155 112.393 58.2 112.323 58.22C112.253 58.24 112.163 58.25 112.053 58.25H111.453ZM118.059 69.5C117.949 69.5 117.864 69.47 117.804 69.41C117.744 69.34 117.714 69.255 117.714 69.155V59.36C117.714 59.25 117.744 59.165 117.804 59.105C117.864 59.035 117.949 59 118.059 59H121.719C122.849 59 123.744 59.265 124.404 59.795C125.064 60.325 125.394 61.11 125.394 62.15C125.394 62.92 125.199 63.55 124.809 64.04C124.429 64.52 123.909 64.855 123.249 65.045L125.559 69.035C125.589 69.095 125.604 69.15 125.604 69.2C125.604 69.28 125.569 69.35 125.499 69.41C125.439 69.47 125.369 69.5 125.289 69.5H124.569C124.399 69.5 124.274 69.455 124.194 69.365C124.114 69.275 124.044 69.185 123.984 69.095L121.809 65.285H119.184V69.155C119.184 69.255 119.149 69.34 119.079 69.41C119.019 69.47 118.934 69.5 118.824 69.5H118.059ZM119.184 64.01H121.659C122.409 64.01 122.969 63.855 123.339 63.545C123.709 63.225 123.894 62.755 123.894 62.135C123.894 61.525 123.709 61.06 123.339 60.74C122.979 60.42 122.419 60.26 121.659 60.26H119.184V64.01ZM131.294 69.65C130.444 69.65 129.714 69.505 129.104 69.215C128.494 68.915 128.024 68.46 127.694 67.85C127.364 67.23 127.179 66.455 127.139 65.525C127.129 65.085 127.124 64.665 127.124 64.265C127.124 63.855 127.129 63.43 127.139 62.99C127.179 62.07 127.369 61.305 127.709 60.695C128.059 60.075 128.539 59.615 129.149 59.315C129.769 59.005 130.484 58.85 131.294 58.85C132.114 58.85 132.829 59.005 133.439 59.315C134.059 59.615 134.544 60.075 134.894 60.695C135.244 61.305 135.434 62.07 135.464 62.99C135.484 63.43 135.494 63.855 135.494 64.265C135.494 64.665 135.484 65.085 135.464 65.525C135.434 66.455 135.249 67.23 134.909 67.85C134.579 68.46 134.109 68.915 133.499 69.215C132.889 69.505 132.154 69.65 131.294 69.65ZM131.294 68.375C132.064 68.375 132.689 68.145 133.169 67.685C133.659 67.225 133.924 66.48 133.964 65.45C133.984 65 133.994 64.6 133.994 64.25C133.994 63.89 133.984 63.49 133.964 63.05C133.944 62.36 133.814 61.8 133.574 61.37C133.344 60.94 133.034 60.625 132.644 60.425C132.254 60.225 131.804 60.125 131.294 60.125C130.804 60.125 130.364 60.225 129.974 60.425C129.584 60.625 129.269 60.94 129.029 61.37C128.799 61.8 128.669 62.36 128.639 63.05C128.629 63.49 128.624 63.89 128.624 64.25C128.624 64.6 128.629 65 128.639 65.45C128.679 66.48 128.944 67.225 129.434 67.685C129.924 68.145 130.544 68.375 131.294 68.375ZM141.702 69.5C141.592 69.5 141.507 69.47 141.447 69.41C141.387 69.34 141.357 69.255 141.357 69.155V59.36C141.357 59.25 141.387 59.165 141.447 59.105C141.507 59.035 141.592 59 141.702 59H145.107C146.137 59 146.967 59.155 147.597 59.465C148.227 59.775 148.687 60.235 148.977 60.845C149.267 61.445 149.417 62.185 149.427 63.065C149.437 63.515 149.442 63.91 149.442 64.25C149.442 64.59 149.437 64.98 149.427 65.42C149.407 66.34 149.252 67.105 148.962 67.715C148.682 68.315 148.232 68.765 147.612 69.065C147.002 69.355 146.192 69.5 145.182 69.5H141.702ZM142.827 68.225H145.107C145.797 68.225 146.347 68.13 146.757 67.94C147.167 67.75 147.462 67.445 147.642 67.025C147.832 66.605 147.932 66.05 147.942 65.36C147.962 65.06 147.972 64.8 147.972 64.58C147.972 64.35 147.972 64.125 147.972 63.905C147.972 63.675 147.962 63.415 147.942 63.125C147.922 62.155 147.692 61.44 147.252 60.98C146.812 60.51 146.072 60.275 145.032 60.275H142.827V68.225ZM152.044 69.5C151.934 69.5 151.849 69.47 151.789 69.41C151.729 69.34 151.699 69.255 151.699 69.155V59.36C151.699 59.25 151.729 59.165 151.789 59.105C151.849 59.035 151.934 59 152.044 59H158.239C158.349 59 158.434 59.035 158.494 59.105C158.554 59.165 158.584 59.25 158.584 59.36V59.93C158.584 60.04 158.554 60.125 158.494 60.185C158.434 60.245 158.349 60.275 158.239 60.275H153.139V63.56H157.909C158.019 63.56 158.104 63.595 158.164 63.665C158.224 63.725 158.254 63.81 158.254 63.92V64.475C158.254 64.575 158.224 64.66 158.164 64.73C158.104 64.79 158.019 64.82 157.909 64.82H153.139V68.225H158.359C158.469 68.225 158.554 68.255 158.614 68.315C158.674 68.375 158.704 68.46 158.704 68.57V69.155C158.704 69.255 158.674 69.34 158.614 69.41C158.554 69.47 158.469 69.5 158.359 69.5H152.044ZM164.817 69.5C164.707 69.5 164.622 69.47 164.562 69.41C164.502 69.34 164.472 69.255 164.472 69.155V59.36C164.472 59.25 164.502 59.165 164.562 59.105C164.622 59.035 164.707 59 164.817 59H168.627C169.367 59 170.007 59.12 170.547 59.36C171.097 59.6 171.522 59.96 171.822 60.44C172.122 60.91 172.272 61.5 172.272 62.21C172.272 62.92 172.122 63.51 171.822 63.98C171.522 64.45 171.097 64.805 170.547 65.045C170.007 65.285 169.367 65.405 168.627 65.405H165.972V69.155C165.972 69.255 165.937 69.34 165.867 69.41C165.807 69.47 165.722 69.5 165.612 69.5H164.817ZM165.957 64.145H168.552C169.292 64.145 169.847 63.98 170.217 63.65C170.587 63.32 170.772 62.84 170.772 62.21C170.772 61.59 170.592 61.11 170.232 60.77C169.872 60.43 169.312 60.26 168.552 60.26H165.957V64.145ZM174.441 69.5C174.331 69.5 174.246 69.47 174.186 69.41C174.126 69.34 174.096 69.255 174.096 69.155V59.36C174.096 59.25 174.126 59.165 174.186 59.105C174.246 59.035 174.331 59 174.441 59H178.101C179.231 59 180.126 59.265 180.786 59.795C181.446 60.325 181.776 61.11 181.776 62.15C181.776 62.92 181.581 63.55 181.191 64.04C180.811 64.52 180.291 64.855 179.631 65.045L181.941 69.035C181.971 69.095 181.986 69.15 181.986 69.2C181.986 69.28 181.951 69.35 181.881 69.41C181.821 69.47 181.751 69.5 181.671 69.5H180.951C180.781 69.5 180.656 69.455 180.576 69.365C180.496 69.275 180.426 69.185 180.366 69.095L178.191 65.285H175.566V69.155C175.566 69.255 175.531 69.34 175.461 69.41C175.401 69.47 175.316 69.5 175.206 69.5H174.441ZM175.566 64.01H178.041C178.791 64.01 179.351 63.855 179.721 63.545C180.091 63.225 180.276 62.755 180.276 62.135C180.276 61.525 180.091 61.06 179.721 60.74C179.361 60.42 178.801 60.26 178.041 60.26H175.566V64.01ZM184.27 69.5C184.17 69.5 184.085 69.47 184.015 69.41C183.955 69.34 183.925 69.255 183.925 69.155V59.36C183.925 59.25 183.955 59.165 184.015 59.105C184.085 59.035 184.17 59 184.27 59H185.02C185.14 59 185.23 59.03 185.29 59.09C185.35 59.15 185.385 59.2 185.395 59.24L188.575 65.3L191.77 59.24C191.79 59.2 191.825 59.15 191.875 59.09C191.935 59.03 192.025 59 192.145 59H192.88C192.99 59 193.075 59.035 193.135 59.105C193.205 59.165 193.24 59.25 193.24 59.36V69.155C193.24 69.255 193.205 69.34 193.135 69.41C193.075 69.47 192.99 69.5 192.88 69.5H192.145C192.045 69.5 191.96 69.47 191.89 69.41C191.83 69.34 191.8 69.255 191.8 69.155V61.775L189.295 66.665C189.255 66.765 189.195 66.845 189.115 66.905C189.035 66.955 188.935 66.98 188.815 66.98H188.35C188.22 66.98 188.115 66.955 188.035 66.905C187.965 66.845 187.905 66.765 187.855 66.665L185.35 61.775V69.155C185.35 69.255 185.315 69.34 185.245 69.41C185.185 69.47 185.105 69.5 185.005 69.5H184.27Z" + fill="#696C55" /> + </g> + <g filter="url(#filter1_d_4116_50996)"> + <rect x="16" y="106.5" width="125.5" height="29" rx="2" fill="#43444E" /> + <rect x="71.75" y="118.5" width="14" height="5" fill="#E0E0E0" /> + <rect x="145.5" y="106" width="15" height="30" rx="2" fill="#43444E" /> + <rect x="164.5" y="106" width="125.5" height="30" rx="2" fill="#43444E" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M229.75 118.5V114H224.75V118.5H220.25V123.5H224.75V128H229.75V123.5H234.25V118.5H229.75Z" fill="#E0E0E0" /> + </g> + <defs> + <filter id="filter0_ii_4116_50996" x="12" y="-1" width="279" height="107" filterUnits="userSpaceOnUse" + color-interpolation-filters="sRGB"> + <feFlood flood-opacity="0" result="BackgroundImageFix" /> + <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset dx="-4" dy="4" /> + <feGaussianBlur stdDeviation="3" /> + <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" /> + <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.35 0" /> + <feBlend mode="normal" in2="shape" result="effect1_innerShadow_4116_50996" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset dx="1" dy="-1" /> + <feGaussianBlur stdDeviation="2" /> + <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" /> + <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" /> + <feBlend mode="normal" in2="effect1_innerShadow_4116_50996" result="effect2_innerShadow_4116_50996" /> + </filter> + <filter id="filter1_d_4116_50996" x="0" y="94" width="306" height="62" filterUnits="userSpaceOnUse" + color-interpolation-filters="sRGB"> + <feFlood flood-opacity="0" result="BackgroundImageFix" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset dy="4" /> + <feGaussianBlur stdDeviation="8" /> + <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" /> + <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4116_50996" /> + <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_4116_50996" result="shape" /> + </filter> + </defs> +</svg> \ No newline at end of file diff --git a/src/assets/icons/ico/speaker.svg b/src/assets/icons/ico/speaker.svg deleted file mode 100644 index f9bdb824845c1b4d4089db53c4992e272c2614d2..0000000000000000000000000000000000000000 --- a/src/assets/icons/ico/speaker.svg +++ /dev/null @@ -1,60 +0,0 @@ -<svg width="101" height="100" viewBox="0 0 101 100" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M51.0755 77.0337L56.5751 80.331L66.2921 67.8887L65.3579 66.2706L61.7573 64.3939L51.0755 77.0337Z" fill="#1A1A1A"/> -<path d="M56.5756 80.3307L66.4066 67.463L69.3233 71.892L60.1456 84.0229L56.5756 80.3307Z" fill="#454545"/> -<path d="M56.1192 82.0323L51.0756 77.0333L56.5752 80.3307L60.1452 84.0229L56.1192 82.0323Z" fill="black"/> -<path d="M59.934 71.1999L64.0822 65.9283L64.5076 66.0423L63.3117 70.5053C63.2099 70.8851 62.8686 71.1515 62.4754 71.158L59.934 71.1999Z" fill="#976D1B"/> -<path d="M72.301 72.6903C69.0043 69.6792 62.326 63.6344 61.9857 63.5432L65.6168 63.6043L76.8745 67.5326L72.301 72.6903Z" fill="#454545"/> -<path d="M74.9144 69.7431C74.9144 69.7431 62.326 63.6344 61.9857 63.5432L65.6168 63.6043L76.8745 67.5326L74.9144 69.7431Z" fill="#1A1A1A"/> -<path d="M69.3228 71.8923L72.3006 72.6902L63.2615 63.8851L60.7091 63.2012L60.4811 64.052L64.8185 66.582L66.0232 68.0023L67.9021 73.7914L69.3228 71.8923Z" fill="#1A1A1A"/> -<path d="M57.7233 69.2404L59.9337 71.2005L64.0819 65.9288L61.3321 64.2801L57.7233 69.2404Z" fill="#E3B82A"/> -<path d="M72.167 72.6663L63.8336 64.333L60.5006 63.667V64.0003L63.8339 66.0003L72.167 72.6663Z" fill="black"/> -<path d="M68.4998 72.9999L69.1665 71.9993L66.1665 67.9999L68.4998 72.9999Z" fill="black"/> -<path d="M63.8173 49.9C59.5995 65.641 46.6575 75.8499 34.9105 72.7023C23.1636 69.5547 17.0599 54.2425 21.2777 38.5015C25.4955 22.7606 38.4375 12.5516 50.1845 15.6992C61.9315 18.8468 68.0351 34.159 63.8173 49.9Z" fill="#454545"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M21.7084 59.259L54.2531 53.2646L58.9294 60.9262C52.9472 70.0504 43.6024 75.0324 34.9116 72.7037C28.7054 71.0407 24.0743 65.9822 21.7084 59.259Z" fill="#606060"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M21.2387 47.1544L48.6391 50.3928L48.8612 52.7329L21.7397 55.4955L21.2387 47.1544Z" fill="#606060"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M46.4195 15.1413L60.7566 47.7126L60.2087 54.8607L29.2964 23.4115C34.1397 18.0462 40.2986 14.9336 46.4195 15.1413Z" fill="#313131"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M64.8063 34.9979L60.7574 47.7132L58.2146 40.1919L50.0264 15.6604C50.0792 15.674 50.132 15.6879 50.1847 15.702C58.0875 17.8196 63.4361 25.4426 64.8063 34.9979Z" fill="#313131"/> -<path d="M86.3184 45.8989L71.7715 40.6333C75.8732 45.7446 75.9107 50.7092 75.4168 52.5526C74.2737 59.5413 68.2549 63.3998 65.3883 64.4555L72.0807 66.7046L79.9353 69.7211L82.148 68.8044C91.447 64.9518 93.6628 52.7817 86.3184 45.8989Z" fill="#E3B82A"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M88.9415 62.7789L74.1628 57.2321L73.5531 57.5841C71.2217 61.4396 67.472 63.6882 65.3882 64.4557L72.0805 66.7048L79.9351 69.7213L82.1479 68.8046C85.2099 67.536 87.5039 65.3655 88.9415 62.7789Z" fill="#976D1B"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M87.5244 47.1748L72.7404 41.9434C73.3513 42.8453 73.8429 43.7344 74.2351 44.594L74.6878 45.0623L89.5605 50.4667C89.055 49.3084 88.3785 48.1994 87.5244 47.1748Z" fill="#FFD752"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M90.0479 51.7581L74.9399 46.412C75.0091 46.6276 75.0722 46.8402 75.1296 47.0496L90.2768 52.5537C90.2087 52.2869 90.1324 52.0216 90.0479 51.7581Z" fill="#FFD752"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M83.8446 67.9677L69.0581 62.418C67.6815 63.4251 66.3553 64.1005 65.388 64.4567L72.0804 66.7058L79.935 69.7223L82.1477 68.8056C82.7426 68.5591 83.3084 68.2787 83.8446 67.9677Z" fill="#5B450C"/> -<path opacity="0.5" d="M90.0872 60.0817C93.0713 50.3207 81.369 44.1074 71.7715 40.6333C75.8732 45.7446 75.9107 50.7092 75.4168 52.5526C74.2737 59.5413 68.2549 63.3998 65.3883 64.4555L72.0807 66.7046L79.9353 69.7211L82.148 68.8044C86.227 67.1145 88.9431 63.8242 90.0872 60.0817Z" fill="url(#paint0_linear_118_40903)"/> -<path d="M72.6224 40.8608C70.5436 39.5439 65.365 36.6365 64.6844 36.4542L62.8525 50.0974L56.6526 63.0262L65.3885 64.4551L65.6081 64.3848C75.5738 61.1976 79.2152 48.9855 72.6224 40.8608Z" fill="#7A7A7A"/> -<path d="M72.6224 40.8609C70.5436 39.544 65.3651 36.6366 64.6844 36.4542L64.5399 38.6952L75.1137 45.1759L74.3369 43.495C73.895 42.5391 73.3176 41.6519 72.6224 40.8609Z" fill="#9F9F9F"/> -<path d="M75.8731 50.8505C73.7943 49.5336 61.8094 44.8025 61.1288 44.6201L59.7833 54.7462L56.6528 63.0261L65.3887 64.455L66.7836 63.8951C72.1407 61.7449 75.7112 56.6208 75.8731 50.8505Z" fill="#444549"/> -<path d="M56.6529 63.0251L65.3888 64.454L65.8391 64.3017C69.414 63.0928 72.3918 60.5635 74.1632 57.2313L59.7834 54.7451L56.6529 63.0251Z" fill="#1A1A1A"/> -<path opacity="0.5" d="M63.8173 49.9C59.5995 65.641 46.6575 75.8499 34.9105 72.7023C23.1636 69.5547 17.0599 54.2425 21.2777 38.5015C25.4955 22.7606 38.4375 12.5516 50.1845 15.6992C61.9315 18.8468 68.0351 34.159 63.8173 49.9Z" fill="url(#paint1_linear_118_40903)"/> -<path d="M55.7186 61.4086L45.5479 50.0205L48.2835 39.811L62.6412 37.275L63.9315 49.4752L55.7186 61.4086Z" fill="#7A7A7A"/> -<path d="M56.3719 60.6718L46.2011 49.2838L46.6876 45.7666L60.976 53.6986L56.3719 60.6718Z" fill="#444549"/> -<path d="M62.2604 47.2037L47.4855 42.7888L47.9415 41.0872L63.2639 38.3538L62.2604 47.2037Z" fill="#9F9F9F"/> -<path d="M63.6277 42.0985L47.485 42.7884L49.1032 41.8541L64.0002 39.0067L63.6277 42.0985Z" fill="#BEBEBE"/> -<path d="M51.1688 46.055C50.4134 48.8743 48.0869 50.7005 45.9725 50.1339C43.858 49.5674 42.7563 46.8226 43.5117 44.0033C44.2671 41.184 46.5936 39.3579 48.7081 39.9244C50.8225 40.491 51.9243 43.2358 51.1688 46.055Z" fill="#444549"/> -<path d="M50.318 45.8271C49.5626 48.6463 47.4266 50.5236 45.5471 50.0199C43.6675 49.5163 42.7563 46.8226 43.5117 44.0033C44.2671 41.184 46.4032 39.3068 48.2827 39.8104C50.1622 40.3141 51.0735 43.0078 50.318 45.8271Z" fill="#BEBEBE"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M50.2166 41.7522C49.8616 41.3288 49.4198 41.027 48.9055 40.8892C47.026 40.3856 44.8899 42.2628 44.1345 45.0821C43.7335 46.5787 43.8022 48.0399 44.236 49.1569C43.2936 48.0328 42.963 46.0512 43.5117 44.0033C44.2671 41.184 46.4032 39.3068 48.2827 39.8104C49.1645 40.0467 49.8331 40.765 50.2166 41.7522Z" fill="#B0B0B0"/> -<path d="M48.4621 47.2646C47.8259 48.2163 46.8549 48.6834 46.2932 48.308C45.7316 47.9325 45.792 46.8567 46.4282 45.905C47.0644 44.9534 48.0354 44.4862 48.597 44.8617C49.1586 45.2371 49.0982 46.313 48.4621 47.2646Z" fill="#DDDDDD"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M50.5509 66.3097C55.2926 62.5694 59.2889 56.5907 61.265 49.2161C63.241 41.8415 62.7694 34.6656 60.5331 29.0555C58.297 23.4458 54.3851 19.5604 49.5006 18.2516C44.6161 16.9428 39.2856 18.3517 34.5442 22.0918C29.8025 25.8322 25.8061 31.8109 23.8301 39.1855C21.8541 46.56 22.3257 53.7359 24.5619 59.346C26.798 64.9557 30.71 68.8412 35.5945 70.1499C40.4789 71.4587 45.8095 70.0498 50.5509 66.3097ZM34.9105 72.7023C46.6575 75.8499 59.5995 65.641 63.8173 49.9C68.0351 34.159 61.9315 18.8468 50.1845 15.6992C38.4375 12.5516 25.4955 22.7606 21.2777 38.5015C17.0599 54.2425 23.1636 69.5547 34.9105 72.7023Z" fill="#BEBEBE"/> -<path d="M23.2458 54.9487C24.0786 58.9145 25.6708 62.347 27.8293 64.9754C30.4393 68.1536 33.7649 70.0305 37.3779 70.5046C41.0047 70.9805 44.9457 70.0442 48.7109 67.6248C51.808 65.6347 54.6387 62.7309 56.9278 59.1429C57.1327 58.8217 57.4563 58.5927 57.8294 58.5158C58.9697 58.2806 59.8494 59.4678 59.2269 60.4516C56.744 64.3754 53.6269 67.6069 50.1394 69.8478C45.9294 72.553 41.3687 73.6933 37.0341 73.1245C32.6994 72.5557 28.7855 70.3034 25.7872 66.6523C23.2961 63.6189 21.5301 59.7332 20.6303 55.3494C20.4014 54.234 21.599 53.4389 22.5814 54.0147C22.9256 54.2165 23.1638 54.5582 23.2458 54.9487Z" fill="#A4A4A4"/> -<path d="M61.9541 46.1162C62.9239 40.6462 62.6035 35.1934 61.0613 30.5094C59.2285 24.9433 55.8534 20.9768 51.7647 19.0753C47.7079 17.1885 42.938 17.3261 38.2498 19.7062C34.2199 21.7521 30.5103 25.3364 27.6978 30.0176C27.5036 30.3408 27.1908 30.5768 26.8244 30.6658C25.6873 30.942 24.7662 29.7751 25.3652 28.7699C28.4021 23.674 32.4818 19.6711 37.0536 17.35C42.375 14.6485 47.9998 14.4101 52.879 16.6793C57.7582 18.9485 61.5585 23.5704 63.5711 29.683C65.335 35.04 65.6203 41.2213 64.4159 47.3248C64.2241 48.2968 62.9655 48.4827 62.4551 47.6336L62.1315 47.0951C61.955 46.8016 61.8943 46.4534 61.9541 46.1162Z" fill="#DDDDDD"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M57.4814 21.1955C58.0013 20.8953 58.6625 20.9887 59.0523 21.4452C60.9792 23.7023 62.519 26.4894 63.5707 29.6835C63.6197 29.8323 63.6676 29.9817 63.7143 30.1318C63.8906 30.6981 63.6388 31.3048 63.1252 31.6014C62.3736 32.0353 61.4162 31.627 61.1544 30.7996C61.1237 30.7027 61.0926 30.6061 61.0609 30.5099C60.1256 27.6695 58.7887 25.2457 57.1603 23.3003C56.6103 22.6432 56.7393 21.6239 57.4814 21.1955Z" fill="white"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M55.8881 63.57C56.1633 64.0468 56.1101 64.6472 55.7404 65.0551C54.0298 66.9427 52.1464 68.5593 50.1404 69.8483C46.4965 72.1898 42.5898 73.3589 38.7944 73.2621C38.0827 73.2439 37.5594 72.6169 37.6097 71.9068C37.6623 71.1623 38.323 70.6159 39.0693 70.6241C42.2114 70.6586 45.5247 69.6733 48.7119 67.6253C50.4795 66.4895 52.1602 65.0562 53.7031 63.3678C54.3196 62.6932 55.4311 62.7785 55.8881 63.57Z" fill="#808080"/> -<path opacity="0.35" d="M61.3542 69.3014L59.9112 66.1791L61.3198 64.2969L64.5071 66.0428L63.26 70.6967C63.2069 70.8951 62.9576 70.9597 62.8148 70.812L61.3542 69.3014Z" fill="#5B450C"/> -<path d="M59.0524 72.7881L57.7233 69.2404L59.9337 71.2005L62.714 71.0336L63.5648 71.2615L60.8374 74.6342L59.0524 72.7881Z" fill="black"/> -<line x1="4.37175" y1="30.3351" x2="16.8351" y2="34.1283" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<line x1="13.9135" y1="22.9173" x2="19.4173" y2="26.5866" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<line x1="9.10617" y1="41.6363" x2="15.4697" y2="40.7272" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<line x1="60.681" y1="16.219" x2="61.0524" y2="14.4857" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<line x1="64.293" y1="21.2222" x2="70.0555" y2="14.207" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<line x1="24.2179" y1="71.8974" x2="23.064" y2="72.282" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<line x1="28.5583" y1="73.9936" x2="25.1603" y2="81.2751" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> -<defs> -<linearGradient id="paint0_linear_118_40903" x1="88.4454" y1="46.4689" x2="67.0899" y2="64.9114" gradientUnits="userSpaceOnUse"> -<stop stop-color="#FFD752"/> -<stop offset="0.714248" stop-color="#5B450C"/> -</linearGradient> -<linearGradient id="paint1_linear_118_40903" x1="38.2734" y1="12.5077" x2="45.9403" y2="77.4815" gradientUnits="userSpaceOnUse"> -<stop stop-color="#25262B"/> -<stop offset="1" stop-color="#60626C"/> -</linearGradient> -</defs> -</svg> diff --git a/src/assets/icons/visu/ecogesture/ECOGESTURE0078.svg b/src/assets/icons/visu/ecogesture/ECOGESTURE0078.svg index cfbccdea0982279f8dcae7747df220a883a77f33..abc693e9e2b32cfef307c01cec65861eb9b164f9 100644 --- a/src/assets/icons/visu/ecogesture/ECOGESTURE0078.svg +++ b/src/assets/icons/visu/ecogesture/ECOGESTURE0078.svg @@ -1,328 +1,279 @@ -<svg width="220" height="221" viewBox="0 0 220 221" fill="none" xmlns="http://www.w3.org/2000/svg"> -<g clip-path="url(#clip0_15162_4926)"> -<path d="M62.8678 70.5441L62.8372 70.529C62.9465 70.3099 63.034 70.0472 63.1214 69.7845C64.6631 65.1537 62.1809 60.1696 57.5691 58.6358C56.13 58.1571 54.636 58.0615 53.2071 58.3158C52.4255 54.1162 49.2704 51.9341 44.9203 50.4872C38.5422 48.3659 32.5946 48.6818 30.4624 55.0859C30.3643 55.0533 30.2335 55.0098 30.1353 54.9772C23.7573 52.8559 16.8509 56.3589 14.7187 62.7631C12.5866 69.1673 16.0268 76.0751 22.4049 78.1964C23.7459 78.6425 25.0981 78.8368 26.4177 78.8015C27.1566 81.9291 29.4554 84.627 32.7262 85.7148C35.7353 86.7157 38.8658 86.1518 41.2883 84.4405C42.3557 86.0357 43.925 87.3237 45.8548 87.9656C49.1583 89.0643 52.6381 88.1059 54.9412 85.7712C55.7259 86.3605 56.598 86.7965 57.5792 87.1228C62.5835 88.7872 68.0279 86.0746 69.7117 81.017C71.4174 76.003 69.4376 71.8081 62.8678 70.5441Z" fill="#4E626F"/> -<path d="M14.1848 65.102C15.2727 68.7958 17.4525 73.2644 21.3742 74.5687C22.7152 75.0147 27.2175 75.728 28.7134 74.1745C27.9096 76.7958 30.1202 81.1693 33.391 82.2571C36.4001 83.2579 40.9266 83.1403 43.3491 81.429C44.4165 83.0243 45.36 84.4315 47.2898 85.0733C50.5933 86.1721 54.3879 84.579 56.6911 82.2443C57.4758 82.8336 58.9377 84.2427 59.9189 84.569C66.3459 85.6908 67.6284 81.0923 69.3122 76.0347C69.4604 75.5992 69.5753 75.1607 69.6583 74.7218C70.366 76.681 70.4369 78.8854 69.712 81.0163C68.0282 86.0739 62.5838 88.7865 57.5795 87.1221C56.5983 86.7958 55.7262 86.3598 54.9415 85.7705C52.6383 88.1052 49.1586 89.0636 45.8551 87.9649C43.9253 87.323 42.356 86.035 41.2886 84.4397C38.866 86.151 35.7356 86.7149 32.7264 85.7141C29.4556 84.6263 27.1569 81.9283 26.418 78.8008C25.0983 78.8361 23.7462 78.6417 22.4052 78.1957C16.7996 76.3313 13.4632 70.7696 14.1848 65.102Z" fill="#344550"/> -<path d="M58.9846 65.8284C57.2695 64.9782 55.8134 64.6505 54.5427 64.597C52.2845 64.5021 49.9739 63.8453 48.7298 61.9593L48.2145 61.1782C46.8725 59.1438 44.1195 58.6102 42.1134 59.9958C40.4195 61.1657 38.144 60.9783 36.5362 59.6934C34.6906 58.2185 32.3416 56.6087 31.0396 56.7602C28.6782 57.035 23.5576 57.6495 22.3432 60.6735C24.2702 58.9812 25.3718 58.6064 27.8514 59.0296C30.2783 59.4439 33.3032 63.8039 34.4674 65.3019C33.9162 65.0287 31.3677 64.3986 28.0423 68.5632C31.6679 66.6769 32.5627 66.142 35.8239 68.1038C39.057 70.0486 37.4739 74.3126 36.0366 75.9791C36.7711 75.8827 38.7168 74.591 39.5238 73.3335C40.3309 72.0759 41.0827 70.4994 40.623 69.7343C41.9083 69.4506 42.9923 70.0799 44.0228 72.8008C45.0533 75.5217 44.4375 74.7331 44.0716 76.5085C45.3558 74.8429 46.776 70.9425 50.8167 71.564C55.7613 72.3246 57.7056 74.288 57.1574 77.93C58.0743 76.0823 58.1896 74.0675 57.0384 72.4034C54.9692 69.4121 52.6342 69.3087 50.9036 69.2864C52.3888 69.2135 54.7727 66.7047 56.3916 67.133C59.629 67.9895 61.8574 70.1877 62.5253 72.8785C62.912 68.4081 61.4647 67.0577 58.9846 65.8284Z" fill="#44555F"/> -<g filter="url(#filter0_f_15162_4926)"> -<g filter="url(#filter1_f_15162_4926)"> -<path d="M41.8491 92.1865C46.5939 95.9768 43.588 98.9056 41.5466 100.106C36.7826 102.907 34.1717 98.8782 32.4858 95.3939C31.8885 94.1593 31.6218 91.8648 31.5395 89.3659C31.2671 87.0841 30.9401 82.1503 31.8116 80.6702C32.5749 81.9302 34.1329 84.1876 36.1847 86.5954C36.9814 87.5304 37.7136 81.8923 38.6417 82.823C38.1229 86.8779 40.7778 91.3306 41.8491 92.1865Z" fill="#DC4F00"/> +<svg width="221" height="220" viewBox="0 0 221 220" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_4070_18371)"> +<g opacity="0.6" filter="url(#filter0_f_4070_18371)"> +<circle cx="110.5" cy="110" r="73" fill="url(#paint0_radial_4070_18371)"/> </g> -<g filter="url(#filter2_f_15162_4926)"> -<path d="M41.8491 92.1865C46.5939 95.9768 43.588 98.9056 41.5466 100.106C36.7826 102.907 34.1717 98.8782 32.4858 95.3939C31.8885 94.1593 31.6218 91.8648 31.5395 89.3659C31.2671 87.0841 30.9401 82.1503 31.8116 80.6702C32.5749 81.9302 34.1329 84.1876 36.1847 86.5954C36.9814 87.5304 37.7136 81.8923 38.6417 82.823C38.1229 86.8779 40.7778 91.3306 41.8491 92.1865Z" fill="#DC4F00"/> +<g opacity="0.2" filter="url(#filter1_f_4070_18371)"> +<circle cx="110.5" cy="110" r="95" fill="url(#paint1_radial_4070_18371)"/> </g> +<g opacity="0.1" filter="url(#filter2_f_4070_18371)"> +<circle cx="110.5" cy="110" r="107" fill="url(#paint2_radial_4070_18371)"/> </g> -<g filter="url(#filter3_f_15162_4926)"> -<path d="M41.9778 94.7058C43.0302 96.3703 40.4644 98.8637 40.0442 99.2414C34.6105 102.262 32.439 92.8705 32.7388 89.0267C33.2527 93.4131 35.9752 96.5284 37.2723 97.5378C38.1961 98.1057 40.9255 93.0413 41.9778 94.7058Z" fill="#FFBC3A"/> +<g opacity="0.8" filter="url(#filter3_f_4070_18371)"> +<circle cx="110.5" cy="110" r="54" fill="url(#paint3_radial_4070_18371)"/> </g> -<g filter="url(#filter4_f_15162_4926)"> -<path d="M100.154 74.6347C97.5698 76.7928 87.9682 80.0562 76.0385 77.1191C58.2801 72.7471 52.2341 57.323 51.335 50.5263C53.1476 51.5338 57.8796 53.6967 62.307 54.289C58.6058 49.2037 56.0143 37.3819 57.44 26.7231C60.5765 29.4794 67.9111 30.0711 71.1863 30.0225C67.8807 26.6593 61.6203 17.3093 63.0241 6.8145C73.4059 16.5489 83.6429 13.3281 89.6537 18.305C95.6645 23.2818 92.1642 27.6124 96.0287 34.5972C96.0747 29.2621 100.043 21.2247 102.021 17.8729C102.021 17.8729 102.523 28.1635 104.379 33.0019C106.236 37.8403 110.635 39.2635 111.056 47.0395C111.392 53.2602 105.888 62.2745 103.094 66.0041C104.556 65.991 108.736 65.0061 113.755 61.1709C112.605 66.6504 102.737 72.4766 100.154 74.6347Z" fill="#DC4F00"/> +<path d="M45.462 193.897C45.9806 193.509 46.6106 193.3 47.258 193.3H170.742C171.389 193.3 172.019 193.509 172.538 193.897L191.271 207.897C193.582 209.624 192.36 213.3 189.475 213.3H28.5254C25.6398 213.3 24.4181 209.624 26.7295 207.897L45.462 193.897Z" fill="#1E1E1E"/> +<path opacity="0.35" d="M55.4062 96.416C55.4062 95.3114 56.3017 94.416 57.4062 94.416H160.788C161.893 94.416 162.788 95.3114 162.788 96.416V160.573C162.788 163.334 160.55 165.573 157.788 165.573H60.4063C57.6448 165.573 55.4062 163.334 55.4062 160.573V96.416Z" fill="url(#paint4_radial_4070_18371)"/> +<path d="M62.7136 94.7319H156.257V157.043C156.257 158.148 155.362 159.043 154.257 159.043H64.7136C63.609 159.043 62.7136 158.148 62.7136 157.043V94.7319Z" fill="url(#paint5_linear_4070_18371)"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M55.1857 83.8735C52.4242 83.8735 50.1857 86.1121 50.1857 88.8735V168.241C50.1857 171.003 52.4242 173.241 55.1857 173.241H164.621C167.383 173.241 169.621 171.003 169.621 168.241V88.8735C169.621 86.1121 167.383 83.8735 164.621 83.8735H55.1857ZM156.258 94.7311H62.7139V157.042C62.7139 158.147 63.6094 159.042 64.7139 159.042H154.258C155.362 159.042 156.258 158.147 156.258 157.042V94.7311Z" fill="#838383"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M168.869 62.9927H50.102C46.4579 62.9927 43.5038 66.3148 43.5038 70.4129V195.053C43.5038 199.151 46.4579 202.473 50.102 202.473H168.869C172.513 202.473 175.467 199.151 175.467 195.053V70.4129C175.467 66.3148 172.513 62.9927 168.869 62.9927ZM55.1861 83.7747C52.4247 83.7747 50.1861 86.0133 50.1861 88.7747V168.143C50.1861 170.904 52.4247 173.143 55.1861 173.143H164.622C167.383 173.143 169.622 170.904 169.622 168.143V88.7747C169.622 86.0133 167.383 83.7747 164.622 83.7747H55.1861Z" fill="#C7C7C7"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M168.869 62.9927H50.102C46.4579 62.9927 43.5038 66.3148 43.5038 70.4129V195.053C43.5038 199.151 46.4579 202.473 50.102 202.473H168.869C172.513 202.473 175.467 199.151 175.467 195.053V70.4129C175.467 66.3148 172.513 62.9927 168.869 62.9927ZM55.1861 83.7747C52.4247 83.7747 50.1861 86.0133 50.1861 88.7747V168.143C50.1861 170.904 52.4247 173.143 55.1861 173.143H164.622C167.383 173.143 169.622 170.904 169.622 168.143V88.7747C169.622 86.0133 167.383 83.7747 164.622 83.7747H55.1861Z" fill="url(#paint6_linear_4070_18371)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M168.869 62.9927H50.102C46.4579 62.9927 43.5038 66.3148 43.5038 70.4129V195.053C43.5038 196.703 43.9826 198.227 44.7924 199.459C44.7246 199.03 44.6892 198.588 44.6892 198.137V73.833C44.6892 69.746 47.5902 66.4329 51.1689 66.4329H167.802C171.381 66.4329 174.282 69.746 174.282 73.833V198.137C174.282 198.588 174.246 199.03 174.179 199.459C174.989 198.227 175.467 196.703 175.467 195.053V70.4129C175.467 66.3148 172.513 62.9927 168.869 62.9927Z" fill="#FF6610" fill-opacity="0.4"/> +<path d="M172.443 64.0547C173.093 64.6491 176.065 66.9008 176.065 71.0018V195.733C176.065 199.834 173.111 203.158 169.466 203.158H50.693C47.0487 203.158 43.5 199.834 43.5 195.733L165.357 197.217C169.256 197.264 172.443 194.117 172.443 190.217V64.0547Z" fill="#878787"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M119.591 109.233H97.0016V118.745H89.8679V130.634H83.923V144.901H133.858V130.634H126.725V118.745H119.591V109.233Z" fill="#5F3929"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M119.591 109.233H97.0016V118.745H89.8679V130.634H83.923V144.901H133.858V130.634H126.725V118.745H119.591V109.233Z" fill="url(#paint7_linear_4070_18371)" fill-opacity="0.75"/> +<rect x="118.402" y="130.634" width="13.0782" height="14.2671" fill="#492617"/> +<rect x="89.8679" y="130.634" width="3.56677" height="14.2671" fill="#834E39"/> +<rect x="95.8124" y="121.123" width="3.56677" height="10.7003" fill="#834E39"/> +<rect x="100.568" y="111.611" width="2.37785" height="10.7003" fill="#834E39"/> +<rect x="111.268" y="130.634" width="4.75569" height="14.2671" fill="#492617"/> +<rect x="87.4895" y="130.634" width="1.18892" height="14.2671" fill="#834E39"/> +<rect x="93.4344" y="121.123" width="1.18892" height="10.7003" fill="#834E39"/> +<rect x="98.1902" y="111.611" width="1.18892" height="10.7003" fill="#834E39"/> +<rect x="117.213" y="118.745" width="7.13354" height="15.456" fill="#492617"/> +<rect x="117.213" y="118.745" width="7.13354" height="15.456" fill="#492617"/> +<rect x="107.701" y="118.745" width="3.56677" height="15.456" fill="#492617"/> +<rect x="111.268" y="109.233" width="5.94462" height="10.7003" fill="#492617"/> +<rect x="106.513" y="109.233" width="2.37785" height="10.7003" fill="#492617"/> +<rect x="77.9784" y="144.297" width="63.4936" height="2.53975" rx="1.26987" fill="#D9D9D9"/> +<path d="M85.5974 146.837H133.853C133.853 148.941 132.147 150.647 130.043 150.647H89.407C87.303 150.647 85.5974 148.941 85.5974 146.837Z" fill="#D9D9D9"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M133.343 148.742H86.1069C85.7828 148.182 85.5974 147.531 85.5974 146.837H133.853C133.853 147.531 133.667 148.182 133.343 148.742Z" fill="#858585"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M119.591 111.715C119.452 111.648 119.297 111.611 119.132 111.611H97.4911C97.3147 111.611 97.1482 111.654 97.0016 111.73V113.636L98.742 114.757C99.1395 115.014 99.65 115.014 100.048 114.757L100.881 114.22C101.786 113.637 102.948 113.637 103.853 114.22C104.758 114.804 105.921 114.804 106.826 114.22C107.73 113.637 108.893 113.637 109.798 114.22C110.703 114.804 111.865 114.804 112.77 114.22C113.675 113.637 114.838 113.637 115.742 114.22L116.576 114.757C116.973 115.014 117.484 115.014 117.881 114.757L119.591 113.656V111.715ZM126.725 121.135C126.665 121.127 126.604 121.123 126.543 121.123H90.0491C89.9877 121.123 89.9272 121.127 89.8679 121.135V123.944L92.7509 125.445C93.2724 125.717 93.8937 125.717 94.4153 125.445L96.1779 124.527C97.6253 123.774 99.3494 123.774 100.797 124.527L101.082 124.676C102.53 125.43 104.254 125.43 105.701 124.676L105.987 124.527C107.434 123.774 109.158 123.774 110.605 124.527L110.891 124.676C112.338 125.43 114.062 125.43 115.51 124.676L115.795 124.527C117.243 123.774 118.967 123.774 120.414 124.527L122.177 125.445C122.698 125.717 123.32 125.717 123.841 125.445L126.725 123.944V121.135ZM133.858 131.905C133.657 131.852 133.447 131.823 133.229 131.823H84.5826C84.354 131.823 84.1327 131.855 83.923 131.914V136.624L87.8302 138.477C88.4711 138.78 89.2145 138.78 89.8554 138.477L93.3886 136.802C94.7443 136.159 96.3168 136.159 97.6724 136.802L100.076 137.941C101.432 138.584 103.004 138.584 104.36 137.941L106.764 136.802C108.12 136.159 109.692 136.159 111.048 136.802L113.452 137.941C114.807 138.584 116.38 138.584 117.735 137.941L120.139 136.802C121.495 136.159 123.068 136.159 124.423 136.802L127.956 138.477C128.597 138.78 129.341 138.78 129.982 138.477L133.858 136.639V131.905Z" fill="#492617"/> +<line x1="102.239" y1="104.173" x2="102.239" y2="101.612" stroke="black" stroke-width="0.5"/> +<path d="M101.421 104.173C101.421 103.702 101.803 103.32 102.275 103.32C102.746 103.32 103.129 103.702 103.129 104.173V110.149H101.421V104.173Z" fill="#D90034"/> +<path d="M102.276 103.32C102.747 103.32 103.129 103.702 103.129 104.173V110.149H102.276V103.32Z" fill="#950D2E"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M101.422 104.687V105.823C101.749 105.653 102.098 105.459 102.44 105.25C102.67 105.11 102.903 104.958 103.129 104.798V104.173C103.129 103.983 103.068 103.809 102.963 103.667C102.671 103.909 102.311 104.157 101.918 104.397C101.753 104.498 101.587 104.595 101.422 104.687ZM103.129 105.231C102.812 105.517 102.389 105.816 101.918 106.104C101.753 106.205 101.587 106.302 101.422 106.394V107.53C101.749 107.36 102.098 107.166 102.44 106.957C102.67 106.817 102.903 106.665 103.129 106.505V105.231ZM103.129 106.939C102.812 107.225 102.389 107.524 101.918 107.812C101.753 107.913 101.587 108.01 101.422 108.102V109.238C101.749 109.068 102.098 108.874 102.44 108.665C102.67 108.525 102.903 108.373 103.129 108.213V106.939ZM103.129 108.646C102.812 108.932 102.389 109.231 101.918 109.519C101.753 109.62 101.587 109.717 101.422 109.809V110.148H102.794C102.907 110.074 103.019 109.998 103.129 109.92V108.646Z" fill="#FFCF86"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M102.275 104.17V105.349C102.33 105.317 102.385 105.284 102.44 105.25C102.67 105.11 102.903 104.958 103.129 104.798V104.172C103.129 103.983 103.067 103.808 102.963 103.667C102.762 103.833 102.529 104.003 102.275 104.17ZM103.129 105.231C102.894 105.442 102.602 105.661 102.275 105.877V107.056C102.33 107.024 102.385 106.991 102.44 106.957C102.67 106.817 102.903 106.665 103.129 106.505V105.231ZM103.129 106.939C102.894 107.15 102.602 107.369 102.275 107.585V108.764C102.33 108.732 102.385 108.699 102.44 108.665C102.67 108.525 102.903 108.373 103.129 108.213V106.939ZM103.129 108.646C102.894 108.857 102.602 109.076 102.275 109.292V110.148H102.794C102.907 110.074 103.019 109.998 103.129 109.92V108.646Z" fill="#BC9254"/> +<path opacity="0.75" d="M101.421 104.173C101.421 103.702 101.803 103.32 102.275 103.32C102.746 103.32 103.129 103.702 103.129 104.173V105.881H101.421V104.173Z" fill="url(#paint8_linear_4070_18371)"/> +<g filter="url(#filter4_f_4070_18371)"> +<g filter="url(#filter5_f_4070_18371)"> +<path d="M103.322 100.213C104.322 101.012 103.689 101.629 103.259 101.882C102.255 102.472 101.704 101.623 101.349 100.889C101.223 100.629 101.167 100.145 101.15 99.6185C101.092 99.1376 101.023 98.098 101.207 97.7861C101.368 98.0516 101.696 98.5273 102.129 99.0347C102.297 99.2317 102.451 98.0436 102.646 98.2397C102.537 99.0942 103.096 100.032 103.322 100.213Z" fill="#DC4F00"/> </g> -<g filter="url(#filter5_f_15162_4926)"> -<path d="M100.154 74.6347C97.5698 76.7928 87.9682 80.0562 76.0385 77.1191C58.2801 72.7471 52.2341 57.323 51.335 50.5263C53.1476 51.5338 57.8796 53.6967 62.307 54.289C58.6058 49.2037 56.0143 37.3819 57.44 26.7231C60.5765 29.4794 67.9111 30.0711 71.1863 30.0225C67.8807 26.6593 61.6203 17.3093 63.0241 6.8145C73.4059 16.5489 83.6429 13.3281 89.6537 18.305C95.6645 23.2818 92.1642 27.6124 96.0287 34.5972C96.0747 29.2621 100.043 21.2247 102.021 17.8729C102.021 17.8729 102.523 28.1635 104.379 33.0019C106.236 37.8403 110.635 39.2635 111.056 47.0395C111.392 53.2602 105.888 62.2745 103.094 66.0041C104.556 65.991 108.736 65.0061 113.755 61.1709C112.605 66.6504 102.737 72.4766 100.154 74.6347Z" fill="#DC4F00"/> +<g filter="url(#filter6_f_4070_18371)"> +<path d="M103.322 100.213C104.322 101.012 103.689 101.629 103.259 101.882C102.255 102.472 101.704 101.623 101.349 100.889C101.223 100.629 101.167 100.145 101.15 99.6185C101.092 99.1376 101.023 98.098 101.207 97.7861C101.368 98.0516 101.696 98.5273 102.129 99.0347C102.297 99.2317 102.451 98.0436 102.646 98.2397C102.537 99.0942 103.096 100.032 103.322 100.213Z" fill="#DC4F00"/> </g> -<g filter="url(#filter6_f_15162_4926)"> -<path d="M113.832 70.0624C115.219 71.2209 120.374 72.9729 126.778 71.3961C136.311 69.049 139.557 60.7688 140.04 57.12C139.067 57.6608 136.526 58.822 134.15 59.1399C136.137 56.4099 137.528 50.0635 136.762 44.3414C135.079 45.8211 131.141 46.1388 129.383 46.1127C131.157 44.3072 134.518 39.2877 133.765 33.6536C128.191 38.8795 122.696 37.1504 119.469 39.8222C116.242 42.494 118.121 44.8188 116.046 48.5686C116.022 45.7045 113.891 41.3897 112.829 39.5903C112.829 39.5903 112.56 45.1147 111.563 47.7122C110.567 50.3096 108.205 51.0736 107.979 55.2481C107.799 58.5877 110.753 63.4269 112.253 65.4291C111.468 65.4221 109.225 64.8934 106.53 62.8345C107.147 65.7761 112.445 68.9038 113.832 70.0624Z" fill="#DC4F00"/> </g> -<g filter="url(#filter7_f_15162_4926)"> -<path d="M113.832 70.0624C115.219 71.2209 120.374 72.9729 126.778 71.3961C136.311 69.049 139.557 60.7688 140.04 57.12C139.067 57.6608 136.526 58.822 134.15 59.1399C136.137 56.4099 137.528 50.0635 136.762 44.3414C135.079 45.8211 131.141 46.1388 129.383 46.1127C131.157 44.3072 134.518 39.2877 133.765 33.6536C128.191 38.8795 122.696 37.1504 119.469 39.8222C116.242 42.494 118.121 44.8188 116.046 48.5686C116.022 45.7045 113.891 41.3897 112.829 39.5903C112.829 39.5903 112.56 45.1147 111.563 47.7122C110.567 50.3096 108.205 51.0736 107.979 55.2481C107.799 58.5877 110.753 63.4269 112.253 65.4291C111.468 65.4221 109.225 64.8934 106.53 62.8345C107.147 65.7761 112.445 68.9038 113.832 70.0624Z" fill="#DC4F00"/> +<g filter="url(#filter7_f_4070_18371)"> +<path d="M103.349 100.744C103.571 101.095 103.03 101.621 102.942 101.7C101.797 102.337 101.339 100.358 101.402 99.5477C101.51 100.472 102.084 101.128 102.358 101.341C102.552 101.461 103.127 100.394 103.349 100.744Z" fill="#FFBC3A"/> </g> -<g filter="url(#filter8_f_15162_4926)"> -<path d="M101.905 85.5051C100.015 87.4007 93.0827 90.3758 84.6028 88.0906C71.9799 84.6888 67.948 71.6082 67.4343 65.8105C68.712 66.6378 72.0566 68.3981 75.2132 68.8203C72.6619 64.5402 71.033 54.4756 72.2565 45.3294C74.4481 47.6277 79.6848 47.9941 82.0292 47.89C79.7281 45.0757 75.4271 37.1958 76.6317 28.1903C83.8744 36.3204 91.2605 33.3697 95.4664 37.513C99.6723 41.6562 97.0852 45.428 99.717 51.3301C99.8517 46.7648 102.844 39.8128 104.324 36.9075C104.324 36.9075 104.486 45.7019 105.722 49.806C106.958 53.91 122.218 44.6856 122.371 51.3303C122.493 56.646 125.241 52.3941 123.171 55.6382C124.217 55.5991 129.504 51.2669 133.169 47.89C135.569 65.8108 103.795 83.6095 101.905 85.5051Z" fill="#FFBC3A" fill-opacity="0.8"/> +<line x1="108.214" y1="104.174" x2="108.214" y2="101.613" stroke="black" stroke-width="0.5"/> +<path d="M107.396 104.173C107.396 103.702 107.779 103.32 108.25 103.32C108.721 103.32 109.104 103.702 109.104 104.173V110.149H107.396V104.173Z" fill="#D90034"/> +<path d="M108.25 103.32C108.722 103.32 109.104 103.702 109.104 104.173V110.149H108.25V103.32Z" fill="#950D2E"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M107.396 104.688V105.823C107.724 105.653 108.073 105.46 108.414 105.251C108.644 105.11 108.878 104.959 109.104 104.798V104.173C109.104 103.984 109.042 103.809 108.938 103.667C108.645 103.909 108.286 104.157 107.892 104.398C107.728 104.498 107.561 104.595 107.396 104.688ZM109.104 105.232C108.787 105.517 108.364 105.817 107.892 106.105C107.728 106.205 107.561 106.302 107.396 106.395V107.53C107.724 107.36 108.073 107.167 108.414 106.958C108.644 106.817 108.878 106.666 109.104 106.505V105.232ZM109.104 106.94C108.787 107.225 108.364 107.525 107.892 107.813C107.728 107.913 107.561 108.01 107.396 108.102V109.238C107.724 109.068 108.073 108.875 108.414 108.666C108.644 108.525 108.878 108.374 109.104 108.213V106.94ZM109.104 108.646C108.787 108.932 108.364 109.232 107.892 109.52C107.728 109.62 107.561 109.717 107.396 109.809V110.149H108.768C108.881 110.075 108.993 109.999 109.104 109.92V108.646Z" fill="#FFCF86"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M108.251 104.171V105.35C108.306 105.318 108.361 105.285 108.415 105.251C108.645 105.111 108.879 104.959 109.104 104.799V104.174C109.104 103.984 109.043 103.809 108.939 103.668C108.737 103.834 108.505 104.003 108.251 104.171ZM109.104 105.232C108.87 105.443 108.578 105.662 108.251 105.878V107.057C108.306 107.025 108.361 106.992 108.415 106.958C108.645 106.818 108.879 106.666 109.104 106.506V105.232ZM109.104 106.94C108.87 107.151 108.578 107.37 108.251 107.586V108.765C108.306 108.733 108.361 108.7 108.415 108.666C108.645 108.526 108.879 108.374 109.104 108.214V106.94ZM109.104 108.647C108.87 108.858 108.578 109.077 108.251 109.293V110.149H108.769C108.882 110.075 108.994 109.999 109.104 109.921V108.647Z" fill="#BC9254"/> +<path opacity="0.75" d="M107.396 104.173C107.396 103.702 107.779 103.32 108.25 103.32C108.721 103.32 109.104 103.702 109.104 104.173V105.881H107.396V104.173Z" fill="url(#paint9_linear_4070_18371)"/> +<g filter="url(#filter8_f_4070_18371)"> +<g filter="url(#filter9_f_4070_18371)"> +<path d="M109.297 100.213C110.297 101.012 109.664 101.629 109.234 101.882C108.23 102.472 107.68 101.623 107.324 100.889C107.199 100.629 107.142 100.146 107.125 99.619C107.068 99.1381 106.999 98.0985 107.182 97.7866C107.343 98.0521 107.671 98.5278 108.104 99.0352C108.272 99.2322 108.426 98.0441 108.622 98.2402C108.512 99.0947 109.072 100.033 109.297 100.213Z" fill="#DC4F00"/> </g> -<path d="M149.169 51.0464L149.214 51.0464C149.214 50.7238 149.264 50.3623 149.315 50.0008C150.208 43.6299 156.059 39.197 162.404 40.0851C164.384 40.3623 166.205 41.1239 167.743 42.2606C171.127 37.7587 176.131 37.0286 182.116 37.8664C190.891 39.0947 197.73 42.9491 196.495 51.7601C196.63 51.779 196.81 51.8041 196.945 51.823C205.72 53.0514 211.823 61.2309 210.589 70.0418C209.354 78.8527 201.244 84.9966 192.469 83.7683C190.624 83.51 188.913 82.9481 187.376 82.1339C184.67 85.3948 180.375 87.2352 175.875 86.6053C171.735 86.0258 168.369 83.5275 166.51 80.0885C164.315 81.3476 161.707 81.9501 159.052 81.5784C154.507 80.9422 150.96 77.7735 149.608 73.6683C148.336 73.9049 147.05 73.9092 145.7 73.7203C138.815 72.7565 133.976 66.3663 134.951 59.4079C135.874 52.4885 140.67 48.6934 149.169 51.0464Z" fill="#4E626F"/> -<path d="M209.849 73.1164C206.4 76.8417 201.208 80.8428 195.812 80.0875C193.967 79.8292 188.232 78.0362 187.376 75.3259C186.79 78.892 181.616 82.7628 177.116 82.1329C172.976 81.5534 167.7 78.7649 165.842 75.3259C163.647 76.585 161.708 77.6946 159.053 77.3229C154.508 76.6867 150.96 72.5842 149.608 68.479C148.336 68.7156 145.784 69.5238 144.434 69.3349C136.187 66.8975 137.367 60.7164 138.342 53.7581C138.422 53.1571 138.544 52.572 138.703 52.0051C136.719 53.9045 135.344 56.4663 134.951 59.4069C133.976 66.3653 138.816 72.7555 145.701 73.7193C147.051 73.9082 148.336 73.9039 149.608 73.6673C150.96 77.7725 154.508 80.9412 159.053 81.5774C161.708 81.949 164.316 81.3466 166.511 80.0875C168.369 83.5265 171.736 86.0248 175.876 86.6043C180.375 87.2342 184.671 85.3938 187.376 82.1329C188.914 82.947 190.625 83.509 192.47 83.7672C200.182 84.8468 207.381 80.2318 209.849 73.1164Z" fill="#344550"/> -<path d="M156.518 47.7515C159.387 47.7514 161.465 48.3526 163.093 49.188C165.616 50.4823 167.147 53.0593 168.223 55.6829C169.249 58.1848 172.147 59.335 174.61 58.2179L182.116 54.8125C182.116 54.8125 192.205 51.6936 194.833 53.4003C197.46 55.107 203.147 58.8302 202.809 63.1121C201.525 59.9856 200.444 58.8982 197.268 57.9466C194.159 57.0152 188.032 60.3934 185.78 61.4809C186.591 61.4809 189.97 62.2286 191.456 69.0933C188.28 64.7433 187.537 63.5879 182.536 63.9957C177.579 64.3999 176.95 70.362 177.67 73.1713C176.859 72.6276 175.319 69.9633 175.102 68.0058C174.886 66.0483 174.922 63.7465 175.913 63.1121C174.562 62.0246 172.913 62.1334 170.102 64.7433C167.29 67.3533 168.48 66.7824 167.872 69.0933C167.331 66.3746 167.939 60.9372 162.803 59.3059C156.518 57.3098 153.072 58.4903 151.585 63.1121C151.585 60.3934 152.63 57.9466 154.964 56.6552C159.16 54.334 161.978 55.5787 164.035 56.5653C162.324 55.61 160.979 51.2518 158.816 50.8099C154.491 49.9263 150.571 51.2178 148.206 54.0045C150.369 48.499 152.869 47.7515 156.518 47.7515Z" fill="#44555F"/> -<path d="M171.717 40.8421C170.982 41.5763 170.399 42.4479 170.002 43.4072C169.604 44.3665 169.4 45.3947 169.4 46.433C169.4 47.4713 169.604 48.4995 170.002 49.4588C170.399 50.4181 170.982 51.2897 171.717 52.0239C172.451 52.7581 173.323 53.3406 174.283 53.7379C175.243 54.1353 176.272 54.3398 177.311 54.3398C178.349 54.3398 179.378 54.1353 180.338 53.7379C181.298 53.3406 182.17 52.7581 182.904 52.0239L178.567 51.7924C174.994 51.6017 172.139 48.7488 171.948 45.1774L171.717 40.8421Z" fill="#44555F"/> -<path d="M42.962 194.147C43.4806 193.759 44.1106 193.55 44.758 193.55H168.242C168.889 193.55 169.519 193.759 170.038 194.147L188.771 208.147C191.082 209.874 189.86 213.55 186.975 213.55H26.0254C23.1398 213.55 21.9181 209.874 24.2295 208.147L42.962 194.147Z" fill="#1E1E1E"/> -<path opacity="0.35" d="M49.0068 96.6657C49.0068 95.5611 49.9023 94.6657 51.0068 94.6657H154.389C155.494 94.6657 156.389 95.5611 156.389 96.6657V160.823C156.389 163.584 154.15 165.823 151.389 165.823H54.0068C51.2454 165.823 49.0068 163.584 49.0068 160.823V96.6657Z" fill="url(#paint0_radial_15162_4926)"/> -<path d="M56.3145 94.9818H149.858V157.293C149.858 158.398 148.963 159.293 147.858 159.293H58.3144C57.2099 159.293 56.3145 158.398 56.3145 157.293V94.9818Z" fill="url(#paint1_linear_15162_4926)"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M48.7861 84.1232C46.0247 84.1232 43.7861 86.3618 43.7861 89.1232V168.491C43.7861 171.252 46.0247 173.491 48.7861 173.491H158.222C160.983 173.491 163.222 171.252 163.222 168.491V89.1232C163.222 86.3618 160.983 84.1232 158.222 84.1232H48.7861ZM149.858 94.9808H56.3144V157.292C56.3144 158.397 57.2098 159.292 58.3144 159.292H147.858C148.963 159.292 149.858 158.397 149.858 157.292V94.9808Z" fill="#838383"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M162.47 63.2424H43.7027C40.0586 63.2424 37.1045 66.5646 37.1045 70.6626V195.303C37.1045 199.401 40.0586 202.723 43.7027 202.723H162.47C166.114 202.723 169.068 199.401 169.068 195.303V70.6626C169.068 66.5646 166.114 63.2424 162.47 63.2424ZM48.7868 84.0245C46.0254 84.0245 43.7868 86.2631 43.7868 89.0245V168.392C43.7868 171.154 46.0254 173.392 48.7868 173.392H158.222C160.984 173.392 163.222 171.154 163.222 168.392V89.0245C163.222 86.2631 160.984 84.0245 158.222 84.0245H48.7868Z" fill="#C7C7C7"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M162.47 63.2424H43.7027C40.0586 63.2424 37.1045 66.5646 37.1045 70.6626V195.303C37.1045 199.401 40.0586 202.723 43.7027 202.723H162.47C166.114 202.723 169.068 199.401 169.068 195.303V70.6626C169.068 66.5646 166.114 63.2424 162.47 63.2424ZM48.7868 84.0245C46.0254 84.0245 43.7868 86.2631 43.7868 89.0245V168.392C43.7868 171.154 46.0254 173.392 48.7868 173.392H158.222C160.984 173.392 163.222 171.154 163.222 168.392V89.0245C163.222 86.2631 160.984 84.0245 158.222 84.0245H48.7868Z" fill="url(#paint2_linear_15162_4926)" fill-opacity="0.75"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M162.47 63.2424H43.7027C40.0586 63.2424 37.1045 66.5646 37.1045 70.6626V195.303C37.1045 196.953 37.5833 198.477 38.3931 199.709C38.3253 199.28 38.2899 198.838 38.2899 198.387V74.0828C38.2899 69.9958 41.191 66.6826 44.7696 66.6826H161.403C164.982 66.6826 167.883 69.9958 167.883 74.0828V198.387C167.883 198.838 167.847 199.28 167.779 199.709C168.589 198.477 169.068 196.953 169.068 195.303V70.6626C169.068 66.5646 166.114 63.2424 162.47 63.2424Z" fill="#FF6610" fill-opacity="0.4"/> -<path d="M166.043 64.3047C166.693 64.8991 169.666 67.1508 169.666 71.2518V195.983C169.666 200.084 166.711 203.408 163.067 203.408H44.2936C40.6493 203.408 37.1006 200.084 37.1006 195.983L158.958 197.467C162.857 197.514 166.043 194.367 166.043 190.467V64.3047Z" fill="#878787"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M113.192 109.483H90.602V118.995H83.4684V130.884H77.5234V145.151H127.458V130.884H120.325V118.995H113.192V109.483Z" fill="#5F3929"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M113.192 109.483H90.602V118.995H83.4684V130.884H77.5234V145.151H127.458V130.884H120.325V118.995H113.192V109.483Z" fill="url(#paint3_linear_15162_4926)" fill-opacity="0.75"/> -<rect x="112.003" y="130.884" width="13.0782" height="14.2671" fill="#492617"/> -<rect x="83.4688" y="130.884" width="3.56677" height="14.2671" fill="#834E39"/> -<rect x="89.4131" y="121.373" width="3.56677" height="10.7003" fill="#834E39"/> -<rect x="94.168" y="111.861" width="2.37785" height="10.7003" fill="#834E39"/> -<rect x="104.869" y="130.884" width="4.75569" height="14.2671" fill="#492617"/> -<rect x="81.0898" y="130.884" width="1.18892" height="14.2671" fill="#834E39"/> -<rect x="87.0352" y="121.373" width="1.18892" height="10.7003" fill="#834E39"/> -<rect x="91.791" y="111.861" width="1.18892" height="10.7003" fill="#834E39"/> -<rect x="110.813" y="118.995" width="7.13354" height="15.456" fill="#492617"/> -<rect x="110.813" y="118.995" width="7.13354" height="15.456" fill="#492617"/> -<rect x="101.302" y="118.995" width="3.56677" height="15.456" fill="#492617"/> -<rect x="104.869" y="109.483" width="5.94462" height="10.7003" fill="#492617"/> -<rect x="100.113" y="109.483" width="2.37785" height="10.7003" fill="#492617"/> -<rect x="71.5791" y="144.547" width="63.4936" height="2.53975" rx="1.26987" fill="#D9D9D9"/> -<path d="M79.1982 147.088H127.453C127.453 149.192 125.748 150.897 123.644 150.897H83.0079C80.9039 150.897 79.1982 149.192 79.1982 147.088Z" fill="#D9D9D9"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M126.944 148.992H79.7077C79.3837 148.432 79.1982 147.781 79.1982 147.088H127.453C127.453 147.781 127.268 148.432 126.944 148.992Z" fill="#858585"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M113.192 111.965C113.053 111.898 112.897 111.861 112.733 111.861H91.0915C90.9151 111.861 90.7487 111.904 90.602 111.98V113.886L92.3424 115.007C92.7399 115.264 93.2505 115.264 93.648 115.007L94.4814 114.47C95.3863 113.887 96.5487 113.887 97.4537 114.47C98.3586 115.053 99.521 115.053 100.426 114.47C101.331 113.887 102.493 113.887 103.398 114.47C104.303 115.053 105.466 115.053 106.371 114.47C107.276 113.887 108.438 113.887 109.343 114.47L110.176 115.007C110.574 115.264 111.084 115.264 111.482 115.007L113.192 113.906V111.965ZM120.325 121.385C120.266 121.377 120.205 121.373 120.143 121.373H83.6495C83.5881 121.373 83.5277 121.377 83.4684 121.385V124.194L86.3513 125.695C86.8729 125.967 87.4942 125.967 88.0157 125.695L89.7784 124.777C91.2258 124.023 92.9499 124.023 94.3973 124.777L94.6827 124.926C96.1301 125.68 97.8542 125.68 99.3016 124.926L99.587 124.777C101.034 124.023 102.759 124.023 104.206 124.777L104.491 124.926C105.939 125.68 107.663 125.68 109.11 124.926L109.396 124.777C110.843 124.023 112.567 124.023 114.014 124.777L115.777 125.695C116.299 125.967 116.92 125.967 117.442 125.695L120.325 124.194V121.385ZM127.458 132.155C127.258 132.102 127.047 132.073 126.83 132.073H78.183C77.9544 132.073 77.7332 132.105 77.5234 132.164V136.874L81.4307 138.727C82.0716 139.03 82.815 139.03 83.4559 138.727L86.9891 137.052C88.3447 136.409 89.9172 136.409 91.2729 137.052L93.6768 138.191C95.0324 138.834 96.6049 138.834 97.9605 138.191L100.365 137.052C101.72 136.409 103.293 136.409 104.648 137.052L107.052 138.191C108.408 138.834 109.98 138.834 111.336 138.191L113.74 137.052C115.095 136.409 116.668 136.409 118.024 137.052L121.557 138.727C122.198 139.03 122.941 139.03 123.582 138.727L127.458 136.889V132.155Z" fill="#492617"/> -<line x1="95.8389" y1="104.424" x2="95.8389" y2="101.863" stroke="black" stroke-width="0.5"/> -<path d="M95.0215 104.424C95.0215 103.952 95.4037 103.57 95.8751 103.57C96.3466 103.57 96.7288 103.952 96.7288 104.424V110.399H95.0215V104.424Z" fill="#D90034"/> -<path d="M95.876 103.57C96.3474 103.57 96.7296 103.952 96.7296 104.424V110.399H95.876V103.57Z" fill="#950D2E"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M95.0225 104.937V106.073C95.35 105.903 95.6987 105.709 96.0402 105.5C96.2701 105.36 96.5041 105.208 96.7298 105.048V104.423C96.7298 104.233 96.6682 104.059 96.5639 103.917C96.2714 104.159 95.9118 104.407 95.5186 104.647C95.354 104.748 95.1874 104.845 95.0225 104.937ZM96.7298 105.481C96.4127 105.767 95.9898 106.066 95.5186 106.354C95.354 106.455 95.1874 106.552 95.0225 106.644V107.78C95.35 107.61 95.6987 107.416 96.0402 107.207C96.2701 107.067 96.5041 106.915 96.7298 106.755V105.481ZM96.7298 107.189C96.4127 107.475 95.9898 107.774 95.5186 108.062C95.354 108.163 95.1874 108.26 95.0225 108.352V109.488C95.35 109.318 95.6987 109.124 96.0402 108.915C96.2701 108.775 96.5041 108.623 96.7298 108.463V107.189ZM96.7298 108.896C96.4127 109.182 95.9898 109.481 95.5186 109.769C95.354 109.87 95.1874 109.967 95.0225 110.059V110.398H96.3943C96.5071 110.324 96.6194 110.248 96.7298 110.17V108.896Z" fill="#FFCF86"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M95.876 104.421V105.6C95.931 105.567 95.9859 105.534 96.0407 105.501C96.2704 105.36 96.5041 105.208 96.7296 105.048V104.423C96.7296 104.234 96.6681 104.059 96.564 103.917C96.3627 104.084 96.1298 104.253 95.876 104.421ZM96.7296 105.482C96.4951 105.693 96.2028 105.912 95.876 106.128V107.307C95.931 107.274 95.9859 107.241 96.0407 107.208C96.2704 107.067 96.5041 106.915 96.7296 106.755V105.482ZM96.7296 107.19C96.4951 107.401 96.2028 107.619 95.876 107.836V109.015C95.931 108.982 95.9859 108.949 96.0407 108.915C96.2704 108.775 96.5041 108.623 96.7296 108.463V107.19ZM96.7296 108.897C96.4951 109.108 96.2028 109.326 95.876 109.543V110.398H96.3947C96.5074 110.325 96.6195 110.248 96.7296 110.17V108.897Z" fill="#BC9254"/> -<path opacity="0.75" d="M95.0215 104.424C95.0215 103.952 95.4037 103.57 95.8751 103.57C96.3466 103.57 96.7288 103.952 96.7288 104.424V106.131H95.0215V104.424Z" fill="url(#paint4_linear_15162_4926)"/> -<g filter="url(#filter9_f_15162_4926)"> -<g filter="url(#filter10_f_15162_4926)"> -<path d="M96.9227 100.463C97.9225 101.262 97.2891 101.879 96.859 102.132C95.8551 102.722 95.3049 101.873 94.9497 101.139C94.8238 100.879 94.7676 100.395 94.7502 99.8689C94.6928 99.3881 94.6239 98.3484 94.8076 98.0365C94.9684 98.302 95.2967 98.7777 95.7291 99.2851C95.897 99.4821 96.0513 98.294 96.2468 98.4902C96.1375 99.3446 96.697 100.283 96.9227 100.463Z" fill="#DC4F00"/> +<g filter="url(#filter10_f_4070_18371)"> +<path d="M109.297 100.213C110.297 101.012 109.664 101.629 109.234 101.882C108.23 102.472 107.68 101.623 107.324 100.889C107.199 100.629 107.142 100.146 107.125 99.619C107.068 99.1381 106.999 98.0985 107.182 97.7866C107.343 98.0521 107.671 98.5278 108.104 99.0352C108.272 99.2322 108.426 98.0441 108.622 98.2402C108.512 99.0947 109.072 100.033 109.297 100.213Z" fill="#DC4F00"/> </g> -<g filter="url(#filter11_f_15162_4926)"> -<path d="M96.9227 100.463C97.9225 101.262 97.2891 101.879 96.859 102.132C95.8551 102.722 95.3049 101.873 94.9497 101.139C94.8238 100.879 94.7676 100.395 94.7502 99.8689C94.6928 99.3881 94.6239 98.3484 94.8076 98.0365C94.9684 98.302 95.2967 98.7777 95.7291 99.2851C95.897 99.4821 96.0513 98.294 96.2468 98.4902C96.1375 99.3446 96.697 100.283 96.9227 100.463Z" fill="#DC4F00"/> </g> +<g filter="url(#filter11_f_4070_18371)"> +<path d="M109.325 100.744C109.546 101.095 109.006 101.621 108.917 101.7C107.772 102.337 107.315 100.358 107.378 99.5477C107.486 100.472 108.06 101.128 108.333 101.341C108.528 101.461 109.103 100.394 109.325 100.744Z" fill="#FFBC3A"/> </g> -<g filter="url(#filter12_f_15162_4926)"> -<path d="M96.9495 100.995C97.1713 101.345 96.6306 101.871 96.5421 101.95C95.3971 102.587 94.9395 100.608 95.0027 99.7978C95.111 100.722 95.6847 101.379 95.958 101.591C96.1527 101.711 96.7278 100.644 96.9495 100.995Z" fill="#FFBC3A"/> +<line x1="114.19" y1="104.174" x2="114.19" y2="101.613" stroke="black" stroke-width="0.5"/> +<path d="M113.373 104.173C113.373 103.702 113.755 103.32 114.226 103.32C114.698 103.32 115.08 103.702 115.08 104.173V110.149H113.373V104.173Z" fill="#D90034"/> +<path d="M114.227 103.32C114.699 103.32 115.081 103.702 115.081 104.173V110.149H114.227V103.32Z" fill="#950D2E"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M113.373 104.688V105.823C113.701 105.653 114.05 105.46 114.391 105.251C114.621 105.11 114.855 104.959 115.081 104.798V104.173C115.081 103.984 115.019 103.809 114.915 103.667C114.622 103.909 114.263 104.157 113.869 104.398C113.705 104.498 113.538 104.595 113.373 104.688ZM115.081 105.232C114.763 105.517 114.341 105.817 113.869 106.105C113.705 106.205 113.538 106.302 113.373 106.395V107.53C113.701 107.36 114.05 107.167 114.391 106.958C114.621 106.817 114.855 106.666 115.081 106.505V105.232ZM115.081 106.94C114.763 107.225 114.341 107.525 113.869 107.813C113.705 107.913 113.538 108.01 113.373 108.102V109.238C113.701 109.068 114.05 108.875 114.391 108.666C114.621 108.525 114.855 108.374 115.081 108.213V106.94ZM115.081 108.647C114.763 108.932 114.341 109.232 113.869 109.52C113.705 109.62 113.538 109.717 113.373 109.809V110.149H114.745C114.858 110.075 114.97 109.998 115.081 109.92V108.647Z" fill="#FFCF86"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M114.227 104.171V105.35C114.282 105.317 114.336 105.284 114.391 105.251C114.621 105.11 114.855 104.959 115.08 104.798V104.173C115.08 103.984 115.019 103.809 114.915 103.667C114.713 103.834 114.48 104.003 114.227 104.171ZM115.08 105.232C114.846 105.443 114.554 105.662 114.227 105.878V107.057C114.282 107.024 114.336 106.991 114.391 106.958C114.621 106.817 114.855 106.666 115.08 106.505V105.232ZM115.08 106.94C114.846 107.151 114.554 107.369 114.227 107.586V108.765C114.282 108.732 114.336 108.699 114.391 108.666C114.621 108.525 114.855 108.374 115.08 108.213V106.94ZM115.08 108.647C114.846 108.858 114.554 109.076 114.227 109.293V110.149H114.745C114.858 110.075 114.97 109.998 115.08 109.92V108.647Z" fill="#BC9254"/> +<path opacity="0.75" d="M113.373 104.173C113.373 103.702 113.755 103.32 114.226 103.32C114.698 103.32 115.08 103.702 115.08 104.173V105.881H113.373V104.173Z" fill="url(#paint10_linear_4070_18371)"/> +<g filter="url(#filter12_f_4070_18371)"> +<g filter="url(#filter13_f_4070_18371)"> +<path d="M115.274 100.213C116.273 101.012 115.64 101.629 115.21 101.882C114.206 102.472 113.656 101.623 113.301 100.889C113.175 100.629 113.119 100.146 113.101 99.619C113.044 99.1381 112.975 98.0985 113.159 97.7866C113.319 98.0521 113.648 98.5278 114.08 99.0352C114.248 99.2322 114.402 98.0441 114.598 98.2402C114.488 99.0947 115.048 100.033 115.274 100.213Z" fill="#DC4F00"/> </g> -<line x1="101.814" y1="104.424" x2="101.814" y2="101.863" stroke="black" stroke-width="0.5"/> -<path d="M100.997 104.424C100.997 103.952 101.379 103.57 101.851 103.57C102.322 103.57 102.704 103.952 102.704 104.424V110.399H100.997V104.424Z" fill="#D90034"/> -<path d="M101.851 103.57C102.322 103.57 102.704 103.952 102.704 104.424V110.399H101.851V103.57Z" fill="#950D2E"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M100.997 104.938V106.074C101.325 105.904 101.673 105.71 102.015 105.501C102.245 105.361 102.479 105.209 102.704 105.048V104.424C102.704 104.234 102.643 104.059 102.538 103.918C102.246 104.159 101.886 104.408 101.493 104.648C101.329 104.749 101.162 104.846 100.997 104.938ZM102.704 105.482C102.387 105.767 101.964 106.067 101.493 106.355C101.329 106.456 101.162 106.553 100.997 106.645V107.781C101.325 107.611 101.673 107.417 102.015 107.208C102.245 107.068 102.479 106.916 102.704 106.755V105.482ZM102.704 107.19C102.387 107.475 101.964 107.775 101.493 108.063C101.329 108.164 101.162 108.261 100.997 108.353V109.489C101.325 109.318 101.673 109.125 102.015 108.916C102.245 108.776 102.479 108.624 102.704 108.463V107.19ZM102.704 108.897C102.387 109.182 101.964 109.482 101.493 109.77C101.329 109.871 101.162 109.968 100.997 110.06V110.399H102.369C102.482 110.325 102.594 110.249 102.704 110.17V108.897Z" fill="#FFCF86"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M101.852 104.421V105.6C101.906 105.568 101.961 105.535 102.016 105.501C102.246 105.361 102.48 105.209 102.705 105.049V104.424C102.705 104.234 102.644 104.06 102.539 103.918C102.338 104.084 102.105 104.254 101.852 104.421ZM102.705 105.482C102.471 105.694 102.178 105.912 101.852 106.128V107.307C101.906 107.275 101.961 107.242 102.016 107.208C102.246 107.068 102.48 106.916 102.705 106.756V105.482ZM102.705 107.19C102.471 107.401 102.178 107.62 101.852 107.836V109.015C101.906 108.983 101.961 108.95 102.016 108.916C102.246 108.776 102.48 108.624 102.705 108.464V107.19ZM102.705 108.897C102.471 109.108 102.178 109.327 101.852 109.543V110.399H102.37C102.483 110.325 102.595 110.249 102.705 110.171V108.897Z" fill="#BC9254"/> -<path opacity="0.75" d="M100.997 104.424C100.997 103.952 101.379 103.57 101.851 103.57C102.322 103.57 102.704 103.952 102.704 104.424V106.131H100.997V104.424Z" fill="url(#paint5_linear_15162_4926)"/> -<g filter="url(#filter13_f_15162_4926)"> -<g filter="url(#filter14_f_15162_4926)"> -<path d="M102.898 100.464C103.898 101.262 103.265 101.88 102.835 102.133C101.831 102.723 101.281 101.874 100.925 101.14C100.799 100.879 100.743 100.396 100.726 99.8694C100.668 99.3885 100.6 98.3489 100.783 98.037C100.944 98.3025 101.272 98.7782 101.705 99.2856C101.873 99.4826 102.027 98.2945 102.222 98.4906C102.113 99.3451 102.673 100.283 102.898 100.464Z" fill="#DC4F00"/> +<g filter="url(#filter14_f_4070_18371)"> +<path d="M115.274 100.213C116.273 101.012 115.64 101.629 115.21 101.882C114.206 102.472 113.656 101.623 113.301 100.889C113.175 100.629 113.119 100.146 113.101 99.619C113.044 99.1381 112.975 98.0985 113.159 97.7866C113.319 98.0521 113.648 98.5278 114.08 99.0352C114.248 99.2322 114.402 98.0441 114.598 98.2402C114.488 99.0947 115.048 100.033 115.274 100.213Z" fill="#DC4F00"/> </g> -<g filter="url(#filter15_f_15162_4926)"> -<path d="M102.898 100.464C103.898 101.262 103.265 101.88 102.835 102.133C101.831 102.723 101.281 101.874 100.925 101.14C100.799 100.879 100.743 100.396 100.726 99.8694C100.668 99.3885 100.6 98.3489 100.783 98.037C100.944 98.3025 101.272 98.7782 101.705 99.2856C101.873 99.4826 102.027 98.2945 102.222 98.4906C102.113 99.3451 102.673 100.283 102.898 100.464Z" fill="#DC4F00"/> </g> +<g filter="url(#filter15_f_4070_18371)"> +<path d="M115.3 100.744C115.522 101.095 114.981 101.621 114.893 101.7C113.748 102.337 113.29 100.358 113.354 99.5477C113.462 100.472 114.035 101.128 114.309 101.341C114.503 101.461 115.079 100.394 115.3 100.744Z" fill="#FFBC3A"/> </g> -<g filter="url(#filter16_f_15162_4926)"> -<path d="M102.925 100.995C103.147 101.345 102.606 101.871 102.518 101.95C101.373 102.587 100.915 100.608 100.978 99.7978C101.087 100.722 101.66 101.379 101.934 101.591C102.128 101.711 102.703 100.644 102.925 100.995Z" fill="#FFBC3A"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M97.491 109.233H119.132C119.722 109.233 120.201 109.712 120.201 110.302C120.201 110.665 120.016 111.004 119.711 111.2L117.881 112.379C117.484 112.636 116.973 112.636 116.576 112.379L115.742 111.842C114.837 111.259 113.675 111.259 112.77 111.842C111.865 112.426 110.703 112.426 109.798 111.842C108.893 111.259 107.73 111.259 106.825 111.842C105.92 112.426 104.758 112.426 103.853 111.842C102.948 111.259 101.786 111.259 100.881 111.842L100.047 112.379C99.6499 112.636 99.1394 112.636 98.7419 112.379L96.9121 111.2C96.6068 111.004 96.4223 110.665 96.4223 110.302C96.4223 109.712 96.9008 109.233 97.491 109.233ZM126.543 118.745H90.049C89.2922 118.745 88.6786 119.358 88.6786 120.115C88.6786 120.626 88.9629 121.095 89.416 121.331L92.7508 123.067C93.2723 123.339 93.8936 123.339 94.4152 123.067L96.1778 122.149C97.6252 121.396 99.3493 121.396 100.797 122.149L101.082 122.298C102.53 123.052 104.254 123.052 105.701 122.298L105.986 122.149C107.434 121.396 109.158 121.396 110.605 122.149L110.891 122.298C112.338 123.052 114.062 123.052 115.51 122.298L115.795 122.149C117.242 121.396 118.967 121.396 120.414 122.149L122.177 123.067C122.698 123.339 123.319 123.339 123.841 123.067L127.176 121.331C127.629 121.095 127.913 120.626 127.913 120.115C127.913 119.358 127.3 118.745 126.543 118.745ZM133.229 129.445H84.5825C83.2418 129.445 82.155 130.532 82.155 131.873C82.155 132.81 82.6952 133.664 83.5426 134.066L87.8301 136.099C88.471 136.403 89.2144 136.403 89.8553 136.099L93.3885 134.424C94.7442 133.781 96.3167 133.781 97.6723 134.424L100.076 135.563C101.432 136.206 103.004 136.206 104.36 135.563L106.764 134.424C108.12 133.781 109.692 133.781 111.048 134.424L113.452 135.563C114.807 136.206 116.38 136.206 117.735 135.563L120.139 134.424C121.495 133.781 123.067 133.781 124.423 134.424L127.956 136.099C128.597 136.403 129.341 136.403 129.981 136.099L134.269 134.066C135.116 133.664 135.657 132.81 135.657 131.873C135.657 130.532 134.57 129.445 133.229 129.445Z" fill="#EA98E2"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M97.491 109.233H119.132C119.722 109.233 120.201 109.712 120.201 110.302C120.201 110.665 120.016 111.004 119.711 111.2L117.881 112.379C117.484 112.636 116.973 112.636 116.576 112.379L115.742 111.842C114.837 111.259 113.675 111.259 112.77 111.842C111.865 112.426 110.703 112.426 109.798 111.842C108.893 111.259 107.73 111.259 106.825 111.842C105.92 112.426 104.758 112.426 103.853 111.842C102.948 111.259 101.786 111.259 100.881 111.842L100.047 112.379C99.6499 112.636 99.1394 112.636 98.7419 112.379L96.9121 111.2C96.6068 111.004 96.4223 110.665 96.4223 110.302C96.4223 109.712 96.9008 109.233 97.491 109.233ZM126.543 118.745H90.049C89.2922 118.745 88.6786 119.358 88.6786 120.115C88.6786 120.626 88.9629 121.095 89.416 121.331L92.7508 123.067C93.2723 123.339 93.8936 123.339 94.4152 123.067L96.1778 122.149C97.6252 121.396 99.3493 121.396 100.797 122.149L101.082 122.298C102.53 123.052 104.254 123.052 105.701 122.298L105.986 122.149C107.434 121.396 109.158 121.396 110.605 122.149L110.891 122.298C112.338 123.052 114.062 123.052 115.51 122.298L115.795 122.149C117.242 121.396 118.967 121.396 120.414 122.149L122.177 123.067C122.698 123.339 123.319 123.339 123.841 123.067L127.176 121.331C127.629 121.095 127.913 120.626 127.913 120.115C127.913 119.358 127.3 118.745 126.543 118.745ZM133.229 129.445H84.5825C83.2418 129.445 82.155 130.532 82.155 131.873C82.155 132.81 82.6952 133.664 83.5426 134.066L87.8301 136.099C88.471 136.403 89.2144 136.403 89.8553 136.099L93.3885 134.424C94.7442 133.781 96.3167 133.781 97.6723 134.424L100.076 135.563C101.432 136.206 103.004 136.206 104.36 135.563L106.764 134.424C108.12 133.781 109.692 133.781 111.048 134.424L113.452 135.563C114.807 136.206 116.38 136.206 117.735 135.563L120.139 134.424C121.495 133.781 123.067 133.781 124.423 134.424L127.956 136.099C128.597 136.403 129.341 136.403 129.981 136.099L134.269 134.066C135.116 133.664 135.657 132.81 135.657 131.873C135.657 130.532 134.57 129.445 133.229 129.445Z" fill="url(#paint11_linear_4070_18371)" fill-opacity="0.75"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M96.6033 109.707C96.4893 109.877 96.4228 110.081 96.4228 110.301C96.4228 110.664 96.6073 111.003 96.9126 111.199L98.7424 112.378C99.1399 112.635 99.6504 112.635 100.048 112.378L100.881 111.841C101.786 111.258 102.949 111.258 103.854 111.841C104.759 112.425 105.921 112.425 106.826 111.841C107.731 111.258 108.893 111.258 109.798 111.841C110.703 112.425 111.866 112.425 112.771 111.841C113.675 111.258 114.838 111.258 115.743 111.841L116.576 112.378C116.974 112.635 117.484 112.635 117.882 112.378L119.712 111.199C120.017 111.003 120.201 110.664 120.201 110.301C120.201 110.081 120.135 109.877 120.021 109.707C119.941 109.826 119.836 109.93 119.712 110.011L117.882 111.19C117.484 111.446 116.974 111.446 116.576 111.19L115.743 110.653C114.838 110.069 113.675 110.069 112.771 110.653C111.866 111.236 110.703 111.236 109.798 110.653C108.893 110.069 107.731 110.069 106.826 110.653C105.921 111.236 104.759 111.236 103.854 110.653C102.949 110.069 101.786 110.069 100.881 110.653L100.048 111.19C99.6504 111.446 99.1399 111.446 98.7424 111.19L96.9126 110.011C96.7879 109.93 96.6833 109.826 96.6033 109.707ZM88.8147 119.52C88.9408 119.782 89.1493 120.002 89.4165 120.141L92.7512 121.878C93.2728 122.149 93.8941 122.149 94.4156 121.878L96.1783 120.96C97.6257 120.206 99.3498 120.206 100.797 120.96L101.083 121.108C102.53 121.862 104.254 121.862 105.701 121.108L105.987 120.96C107.434 120.206 109.158 120.206 110.606 120.96L110.891 121.108C112.339 121.862 114.063 121.862 115.51 121.108L115.796 120.96C117.243 120.206 118.967 120.206 120.414 120.96L122.177 121.878C122.699 122.149 123.32 122.149 123.842 121.878L127.176 120.141C127.443 120.002 127.652 119.782 127.778 119.52C127.865 119.7 127.914 119.902 127.914 120.115C127.914 120.626 127.629 121.094 127.176 121.33L123.842 123.067C123.32 123.338 122.699 123.338 122.177 123.067L120.414 122.149C118.967 121.395 117.243 121.395 115.796 122.149L115.51 122.297C114.063 123.051 112.339 123.051 110.891 122.297L110.606 122.149C109.158 121.395 107.434 121.395 105.987 122.149L105.701 122.297C104.254 123.051 102.53 123.051 101.083 122.297L100.797 122.149C99.3498 121.395 97.6257 121.395 96.1783 122.149L94.4156 123.067C93.8941 123.338 93.2728 123.338 92.7512 123.067L89.4165 121.33C88.9634 121.094 88.6791 120.626 88.6791 120.115C88.6791 119.902 88.7278 119.7 88.8147 119.52ZM82.2291 131.276C82.4037 131.969 82.8791 132.562 83.5431 132.876L87.8306 134.909C88.4715 135.213 89.2149 135.213 89.8558 134.909L93.389 133.234C94.7446 132.591 96.3172 132.591 97.6728 133.234L100.077 134.374C101.432 135.016 103.005 135.016 104.36 134.374L106.764 133.234C108.12 132.591 109.693 132.591 111.048 133.234L113.452 134.374C114.808 135.016 116.38 135.016 117.736 134.374L120.14 133.234C121.495 132.591 123.068 132.591 124.424 133.234L127.957 134.909C128.598 135.213 129.341 135.213 129.982 134.909L134.269 132.876C134.933 132.562 135.409 131.969 135.584 131.276C135.632 131.467 135.657 131.666 135.657 131.872C135.657 132.809 135.117 133.663 134.269 134.065L129.982 136.098C129.341 136.401 128.598 136.401 127.957 136.098L124.424 134.423C123.068 133.78 121.495 133.78 120.14 134.423L117.736 135.562C116.38 136.205 114.808 136.205 113.452 135.562L111.048 134.423C109.693 133.78 108.12 133.78 106.764 134.423L104.36 135.562C103.005 136.205 101.432 136.205 100.077 135.562L97.6728 134.423C96.3172 133.78 94.7446 133.78 93.389 134.423L89.8558 136.098C89.2149 136.401 88.4715 136.401 87.8306 136.098L83.5431 134.065C82.6957 133.663 82.1555 132.809 82.1555 131.872C82.1555 131.666 82.181 131.467 82.2291 131.276Z" fill="#CD57C1"/> +<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M120.194 110.423H96.4295C96.425 110.383 96.4227 110.343 96.4227 110.302C96.4227 109.712 96.9011 109.233 97.4913 109.233H119.132C119.723 109.233 120.201 109.712 120.201 110.302C120.201 110.343 120.199 110.383 120.194 110.423ZM127.902 119.934H88.6909C88.7798 119.263 89.3541 118.745 90.0493 118.745H126.543C127.238 118.745 127.813 119.263 127.902 119.934ZM135.318 130.634C134.895 129.922 134.118 129.445 133.229 129.445H84.5828C83.6945 129.445 82.9176 129.922 82.4945 130.634H135.318Z" fill="#FFBC3A"/> +<path opacity="0.35" d="M55.4062 96.416C55.4062 95.3114 56.3017 94.416 57.4062 94.416H160.788C161.893 94.416 162.788 95.3114 162.788 96.416V160.573C162.788 163.334 160.55 165.573 157.788 165.573H60.4063C57.6448 165.573 55.4062 163.334 55.4062 160.573V96.416Z" fill="url(#paint12_radial_4070_18371)"/> +<rect x="62.5231" y="150.846" width="93.925" height="2.37785" fill="#1E1E1E"/> +<path opacity="0.4" d="M95.4058 94.7319H109.485L74.2868 168.231H60.2075L95.4058 94.7319Z" fill="white"/> +<path opacity="0.4" d="M122.988 94.7319H129.531L96.8184 168.231H90.2759L122.988 94.7319Z" fill="white"/> +<rect x="70.2509" y="71.188" width="24.9674" height="8.32246" fill="#505050"/> +<path d="M63.928 76.0519C63.928 78.0815 62.2827 79.7268 60.2531 79.7268C58.2234 79.7268 56.5781 78.0815 56.5781 76.0519C56.5781 74.0223 58.2234 72.377 60.2531 72.377C62.2827 72.377 63.928 74.0223 63.928 76.0519Z" fill="#4B4B4B"/> +<path d="M127.404 76.0519C127.404 78.0815 125.759 79.7268 123.729 79.7268C121.7 79.7268 120.055 78.0815 120.055 76.0519C120.055 74.0223 121.7 72.377 123.729 72.377C125.759 72.377 127.404 74.0223 127.404 76.0519Z" fill="#4B4B4B"/> +<path d="M139.933 76.0519C139.933 78.0815 138.287 79.7268 136.258 79.7268C134.228 79.7268 132.583 78.0815 132.583 76.0519C132.583 74.0223 134.228 72.377 136.258 72.377C138.287 72.377 139.933 74.0223 139.933 76.0519Z" fill="#4B4B4B"/> +<path d="M152.46 76.0519C152.46 78.0815 150.815 79.7268 148.786 79.7268C146.756 79.7268 145.111 78.0815 145.111 76.0519C145.111 74.0223 146.756 72.377 148.786 72.377C150.815 72.377 152.46 74.0223 152.46 76.0519Z" fill="#4B4B4B"/> +<path d="M164.989 76.0519C164.989 78.0815 163.343 79.7268 161.314 79.7268C159.284 79.7268 157.639 78.0815 157.639 76.0519C157.639 74.0223 159.284 72.377 161.314 72.377C163.343 72.377 164.989 74.0223 164.989 76.0519Z" fill="#4B4B4B"/> +<path d="M63.3816 75.0206C63.3816 77.0502 61.7363 78.6956 59.7067 78.6956C57.6771 78.6956 56.0317 77.0502 56.0317 75.0206C56.0317 72.991 57.6771 71.3457 59.7067 71.3457C61.7363 71.3457 63.3816 72.991 63.3816 75.0206Z" fill="#838383"/> +<path d="M126.858 75.0206C126.858 77.0502 125.213 78.6956 123.183 78.6956C121.153 78.6956 119.508 77.0502 119.508 75.0206C119.508 72.991 121.153 71.3457 123.183 71.3457C125.213 71.3457 126.858 72.991 126.858 75.0206Z" fill="#838383"/> +<path d="M125.269 73.7151C125.269 74.4297 124.69 75.0089 123.976 75.0089C123.261 75.0089 122.682 74.4297 122.682 73.7151C122.682 73.0006 123.261 72.4214 123.976 72.4214C124.69 72.4214 125.269 73.0006 125.269 73.7151Z" fill="#4B4B4B"/> +<path d="M61.875 73.7151C61.875 74.4297 61.2958 75.0089 60.5812 75.0089C59.8667 75.0089 59.2875 74.4297 59.2875 73.7151C59.2875 73.0006 59.8667 72.4214 60.5812 72.4214C61.2958 72.4214 61.875 73.0006 61.875 73.7151Z" fill="#4B4B4B"/> +<path d="M139.386 75.0206C139.386 77.0502 137.741 78.6956 135.712 78.6956C133.682 78.6956 132.037 77.0502 132.037 75.0206C132.037 72.991 133.682 71.3457 135.712 71.3457C137.741 71.3457 139.386 72.991 139.386 75.0206Z" fill="#838383"/> +<path d="M151.914 75.0206C151.914 77.0502 150.269 78.6956 148.239 78.6956C146.209 78.6956 144.564 77.0502 144.564 75.0206C144.564 72.991 146.209 71.3457 148.239 71.3457C150.269 71.3457 151.914 72.991 151.914 75.0206Z" fill="#838383"/> +<path d="M164.442 75.0206C164.442 77.0502 162.797 78.6956 160.767 78.6956C158.737 78.6956 157.092 77.0502 157.092 75.0206C157.092 72.991 158.737 71.3457 160.767 71.3457C162.797 71.3457 164.442 72.991 164.442 75.0206Z" fill="#838383"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M132.073 75.5357C132.323 73.7502 133.857 72.3764 135.712 72.3764C137.567 72.3764 139.1 73.7505 139.351 75.5362C139.375 75.3678 139.387 75.1956 139.387 75.0206C139.387 72.991 137.741 71.3457 135.712 71.3457C133.682 71.3457 132.037 72.991 132.037 75.0206C132.037 75.1955 132.049 75.3674 132.073 75.5357ZM119.544 75.5359C119.795 73.7504 121.328 72.3765 123.183 72.3765C125.038 72.3765 126.572 73.7506 126.822 75.5364C126.846 75.3679 126.858 75.1958 126.858 75.0209C126.858 72.9913 125.213 71.3459 123.183 71.3459C121.153 71.3459 119.508 72.9913 119.508 75.0209C119.508 75.1957 119.52 75.3676 119.544 75.5359ZM151.878 75.5362C151.902 75.3678 151.914 75.1956 151.914 75.0206C151.914 72.991 150.269 71.3457 148.239 71.3457C146.21 71.3457 144.565 72.991 144.565 75.0206C144.565 75.1955 144.577 75.3674 144.6 75.5358C144.851 73.7503 146.385 72.3764 148.239 72.3764C150.094 72.3764 151.628 73.7505 151.878 75.5362ZM157.128 75.5358C157.379 73.7503 158.913 72.3764 160.767 72.3764C162.622 72.3764 164.156 73.7505 164.407 75.5362C164.43 75.3678 164.442 75.1956 164.442 75.0206C164.442 72.991 162.797 71.3457 160.767 71.3457C158.738 71.3457 157.093 72.991 157.093 75.0206C157.093 75.1955 157.105 75.3674 157.128 75.5358Z" fill="#FF6610" fill-opacity="0.45"/> +<path d="M64.3842 62.4873C64.3842 61.3827 65.2796 60.4873 66.3842 60.4873H100.804C101.909 60.4873 102.804 61.3827 102.804 62.4873V62.9929H64.3842V62.4873Z" fill="#535353"/> +<path d="M117.002 62.4873C117.002 61.3827 117.897 60.4873 119.002 60.4873H160.103C161.208 60.4873 162.103 61.3827 162.103 62.4873V62.9929H117.002V62.4873Z" fill="#535353"/> +<path d="M155.422 202.979C155.422 204.084 154.526 204.979 153.422 204.979L150.74 204.979C149.635 204.979 148.74 204.084 148.74 202.979L148.74 202.473L155.422 202.473L155.422 202.979Z" fill="#828282"/> +<path d="M70.2307 202.979C70.2307 204.084 69.3353 204.979 68.2307 204.979L65.549 204.979C64.4444 204.979 63.549 204.084 63.549 202.979L63.549 202.473L70.2307 202.473L70.2307 202.979Z" fill="#828282"/> +<path d="M55.4062 96.416C55.4062 95.3114 56.3017 94.416 57.4063 94.416H160.788C161.893 94.416 162.788 95.3114 162.788 96.416V163.16C162.788 165.922 160.55 168.16 157.788 168.16H60.4063C57.6448 168.16 55.4062 165.922 55.4062 163.16V96.416Z" stroke="#C7C7C7" stroke-width="2"/> +<path d="M57.4062 93.916C56.0255 93.916 54.9062 95.0353 54.9062 96.416V163.16C54.9062 166.198 57.3687 168.66 60.4063 168.66H157.788C160.826 168.66 163.288 166.198 163.288 163.16V96.416C163.288 95.0353 162.169 93.916 160.788 93.916H57.4062Z" stroke="#5B5B5B"/> +<rect opacity="0.5" x="57.7018" y="89.7192" width="103.566" height="5.01128" rx="2.50564" fill="#24373A" fill-opacity="0.5"/> +<rect x="56.0317" y="88.0493" width="106.907" height="5.01128" rx="2.50564" fill="#C7C7C7"/> +<rect x="56.6998" y="90.5347" width="104.795" height="1.29376" rx="0.646881" fill="#4B4B4B"/> +<path d="M138.207 73.7151C138.207 74.4297 137.628 75.0089 136.913 75.0089C136.199 75.0089 135.62 74.4297 135.62 73.7151C135.62 73.0006 136.199 72.4214 136.913 72.4214C137.628 72.4214 138.207 73.0006 138.207 73.7151Z" fill="#4B4B4B"/> +<path d="M149.851 73.7151C149.851 74.4297 149.272 75.0089 148.557 75.0089C147.843 75.0089 147.264 74.4297 147.264 73.7151C147.264 73.0006 147.843 72.4214 148.557 72.4214C149.272 72.4214 149.851 73.0006 149.851 73.7151Z" fill="#4B4B4B"/> +<path d="M162.788 73.7151C162.788 74.4297 162.209 75.0089 161.495 75.0089C160.78 75.0089 160.201 74.4297 160.201 73.7151C160.201 73.0006 160.78 72.4214 161.495 72.4214C162.209 72.4214 162.788 73.0006 162.788 73.7151Z" fill="#4B4B4B"/> +<path d="M51.8894 90.1934C51.8894 89.0888 52.7848 88.1934 53.8894 88.1934H139.809C140.913 88.1934 141.809 89.0888 141.809 90.1934V145.013C141.809 147.774 139.57 150.013 136.809 150.013H56.8894C54.128 150.013 51.8894 147.774 51.8894 145.013V90.1934Z" fill="white" fill-opacity="0.1"/> +<g filter="url(#filter16_f_4070_18371)"> +<rect x="72.0342" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="77.9788" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="91.0569" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="93.4348" y="74.7554" width="1.18892" height="2.37785" transform="rotate(90 93.4348 74.7554)" fill="#FF0000"/> +<rect x="87.4899" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="87.4899" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="76.79" y="73.5664" width="1.18892" height="2.37785" transform="rotate(90 76.79 73.5664)" fill="#FF0000"/> +<rect x="82.7346" y="73.5664" width="1.18892" height="1.18892" transform="rotate(90 82.7346 73.5664)" fill="#FF0000"/> +<rect x="87.4899" y="72.377" width="1.18892" height="2.37785" transform="rotate(90 87.4899 72.377)" fill="#FF0000"/> +<rect x="76.79" y="75.9438" width="1.18892" height="2.37785" transform="rotate(90 76.79 75.9438)" fill="#FF0000"/> +<rect x="82.7346" y="75.9438" width="1.18892" height="1.18892" transform="rotate(90 82.7346 75.9438)" fill="#FF0000"/> +<rect x="87.4899" y="77.1328" width="1.18892" height="2.37785" transform="rotate(90 87.4899 77.1328)" fill="#FF0000"/> +<rect x="87.4899" y="74.7554" width="1.18892" height="2.37785" transform="rotate(90 87.4899 74.7554)" fill="#FF0000"/> +<rect x="72.0343" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="77.9788" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="93.4348" y="73.5664" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="93.4348" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> </g> -<line x1="107.79" y1="104.424" x2="107.79" y2="101.863" stroke="black" stroke-width="0.5"/> -<path d="M106.973 104.424C106.973 103.952 107.355 103.57 107.826 103.57C108.298 103.57 108.68 103.952 108.68 104.424V110.399H106.973V104.424Z" fill="#D90034"/> -<path d="M107.827 103.57C108.299 103.57 108.681 103.952 108.681 104.424V110.399H107.827V103.57Z" fill="#950D2E"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M106.974 104.938V106.073C107.301 105.903 107.65 105.71 107.991 105.501C108.221 105.36 108.455 105.209 108.681 105.048V104.423C108.681 104.234 108.619 104.059 108.515 103.917C108.223 104.159 107.863 104.407 107.47 104.648C107.305 104.748 107.139 104.845 106.974 104.938ZM108.681 105.482C108.364 105.767 107.941 106.067 107.47 106.355C107.305 106.455 107.139 106.552 106.974 106.645V107.78C107.301 107.61 107.65 107.417 107.991 107.208C108.221 107.067 108.455 106.916 108.681 106.755V105.482ZM108.681 107.19C108.364 107.475 107.941 107.775 107.47 108.063C107.305 108.163 107.139 108.26 106.974 108.352V109.488C107.301 109.318 107.65 109.125 107.991 108.916C108.221 108.775 108.455 108.624 108.681 108.463V107.19ZM108.681 108.897C108.364 109.182 107.941 109.482 107.47 109.77C107.305 109.87 107.139 109.967 106.974 110.059V110.399H108.345C108.458 110.325 108.571 110.248 108.681 110.17V108.897Z" fill="#FFCF86"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M107.827 104.421V105.6C107.882 105.567 107.937 105.534 107.991 105.501C108.221 105.36 108.455 105.209 108.681 105.048V104.423C108.681 104.234 108.619 104.059 108.515 103.918C108.314 104.084 108.081 104.253 107.827 104.421ZM108.681 105.482C108.446 105.693 108.154 105.912 107.827 106.128V107.307C107.882 107.274 107.937 107.241 107.991 107.208C108.221 107.067 108.455 106.916 108.681 106.755V105.482ZM108.681 107.19C108.446 107.401 108.154 107.62 107.827 107.836V109.015C107.882 108.982 107.937 108.949 107.991 108.916C108.221 108.775 108.455 108.624 108.681 108.463V107.19ZM108.681 108.897C108.446 109.108 108.154 109.327 107.827 109.543V110.399H108.345C108.458 110.325 108.571 110.249 108.681 110.17V108.897Z" fill="#BC9254"/> -<path opacity="0.75" d="M106.973 104.424C106.973 103.952 107.355 103.57 107.826 103.57C108.298 103.57 108.68 103.952 108.68 104.424V106.131H106.973V104.424Z" fill="url(#paint6_linear_15162_4926)"/> -<g filter="url(#filter17_f_15162_4926)"> -<g filter="url(#filter18_f_15162_4926)"> -<path d="M108.874 100.464C109.874 101.262 109.24 101.88 108.81 102.133C107.806 102.723 107.256 101.874 106.901 101.14C106.775 100.879 106.719 100.396 106.701 99.8694C106.644 99.3885 106.575 98.3489 106.759 98.037C106.92 98.3025 107.248 98.7782 107.68 99.2856C107.848 99.4826 108.002 98.2945 108.198 98.4906C108.089 99.3451 108.648 100.283 108.874 100.464Z" fill="#DC4F00"/> -</g> -<g filter="url(#filter19_f_15162_4926)"> -<path d="M108.874 100.464C109.874 101.262 109.24 101.88 108.81 102.133C107.806 102.723 107.256 101.874 106.901 101.14C106.775 100.879 106.719 100.396 106.701 99.8694C106.644 99.3885 106.575 98.3489 106.759 98.037C106.92 98.3025 107.248 98.7782 107.68 99.2856C107.848 99.4826 108.002 98.2945 108.198 98.4906C108.089 99.3451 108.648 100.283 108.874 100.464Z" fill="#DC4F00"/> -</g> -</g> -<g filter="url(#filter20_f_15162_4926)"> -<path d="M108.901 100.995C109.122 101.345 108.582 101.871 108.493 101.95C107.348 102.587 106.891 100.608 106.954 99.7978C107.062 100.722 107.636 101.379 107.909 101.591C108.104 101.711 108.679 100.644 108.901 100.995Z" fill="#FFBC3A"/> -</g> -<path fill-rule="evenodd" clip-rule="evenodd" d="M91.0918 109.483H112.733C113.323 109.483 113.802 109.962 113.802 110.552C113.802 110.915 113.617 111.253 113.312 111.45L111.482 112.629C111.085 112.886 110.574 112.886 110.177 112.629L109.343 112.092C108.438 111.509 107.276 111.509 106.371 112.092C105.466 112.676 104.304 112.676 103.399 112.092C102.494 111.509 101.331 111.509 100.426 112.092C99.5213 112.676 98.3589 112.676 97.4539 112.092C96.549 111.509 95.3866 111.509 94.4816 112.092L93.6483 112.629C93.2508 112.886 92.7402 112.886 92.3427 112.629L90.5129 111.45C90.2076 111.253 90.0232 110.915 90.0232 110.552C90.0232 109.962 90.5016 109.483 91.0918 109.483ZM120.144 118.995H83.6498C82.893 118.995 82.2795 119.608 82.2795 120.365C82.2795 120.876 82.5637 121.345 83.0169 121.581L86.3516 123.317C86.8731 123.589 87.4944 123.589 88.016 123.317L89.7787 122.399C91.226 121.646 92.9502 121.646 94.3975 122.399L94.683 122.548C96.1303 123.302 97.8545 123.302 99.3018 122.548L99.5873 122.399C101.035 121.646 102.759 121.646 104.206 122.399L104.492 122.548C105.939 123.302 107.663 123.302 109.11 122.548L109.396 122.399C110.843 121.646 112.567 121.646 114.015 122.399L115.777 123.317C116.299 123.589 116.92 123.589 117.442 123.317L120.777 121.581C121.23 121.345 121.514 120.876 121.514 120.365C121.514 119.608 120.9 118.995 120.144 118.995ZM126.83 129.695H78.1833C76.8427 129.695 75.7559 130.782 75.7559 132.123C75.7559 133.06 76.2961 133.914 77.1435 134.316L81.431 136.349C82.0718 136.652 82.8153 136.652 83.4561 136.349L86.9894 134.674C88.345 134.031 89.9175 134.031 91.2731 134.674L93.6771 135.813C95.0327 136.456 96.6052 136.456 97.9608 135.813L100.365 134.674C101.72 134.031 103.293 134.031 104.649 134.674L107.052 135.813C108.408 136.456 109.981 136.456 111.336 135.813L113.74 134.674C115.096 134.031 116.668 134.031 118.024 134.674L121.557 136.349C122.198 136.652 122.941 136.652 123.582 136.349L127.87 134.316C128.717 133.914 129.257 133.06 129.257 132.123C129.257 130.782 128.171 129.695 126.83 129.695Z" fill="#EA98E2"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M91.0918 109.483H112.733C113.323 109.483 113.802 109.962 113.802 110.552C113.802 110.915 113.617 111.253 113.312 111.45L111.482 112.629C111.085 112.886 110.574 112.886 110.177 112.629L109.343 112.092C108.438 111.509 107.276 111.509 106.371 112.092C105.466 112.676 104.304 112.676 103.399 112.092C102.494 111.509 101.331 111.509 100.426 112.092C99.5213 112.676 98.3589 112.676 97.4539 112.092C96.549 111.509 95.3866 111.509 94.4816 112.092L93.6483 112.629C93.2508 112.886 92.7402 112.886 92.3427 112.629L90.5129 111.45C90.2076 111.253 90.0232 110.915 90.0232 110.552C90.0232 109.962 90.5016 109.483 91.0918 109.483ZM120.144 118.995H83.6498C82.893 118.995 82.2795 119.608 82.2795 120.365C82.2795 120.876 82.5637 121.345 83.0169 121.581L86.3516 123.317C86.8731 123.589 87.4944 123.589 88.016 123.317L89.7787 122.399C91.226 121.646 92.9502 121.646 94.3975 122.399L94.683 122.548C96.1303 123.302 97.8545 123.302 99.3018 122.548L99.5873 122.399C101.035 121.646 102.759 121.646 104.206 122.399L104.492 122.548C105.939 123.302 107.663 123.302 109.11 122.548L109.396 122.399C110.843 121.646 112.567 121.646 114.015 122.399L115.777 123.317C116.299 123.589 116.92 123.589 117.442 123.317L120.777 121.581C121.23 121.345 121.514 120.876 121.514 120.365C121.514 119.608 120.9 118.995 120.144 118.995ZM126.83 129.695H78.1833C76.8427 129.695 75.7559 130.782 75.7559 132.123C75.7559 133.06 76.2961 133.914 77.1435 134.316L81.431 136.349C82.0718 136.652 82.8153 136.652 83.4561 136.349L86.9894 134.674C88.345 134.031 89.9175 134.031 91.2731 134.674L93.6771 135.813C95.0327 136.456 96.6052 136.456 97.9608 135.813L100.365 134.674C101.72 134.031 103.293 134.031 104.649 134.674L107.052 135.813C108.408 136.456 109.981 136.456 111.336 135.813L113.74 134.674C115.096 134.031 116.668 134.031 118.024 134.674L121.557 136.349C122.198 136.652 122.941 136.652 123.582 136.349L127.87 134.316C128.717 133.914 129.257 133.06 129.257 132.123C129.257 130.782 128.171 129.695 126.83 129.695Z" fill="url(#paint7_linear_15162_4926)" fill-opacity="0.75"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M90.2036 109.957C90.0897 110.127 90.0232 110.331 90.0232 110.551C90.0232 110.914 90.2076 111.253 90.5129 111.449L92.3427 112.629C92.7402 112.885 93.2508 112.885 93.6483 112.629L94.4816 112.092C95.3866 111.508 96.549 111.508 97.4539 112.092C98.3589 112.675 99.5213 112.675 100.426 112.092C101.331 111.508 102.494 111.508 103.399 112.092C104.304 112.675 105.466 112.675 106.371 112.092C107.276 111.508 108.438 111.508 109.343 112.092L110.177 112.629C110.574 112.885 111.085 112.885 111.482 112.629L113.312 111.449C113.617 111.253 113.802 110.914 113.802 110.551C113.802 110.331 113.735 110.127 113.621 109.957C113.541 110.076 113.437 110.18 113.312 110.261L111.482 111.44C111.085 111.696 110.574 111.696 110.177 111.44L109.343 110.903C108.438 110.32 107.276 110.32 106.371 110.903C105.466 111.486 104.304 111.486 103.399 110.903C102.494 110.32 101.331 110.32 100.426 110.903C99.5213 111.486 98.3589 111.486 97.4539 110.903C96.549 110.32 95.3866 110.32 94.4816 110.903L93.6483 111.44C93.2508 111.696 92.7402 111.696 92.3427 111.44L90.5129 110.261C90.3882 110.18 90.2837 110.076 90.2036 109.957ZM82.415 119.77C82.5411 120.032 82.7496 120.252 83.0169 120.391L86.3516 122.128C86.8731 122.399 87.4944 122.399 88.016 122.128L89.7787 121.21C91.226 120.456 92.9502 120.456 94.3975 121.21L94.683 121.358C96.1303 122.112 97.8545 122.112 99.3018 121.358L99.5873 121.21C101.035 120.456 102.759 120.456 104.206 121.21L104.492 121.358C105.939 122.112 107.663 122.112 109.11 121.358L109.396 121.21C110.843 120.456 112.567 120.456 114.015 121.21L115.777 122.128C116.299 122.399 116.92 122.399 117.442 122.128L120.777 120.391C121.044 120.252 121.252 120.032 121.378 119.77C121.465 119.95 121.514 120.152 121.514 120.365C121.514 120.876 121.23 121.344 120.777 121.58L117.442 123.317C116.92 123.588 116.299 123.588 115.777 123.317L114.015 122.399C112.567 121.645 110.843 121.645 109.396 122.399L109.11 122.548C107.663 123.301 105.939 123.301 104.492 122.548L104.206 122.399C102.759 121.645 101.035 121.645 99.5873 122.399L99.3018 122.548C97.8545 123.301 96.1303 123.301 94.683 122.548L94.3975 122.399C92.9502 121.645 91.226 121.645 89.7787 122.399L88.016 123.317C87.4944 123.588 86.8731 123.588 86.3516 123.317L83.0169 121.58C82.5637 121.344 82.2795 120.876 82.2795 120.365C82.2795 120.152 82.3282 119.95 82.415 119.77ZM75.8294 131.526C76.0041 132.219 76.4794 132.812 77.1435 133.126L81.431 135.159C82.0718 135.463 82.8153 135.463 83.4561 135.159L86.9894 133.484C88.345 132.841 89.9175 132.841 91.2731 133.484L93.6771 134.624C95.0327 135.266 96.6052 135.266 97.9608 134.624L100.365 133.484C101.72 132.841 103.293 132.841 104.649 133.484L107.052 134.624C108.408 135.266 109.981 135.266 111.336 134.624L113.74 133.484C115.096 132.841 116.668 132.841 118.024 133.484L121.557 135.159C122.198 135.463 122.941 135.463 123.582 135.159L127.87 133.126C128.534 132.812 129.009 132.219 129.184 131.526C129.232 131.717 129.257 131.916 129.257 132.122C129.257 133.06 128.717 133.913 127.87 134.315L123.582 136.348C122.941 136.652 122.198 136.652 121.557 136.348L118.024 134.673C116.668 134.03 115.096 134.03 113.74 134.673L111.336 135.812C109.981 136.455 108.408 136.455 107.052 135.812L104.649 134.673C103.293 134.03 101.72 134.03 100.365 134.673L97.9608 135.812C96.6052 136.455 95.0327 136.455 93.6771 135.812L91.2731 134.673C89.9175 134.03 88.345 134.03 86.9894 134.673L83.4561 136.348C82.8153 136.652 82.0718 136.652 81.431 136.348L77.1435 134.315C76.2961 133.913 75.7559 133.06 75.7559 132.122C75.7559 131.916 75.7814 131.717 75.8294 131.526Z" fill="#CD57C1"/> -<path opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M113.795 110.672H90.0297C90.0252 110.633 90.0229 110.593 90.0229 110.552C90.0229 109.962 90.5013 109.483 91.0915 109.483H112.733C113.323 109.483 113.801 109.962 113.801 110.552C113.801 110.593 113.799 110.633 113.795 110.672ZM121.502 120.184H82.2911C82.38 119.513 82.9543 118.995 83.6495 118.995H120.143C120.839 118.995 121.413 119.513 121.502 120.184ZM128.918 130.884C128.495 130.172 127.718 129.695 126.83 129.695H78.183C77.2947 129.695 76.5178 130.172 76.0947 130.884H128.918Z" fill="#FFBC3A"/> -<path opacity="0.35" d="M49.0068 96.6657C49.0068 95.5611 49.9023 94.6657 51.0068 94.6657H154.389C155.494 94.6657 156.389 95.5611 156.389 96.6657V160.823C156.389 163.584 154.15 165.823 151.389 165.823H54.0068C51.2454 165.823 49.0068 163.584 49.0068 160.823V96.6657Z" fill="url(#paint8_radial_15162_4926)"/> -<rect x="56.124" y="151.095" width="93.925" height="2.37785" fill="#1E1E1E"/> -<path opacity="0.4" d="M89.0059 94.9818H103.085L67.8869 168.48H53.8076L89.0059 94.9818Z" fill="white"/> -<path opacity="0.4" d="M116.588 94.9818H123.131L90.4185 168.48H83.876L116.588 94.9818Z" fill="white"/> -<rect x="63.8516" y="71.4379" width="24.9674" height="8.32246" fill="#505050"/> -<path d="M57.5286 76.3015C57.5286 78.3311 55.8833 79.9765 53.8536 79.9765C51.824 79.9765 50.1787 78.3311 50.1787 76.3015C50.1787 74.2719 51.824 72.6266 53.8536 72.6266C55.8833 72.6266 57.5286 74.2719 57.5286 76.3015Z" fill="#4B4B4B"/> -<path d="M121.005 76.3015C121.005 78.3311 119.36 79.9764 117.33 79.9764C115.301 79.9764 113.655 78.3311 113.655 76.3015C113.655 74.2719 115.301 72.6265 117.33 72.6265C119.36 72.6265 121.005 74.2719 121.005 76.3015Z" fill="#4B4B4B"/> -<path d="M133.533 76.3015C133.533 78.3311 131.888 79.9764 129.859 79.9764C127.829 79.9764 126.184 78.3311 126.184 76.3015C126.184 74.2719 127.829 72.6265 129.859 72.6265C131.888 72.6265 133.533 74.2719 133.533 76.3015Z" fill="#4B4B4B"/> -<path d="M146.061 76.3015C146.061 78.3311 144.415 79.9764 142.386 79.9764C140.356 79.9764 138.711 78.3311 138.711 76.3015C138.711 74.2719 140.356 72.6265 142.386 72.6265C144.415 72.6265 146.061 74.2719 146.061 76.3015Z" fill="#4B4B4B"/> -<path d="M158.589 76.3015C158.589 78.3311 156.944 79.9764 154.914 79.9764C152.885 79.9764 151.239 78.3311 151.239 76.3015C151.239 74.2719 152.885 72.6265 154.914 72.6265C156.944 72.6265 158.589 74.2719 158.589 76.3015Z" fill="#4B4B4B"/> -<path d="M56.9827 75.2706C56.9827 77.3002 55.3374 78.9456 53.3077 78.9456C51.2781 78.9456 49.6328 77.3002 49.6328 75.2706C49.6328 73.241 51.2781 71.5957 53.3077 71.5957C55.3374 71.5957 56.9827 73.241 56.9827 75.2706Z" fill="#838383"/> -<path d="M120.458 75.2706C120.458 77.3002 118.813 78.9456 116.783 78.9456C114.754 78.9456 113.108 77.3002 113.108 75.2706C113.108 73.241 114.754 71.5957 116.783 71.5957C118.813 71.5957 120.458 73.241 120.458 75.2706Z" fill="#838383"/> -<path d="M118.87 73.9648C118.87 74.6794 118.291 75.2586 117.576 75.2586C116.861 75.2586 116.282 74.6794 116.282 73.9648C116.282 73.2503 116.861 72.6711 117.576 72.6711C118.291 72.6711 118.87 73.2503 118.87 73.9648Z" fill="#4B4B4B"/> -<path d="M55.4752 73.9648C55.4752 74.6794 54.896 75.2586 54.1815 75.2586C53.4669 75.2586 52.8877 74.6794 52.8877 73.9648C52.8877 73.2503 53.4669 72.6711 54.1815 72.6711C54.896 72.6711 55.4752 73.2503 55.4752 73.9648Z" fill="#4B4B4B"/> -<path d="M132.987 75.2706C132.987 77.3002 131.341 78.9456 129.312 78.9456C127.282 78.9456 125.637 77.3002 125.637 75.2706C125.637 73.241 127.282 71.5957 129.312 71.5957C131.341 71.5957 132.987 73.241 132.987 75.2706Z" fill="#838383"/> -<path d="M145.515 75.2706C145.515 77.3002 143.87 78.9456 141.84 78.9456C139.81 78.9456 138.165 77.3002 138.165 75.2706C138.165 73.241 139.81 71.5957 141.84 71.5957C143.87 71.5957 145.515 73.241 145.515 75.2706Z" fill="#838383"/> -<path d="M158.042 75.2706C158.042 77.3002 156.397 78.9456 154.367 78.9456C152.338 78.9456 150.692 77.3002 150.692 75.2706C150.692 73.241 152.338 71.5957 154.367 71.5957C156.397 71.5957 158.042 73.241 158.042 75.2706Z" fill="#838383"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M125.673 75.7857C125.924 74.0002 127.458 72.6264 129.312 72.6264C131.167 72.6264 132.701 74.0005 132.951 75.7862C132.975 75.6178 132.987 75.4456 132.987 75.2706C132.987 73.241 131.342 71.5957 129.312 71.5957C127.283 71.5957 125.637 73.241 125.637 75.2706C125.637 75.4455 125.649 75.6174 125.673 75.7857ZM113.144 75.7859C113.395 74.0004 114.929 72.6265 116.783 72.6265C118.638 72.6265 120.172 74.0006 120.422 75.7864C120.446 75.6179 120.458 75.4458 120.458 75.2709C120.458 73.2413 118.813 71.5959 116.783 71.5959C114.754 71.5959 113.108 73.2413 113.108 75.2709C113.108 75.4457 113.121 75.6176 113.144 75.7859ZM145.479 75.7862C145.502 75.6178 145.515 75.4456 145.515 75.2706C145.515 73.241 143.869 71.5957 141.84 71.5957C139.81 71.5957 138.165 73.241 138.165 75.2706C138.165 75.4455 138.177 75.6174 138.201 75.7858C138.451 74.0003 139.985 72.6264 141.84 72.6264C143.695 72.6264 145.228 74.0005 145.479 75.7862ZM150.729 75.7858C150.979 74.0003 152.513 72.6264 154.368 72.6264C156.223 72.6264 157.756 74.0005 158.007 75.7862C158.031 75.6178 158.043 75.4456 158.043 75.2706C158.043 73.241 156.397 71.5957 154.368 71.5957C152.338 71.5957 150.693 73.241 150.693 75.2706C150.693 75.4455 150.705 75.6174 150.729 75.7858Z" fill="#FF6610" fill-opacity="0.45"/> -<path d="M57.9844 62.7372C57.9844 61.6326 58.8798 60.7372 59.9844 60.7372H94.4042C95.5087 60.7372 96.4042 61.6326 96.4042 62.7372V63.2428H57.9844V62.7372Z" fill="#535353"/> -<path d="M110.603 62.7372C110.603 61.6326 111.498 60.7372 112.603 60.7372H153.704C154.809 60.7372 155.704 61.6326 155.704 62.7372V63.2428H110.603V62.7372Z" fill="#535353"/> -<path d="M149.022 203.229C149.022 204.333 148.127 205.229 147.022 205.229L144.341 205.229C143.236 205.229 142.341 204.333 142.341 203.229L142.341 202.723L149.022 202.723L149.022 203.229Z" fill="#828282"/> -<path d="M63.8311 203.229C63.8311 204.333 62.9356 205.229 61.8311 205.229L59.1494 205.229C58.0448 205.229 57.1494 204.333 57.1494 203.229L57.1494 202.723L63.8311 202.723L63.8311 203.229Z" fill="#828282"/> -<path d="M49.0068 96.6657C49.0068 95.5611 49.9023 94.6657 51.0068 94.6657H154.389C155.494 94.6657 156.389 95.5611 156.389 96.6657V163.41C156.389 166.172 154.15 168.41 151.389 168.41H54.0068C51.2454 168.41 49.0068 166.172 49.0068 163.41V96.6657Z" stroke="#C7C7C7" stroke-width="2"/> -<path d="M51.0068 94.1657C49.6261 94.1657 48.5068 95.285 48.5068 96.6657V163.41C48.5068 166.448 50.9693 168.91 54.0068 168.91H151.389C154.427 168.91 156.889 166.448 156.889 163.41V96.6657C156.889 95.285 155.77 94.1657 154.389 94.1657H51.0068Z" stroke="#5B5B5B"/> -<rect opacity="0.5" x="51.3027" y="89.9689" width="103.566" height="5.01128" rx="2.50564" fill="#24373A" fill-opacity="0.5"/> -<rect x="49.6328" y="88.2994" width="106.907" height="5.01128" rx="2.50564" fill="#C7C7C7"/> -<rect x="50.3008" y="90.7845" width="104.795" height="1.29376" rx="0.646881" fill="#4B4B4B"/> -<path d="M131.807 73.9648C131.807 74.6794 131.228 75.2586 130.513 75.2586C129.799 75.2586 129.22 74.6794 129.22 73.9648C129.22 73.2503 129.799 72.6711 130.513 72.6711C131.228 72.6711 131.807 73.2503 131.807 73.9648Z" fill="#4B4B4B"/> -<path d="M143.452 73.9648C143.452 74.6794 142.873 75.2586 142.158 75.2586C141.443 75.2586 140.864 74.6794 140.864 73.9648C140.864 73.2503 141.443 72.6711 142.158 72.6711C142.873 72.6711 143.452 73.2503 143.452 73.9648Z" fill="#4B4B4B"/> -<path d="M156.389 73.9648C156.389 74.6794 155.81 75.2586 155.096 75.2586C154.381 75.2586 153.802 74.6794 153.802 73.9648C153.802 73.2503 154.381 72.6711 155.096 72.6711C155.81 72.6711 156.389 73.2503 156.389 73.9648Z" fill="#4B4B4B"/> -<path d="M45.4902 90.4434C45.4902 89.3389 46.3857 88.4434 47.4902 88.4434H133.41C134.514 88.4434 135.41 89.3389 135.41 90.4434V145.263C135.41 148.024 133.171 150.263 130.41 150.263H50.4902C47.7288 150.263 45.4902 148.024 45.4902 145.263V90.4434Z" fill="white" fill-opacity="0.1"/> -<g filter="url(#filter21_f_15162_4926)"> -<rect x="65.6348" y="72.6266" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="71.5791" y="72.6265" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="84.6572" y="72.6265" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="87.0352" y="75.0049" width="1.18892" height="2.37785" transform="rotate(90 87.0352 75.0049)" fill="#FF0000"/> -<rect x="81.0908" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="81.0908" y="72.6265" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="70.3906" y="73.8162" width="1.18892" height="2.37785" transform="rotate(90 70.3906 73.8162)" fill="#FF0000"/> -<rect x="76.335" y="73.8162" width="1.18892" height="1.18892" transform="rotate(90 76.335 73.8162)" fill="#FF0000"/> -<rect x="81.0908" y="72.6265" width="1.18892" height="2.37785" transform="rotate(90 81.0908 72.6265)" fill="#FF0000"/> -<rect x="70.3906" y="76.1936" width="1.18892" height="2.37785" transform="rotate(90 70.3906 76.1936)" fill="#FF0000"/> -<rect x="76.335" y="76.1936" width="1.18892" height="1.18892" transform="rotate(90 76.335 76.1936)" fill="#FF0000"/> -<rect x="81.0908" y="77.3823" width="1.18892" height="2.37785" transform="rotate(90 81.0908 77.3823)" fill="#FF0000"/> -<rect x="81.0908" y="75.0049" width="1.18892" height="2.37785" transform="rotate(90 81.0908 75.0049)" fill="#FF0000"/> -<rect x="65.6348" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="71.5791" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="87.0352" y="73.8162" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="87.0352" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -</g> -<rect x="65.6348" y="72.6266" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="71.5791" y="72.6265" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="84.6572" y="72.6265" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="87.0352" y="75.0049" width="1.18892" height="2.37785" transform="rotate(90 87.0352 75.0049)" fill="#FF0000"/> -<rect x="81.0908" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="81.0908" y="72.6265" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="70.3906" y="73.8162" width="1.18892" height="2.37785" transform="rotate(90 70.3906 73.8162)" fill="#FF0000"/> -<rect x="76.335" y="73.8162" width="1.18892" height="1.18892" transform="rotate(90 76.335 73.8162)" fill="#FF0000"/> -<rect x="81.0908" y="72.6265" width="1.18892" height="2.37785" transform="rotate(90 81.0908 72.6265)" fill="#FF0000"/> -<rect x="70.3906" y="76.1936" width="1.18892" height="2.37785" transform="rotate(90 70.3906 76.1936)" fill="#FF0000"/> -<rect x="76.335" y="76.1936" width="1.18892" height="1.18892" transform="rotate(90 76.335 76.1936)" fill="#FF0000"/> -<rect x="81.0908" y="77.3823" width="1.18892" height="2.37785" transform="rotate(90 81.0908 77.3823)" fill="#FF0000"/> -<rect x="81.0908" y="75.0049" width="1.18892" height="2.37785" transform="rotate(90 81.0908 75.0049)" fill="#FF0000"/> -<rect x="65.6348" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="71.5791" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="87.0352" y="73.8162" width="1.18892" height="2.37785" fill="#FF0000"/> -<rect x="87.0352" y="76.1936" width="1.18892" height="2.37785" fill="#FF0000"/> -<g filter="url(#filter22_f_15162_4926)"> -<path d="M137.203 24.0335C141.208 28.5278 141.028 30.4361 140.436 30.8284C142.602 30.2425 142.435 26.7255 139.425 23.7155C135.617 19.9081 138.302 16.0665 139.29 13.7073C136.926 15.2767 133.198 19.5391 137.203 24.0335Z" fill="#DC4F00"/> -</g> -<g filter="url(#filter23_f_15162_4926)"> -<path d="M137.203 24.0335C141.208 28.5278 141.028 30.4361 140.436 30.8284C142.602 30.2425 142.435 26.7255 139.425 23.7155C135.617 19.9081 138.302 16.0665 139.29 13.7073C136.926 15.2767 133.198 19.5391 137.203 24.0335Z" fill="#DC4F00"/> -</g> -<path d="M94.0119 37.4596L94.0362 37.4495C93.9635 37.2748 93.9099 37.0674 93.8563 36.8601C92.9113 33.2061 95.0895 29.4919 98.7285 28.5521C99.864 28.2588 101.022 28.2638 102.111 28.5355C102.935 25.3368 105.485 23.8199 108.917 22.9333C113.95 21.6334 118.522 22.1911 119.829 27.2445C119.906 27.2245 120.009 27.1978 120.087 27.1778C125.119 25.878 130.263 28.9452 131.569 33.9986C132.876 39.0519 129.857 44.1997 124.825 45.4995C123.767 45.7728 122.713 45.8514 121.697 45.7545C120.962 48.1284 119.046 50.0884 116.465 50.755C114.091 51.3683 111.705 50.768 109.927 49.3198C109.019 50.4942 107.74 51.4051 106.218 51.7984C103.611 52.4716 100.977 51.5485 99.3233 49.6257C98.6868 50.0389 97.991 50.3292 97.2167 50.5292C93.268 51.5491 89.211 49.1689 88.1789 45.178C87.1277 41.2197 88.8765 38.0879 94.0119 37.4596Z" fill="#4E626F"/> -<path d="M131.858 35.8311C130.824 38.6234 128.906 41.9558 125.812 42.7551C124.754 43.0284 121.243 43.341 120.17 42.0634C120.652 44.1282 118.716 47.3856 116.135 48.0522C113.761 48.6655 110.275 48.3358 108.496 46.8876C107.588 48.062 106.786 49.0979 105.264 49.4912C102.657 50.1644 99.8134 48.735 98.1598 46.8122C97.5233 47.2254 96.321 48.2353 95.5468 48.4353C90.5292 48.9614 89.7825 45.3461 88.7504 41.3552C88.6591 41.0114 88.5936 40.667 88.5528 40.3241C87.9033 41.7982 87.7323 43.4952 88.179 45.1774C89.2111 49.1682 93.2682 51.5484 97.2168 50.5285C97.9911 50.3286 98.6869 50.0383 99.3234 49.625C100.977 51.5478 103.611 52.4709 106.218 51.7977C107.74 51.4044 109.019 50.4936 109.927 49.3192C111.705 50.7673 114.091 51.3676 116.465 50.7544C119.046 50.0878 120.962 48.1277 121.697 45.7538C122.713 45.8507 123.767 45.7722 124.825 45.4989C129.248 44.3564 132.116 40.2417 131.858 35.8311Z" fill="#344550"/> -<path d="M97.2564 34.0265C98.6244 33.4612 99.7651 33.2852 100.748 33.3111C102.495 33.357 104.313 32.9723 105.372 31.5829L105.811 31.0075C106.954 29.5088 109.106 29.2426 110.58 30.4174C111.825 31.4095 113.591 31.385 114.899 30.4786C116.401 29.4382 118.298 28.3202 119.295 28.5058C121.102 28.8425 125.02 29.5869 125.797 31.9841C124.4 30.5767 123.57 30.2294 121.634 30.425C119.74 30.6165 117.176 33.8205 116.199 34.9147C116.639 34.733 118.638 34.3815 120.984 37.77C118.286 36.1233 117.624 35.6634 115.005 37.0048C112.408 38.3345 113.404 41.7077 114.425 43.0693C113.863 42.9562 112.43 41.8569 111.874 40.8441C111.318 39.8313 110.821 38.5753 111.216 38.0094C110.239 37.7226 109.37 38.1509 108.431 40.1957C107.493 42.2404 108.009 41.6645 108.198 43.0536C107.295 41.7008 106.405 38.6166 103.255 38.8828C99.4001 39.2086 97.7965 40.6206 98.0271 43.4594C97.4173 41.9854 97.4347 40.4249 98.4107 39.2019C100.165 37.0033 101.972 37.0469 103.308 37.121C102.166 36.9864 100.46 34.925 99.188 35.1699C96.6451 35.6598 94.8098 37.2381 94.1525 39.2787C94.0902 35.8095 95.278 34.8441 97.2564 34.0265Z" fill="#44555F"/> +<rect x="72.0342" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="77.9788" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="91.0569" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="93.4348" y="74.7554" width="1.18892" height="2.37785" transform="rotate(90 93.4348 74.7554)" fill="#FF0000"/> +<rect x="87.4899" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="87.4899" y="72.377" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="76.79" y="73.5664" width="1.18892" height="2.37785" transform="rotate(90 76.79 73.5664)" fill="#FF0000"/> +<rect x="82.7346" y="73.5664" width="1.18892" height="1.18892" transform="rotate(90 82.7346 73.5664)" fill="#FF0000"/> +<rect x="87.4899" y="72.377" width="1.18892" height="2.37785" transform="rotate(90 87.4899 72.377)" fill="#FF0000"/> +<rect x="76.79" y="75.9438" width="1.18892" height="2.37785" transform="rotate(90 76.79 75.9438)" fill="#FF0000"/> +<rect x="82.7346" y="75.9438" width="1.18892" height="1.18892" transform="rotate(90 82.7346 75.9438)" fill="#FF0000"/> +<rect x="87.4899" y="77.1328" width="1.18892" height="2.37785" transform="rotate(90 87.4899 77.1328)" fill="#FF0000"/> +<rect x="87.4899" y="74.7554" width="1.18892" height="2.37785" transform="rotate(90 87.4899 74.7554)" fill="#FF0000"/> +<rect x="72.0343" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="77.9788" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="93.4348" y="73.5664" width="1.18892" height="2.37785" fill="#FF0000"/> +<rect x="93.4348" y="75.9438" width="1.18892" height="2.37785" fill="#FF0000"/> </g> <defs> -<filter id="filter0_f_15162_4926" x="30.7863" y="80.2104" width="14.0543" height="21.2943" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<filter id="filter1_f_15162_4926" x="30.2461" y="79.6702" width="15.1348" height="22.3748" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<filter id="filter2_f_15162_4926" x="21.2461" y="70.6702" width="33.1348" height="40.3748" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<filter id="filter3_f_15162_4926" x="32.2521" y="88.5669" width="10.4371" height="11.7231" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter0_f_4070_18371" x="33.5" y="33" width="154" height="154" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter4_f_15162_4926" x="41.335" y="-3.18555" width="82.4209" height="91.4741" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter1_f_4070_18371" x="11.5" y="11" width="198" height="198" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter5_f_15162_4926" x="49.335" y="4.81445" width="66.4209" height="75.4741" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter2_f_4070_18371" x="-0.5" y="-1" width="222" height="222" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="2" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter6_f_15162_4926" x="96.5303" y="23.6537" width="53.5098" height="58.3702" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter3_f_4070_18371" x="48.8" y="48.3" width="123.4" height="123.4" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="3.85" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter7_f_15162_4926" x="104.53" y="31.6537" width="37.5098" height="42.3702" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter4_f_4070_18371" x="100.628" y="97.3264" width="3.68723" height="5.21299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter8_f_15162_4926" x="60.4346" y="21.1903" width="79.8643" height="74.7275" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter5_f_4070_18371" x="100.088" y="96.7861" width="4.7677" height="6.29346" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="3.5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter9_f_15162_4926" x="94.2287" y="97.5767" width="3.68711" height="5.21299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter6_f_4070_18371" x="91.088" y="87.7861" width="22.7677" height="24.2935" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter10_f_15162_4926" x="93.6885" y="97.0365" width="4.76758" height="6.29346" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter7_f_4070_18371" x="100.937" y="99.0881" width="2.92515" height="3.1959" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter11_f_15162_4926" x="84.6885" y="88.0365" width="22.7676" height="24.2935" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter8_f_4070_18371" x="106.603" y="97.3269" width="3.68723" height="5.21299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter12_f_15162_4926" x="94.5373" y="99.3381" width="2.92539" height="3.19608" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter9_f_4070_18371" x="106.063" y="96.7866" width="4.7677" height="6.29346" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter13_f_15162_4926" x="100.204" y="97.5772" width="3.68711" height="5.21299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter10_f_4070_18371" x="97.0632" y="87.7866" width="22.7677" height="24.2935" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter14_f_15162_4926" x="99.6641" y="97.037" width="4.76758" height="6.29346" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter11_f_4070_18371" x="106.912" y="99.0881" width="2.92515" height="3.1959" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter15_f_15162_4926" x="90.6641" y="88.037" width="22.7676" height="24.2935" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter12_f_4070_18371" x="112.58" y="97.3269" width="3.68723" height="5.21299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter16_f_15162_4926" x="100.513" y="99.3381" width="2.92539" height="3.19608" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter13_f_4070_18371" x="112.039" y="96.7866" width="4.7677" height="6.29346" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter17_f_15162_4926" x="106.18" y="97.5772" width="3.68711" height="5.21299" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter14_f_4070_18371" x="103.039" y="87.7866" width="22.7677" height="24.2935" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter18_f_15162_4926" x="105.64" y="97.037" width="4.76758" height="6.29346" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter15_f_4070_18371" x="112.888" y="99.0881" width="2.92515" height="3.1959" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter19_f_15162_4926" x="96.6396" y="88.037" width="22.7676" height="24.2935" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<filter id="filter16_f_4070_18371" x="62.0342" y="62.377" width="42.5896" height="25.9448" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> +<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_4070_18371"/> </filter> -<filter id="filter20_f_15162_4926" x="106.488" y="99.3381" width="2.92539" height="3.19608" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.229883" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<filter id="filter21_f_15162_4926" x="55.6348" y="62.6265" width="42.5889" height="25.9449" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<filter id="filter22_f_15162_4926" x="134.436" y="12.7073" width="8.46094" height="19.1212" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="0.5" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<filter id="filter23_f_15162_4926" x="125.436" y="3.70728" width="26.4609" height="37.1212" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> -<feFlood flood-opacity="0" result="BackgroundImageFix"/> -<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> -<feGaussianBlur stdDeviation="5" result="effect1_foregroundBlur_15162_4926"/> -</filter> -<radialGradient id="paint0_radial_15162_4926" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(57.3119 157.635) rotate(-32.3146) scale(116.764 170.013)"> +<radialGradient id="paint0_radial_4070_18371" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(107 106) rotate(-90) scale(69)"> +<stop stop-color="#DC4F00" stop-opacity="0"/> +<stop offset="1" stop-color="#DC4F00"/> +</radialGradient> +<radialGradient id="paint1_radial_4070_18371" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(105.945 104.795) rotate(-90) scale(89.7945)"> +<stop stop-color="#DC4F00" stop-opacity="0"/> +<stop offset="1" stop-color="#DC4F00"/> +</radialGradient> +<radialGradient id="paint2_radial_4070_18371" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(105.37 104.137) rotate(-90) scale(101.137)"> +<stop stop-color="#DC4F00" stop-opacity="0"/> +<stop offset="1" stop-color="#DC4F00"/> +</radialGradient> +<radialGradient id="paint3_radial_4070_18371" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(107.911 107.041) rotate(-90) scale(51.0411)"> +<stop stop-color="#FFBC3A" stop-opacity="0"/> +<stop offset="1" stop-color="#FFBC3A"/> +</radialGradient> +<radialGradient id="paint4_radial_4070_18371" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(63.7113 157.385) rotate(-32.3146) scale(116.764 170.013)"> <stop stop-color="white"/> <stop offset="0.94367" stop-color="#382513" stop-opacity="0.145833"/> <stop offset="1" stop-color="#161616" stop-opacity="0"/> </radialGradient> -<linearGradient id="paint1_linear_15162_4926" x1="103.086" y1="94.9818" x2="103.086" y2="159.293" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint5_linear_4070_18371" x1="109.486" y1="94.7319" x2="109.486" y2="159.043" gradientUnits="userSpaceOnUse"> <stop stop-color="#303030"/> -<stop offset="1" stop-color="#373737" stop-opacity="0.25"/> +<stop offset="1" stop-color="#373737" stop-opacity="0.8"/> </linearGradient> -<linearGradient id="paint2_linear_15162_4926" x1="21.8384" y1="47.4425" x2="167.387" y2="212.397" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint6_linear_4070_18371" x1="28.2377" y1="47.1927" x2="173.786" y2="212.147" gradientUnits="userSpaceOnUse"> <stop offset="0.0781769" stop-color="#818181"/> <stop offset="0.181754" stop-color="#C5C5C5"/> <stop offset="0.320353" stop-color="#818181"/> @@ -331,33 +282,33 @@ <stop offset="0.81279" stop-color="#C5C5C5"/> <stop offset="0.954465" stop-color="#818181"/> </linearGradient> -<linearGradient id="paint3_linear_15162_4926" x1="127.458" y1="144.557" x2="101.302" y2="120.778" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint7_linear_4070_18371" x1="133.858" y1="144.307" x2="107.701" y2="120.528" gradientUnits="userSpaceOnUse"> <stop stop-color="#492617"/> <stop offset="1" stop-color="#5F3929"/> </linearGradient> -<linearGradient id="paint4_linear_15162_4926" x1="95.8751" y1="103.57" x2="95.8751" y2="106.131" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint8_linear_4070_18371" x1="102.275" y1="103.32" x2="102.275" y2="105.881" gradientUnits="userSpaceOnUse"> <stop stop-color="#FF800B"/> <stop offset="1" stop-color="#FF370B" stop-opacity="0"/> </linearGradient> -<linearGradient id="paint5_linear_15162_4926" x1="101.851" y1="103.57" x2="101.851" y2="106.131" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint9_linear_4070_18371" x1="108.25" y1="103.32" x2="108.25" y2="105.881" gradientUnits="userSpaceOnUse"> <stop stop-color="#FF800B"/> <stop offset="1" stop-color="#FF370B" stop-opacity="0"/> </linearGradient> -<linearGradient id="paint6_linear_15162_4926" x1="107.826" y1="103.57" x2="107.826" y2="106.131" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint10_linear_4070_18371" x1="114.226" y1="103.32" x2="114.226" y2="105.881" gradientUnits="userSpaceOnUse"> <stop stop-color="#FF800B"/> <stop offset="1" stop-color="#FF370B" stop-opacity="0"/> </linearGradient> -<linearGradient id="paint7_linear_15162_4926" x1="128.647" y1="133.857" x2="90.007" y2="109.484" gradientUnits="userSpaceOnUse"> +<linearGradient id="paint11_linear_4070_18371" x1="135.046" y1="133.607" x2="96.4062" y2="109.234" gradientUnits="userSpaceOnUse"> <stop stop-color="#CD57C1"/> <stop offset="1" stop-color="#CD57C1" stop-opacity="0"/> </linearGradient> -<radialGradient id="paint8_radial_15162_4926" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(182.228 74.6251) rotate(134.73) scale(156.031 227.186)"> +<radialGradient id="paint12_radial_4070_18371" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(188.627 74.3754) rotate(134.73) scale(156.031 227.186)"> <stop stop-color="#FF7A00"/> <stop offset="0.677083" stop-color="#382513" stop-opacity="0.145833"/> <stop offset="1" stop-color="#161616" stop-opacity="0"/> </radialGradient> -<clipPath id="clip0_15162_4926"> -<rect width="220" height="220" fill="white" transform="translate(0 0.25)"/> +<clipPath id="clip0_4070_18371"> +<rect width="220" height="220" fill="white" transform="translate(0.5)"/> </clipPath> </defs> </svg> diff --git a/src/assets/icons/visu/ecogesture/bullhorn.svg b/src/assets/icons/visu/ecogesture/bullhorn.svg new file mode 100644 index 0000000000000000000000000000000000000000..82947eb3aaf8de314c93b0e42009bc9c03a044a4 --- /dev/null +++ b/src/assets/icons/visu/ecogesture/bullhorn.svg @@ -0,0 +1,61 @@ +<svg width="101" height="100" viewBox="0 0 101 100" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M51.0752 77.0338L56.5748 80.3312L66.2919 67.8889L65.3576 66.2707L61.757 64.3941L51.0752 77.0338Z" fill="#1A1A1A"/> +<path d="M56.5752 80.3307L66.4062 67.463L69.3229 71.892L60.1453 84.0229L56.5752 80.3307Z" fill="#454545"/> +<path d="M56.1189 82.0322L51.0752 77.0332L56.5748 80.3306L60.1449 84.0228L56.1189 82.0322Z" fill="black"/> +<path d="M59.9335 71.1997L64.0817 65.928L64.5071 66.042L63.3112 70.505C63.2094 70.8849 62.8682 71.1513 62.475 71.1577L59.9335 71.1997Z" fill="#976D1B"/> +<path d="M72.3007 72.6903C69.0041 69.6792 62.3257 63.6344 61.9854 63.5432L65.6165 63.6043L76.8743 67.5326L72.3007 72.6903Z" fill="#454545"/> +<path d="M74.9142 69.7431C74.9142 69.7431 62.3257 63.6344 61.9854 63.5432L65.6165 63.6043L76.8743 67.5326L74.9142 69.7431Z" fill="#1A1A1A"/> +<path d="M69.3222 71.8923L72.3 72.6902L63.2609 63.8851L60.7085 63.2012L60.4805 64.052L64.8179 66.582L66.0226 68.0023L67.9015 73.7914L69.3222 71.8923Z" fill="#1A1A1A"/> +<path d="M57.7228 69.2401L59.9332 71.2002L64.0814 65.9286L61.3316 64.2799L57.7228 69.2401Z" fill="#E3B82A"/> +<path d="M72.1668 72.6663L63.8335 64.333L60.5005 63.667V64.0003L63.8338 66.0003L72.1668 72.6663Z" fill="black"/> +<path d="M68.4993 73.0002L69.166 71.9995L66.166 68.0002L68.4993 73.0002Z" fill="black"/> +<path d="M63.8172 49.9C59.5994 65.641 46.6574 75.8499 34.9104 72.7023C23.1634 69.5547 17.0598 54.2425 21.2776 38.5015C25.4954 22.7606 38.4374 12.5516 50.1844 15.6992C61.9314 18.8468 68.035 34.159 63.8172 49.9Z" fill="#454545"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M21.7081 59.2592L54.2527 53.2649L58.9291 60.9265C52.9469 70.0506 43.602 75.0326 34.9113 72.7039C28.705 71.041 24.074 65.9825 21.7081 59.2592Z" fill="#606060"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M21.2388 47.1542L48.6392 50.3927L48.8613 52.7328L21.7399 55.4954L21.2388 47.1542Z" fill="#606060"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M46.4192 15.1413L60.7564 47.7126L60.2084 54.8607L29.2962 23.4115C34.1395 18.0462 40.2983 14.9336 46.4192 15.1413Z" fill="#313131"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M64.806 34.9979L60.7571 47.7132L58.2144 40.1919L50.0262 15.6604C50.079 15.674 50.1317 15.6879 50.1845 15.702C58.0872 17.8196 63.4358 25.4426 64.806 34.9979Z" fill="#313131"/> +<path d="M86.3179 45.8989L71.771 40.6333C75.8727 45.7446 75.9102 50.7092 75.4163 52.5526C74.2732 59.5413 68.2544 63.3998 65.3879 64.4555L72.0802 66.7046L79.9348 69.7211L82.1475 68.8044C91.4465 64.9518 93.6623 52.7817 86.3179 45.8989Z" fill="#E3B82A"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M88.9413 62.779L74.1627 57.2322L73.553 57.5842C71.2215 61.4398 67.4719 63.6884 65.3881 64.4558L72.0804 66.7049L79.935 69.7214L82.1477 68.8047C85.2098 67.5361 87.5038 65.3656 88.9413 62.779Z" fill="#976D1B"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M87.5243 47.1748L72.7402 41.9434C73.3511 42.8453 73.8427 43.7344 74.235 44.594L74.6877 45.0623L89.5604 50.4667C89.0549 49.3084 88.3783 48.1994 87.5243 47.1748Z" fill="#FFD752"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M90.0474 51.7582L74.9395 46.4121C75.0086 46.6277 75.0717 46.8404 75.1291 47.0497L90.2763 52.5538C90.2082 52.2871 90.132 52.0217 90.0474 51.7582Z" fill="#FFD752"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M83.8441 67.9679L69.0577 62.4182C67.681 63.4252 66.3548 64.1006 65.3876 64.4568L72.0799 66.7059L79.9345 69.7224L82.1472 68.8057C82.7421 68.5593 83.3079 68.2788 83.8441 67.9679Z" fill="#5B450C"/> +<path opacity="0.5" d="M90.0867 60.0817C93.0708 50.3207 81.3685 44.1074 71.771 40.6333C75.8727 45.7446 75.9102 50.7092 75.4163 52.5526C74.2732 59.5413 68.2544 63.3998 65.3879 64.4555L72.0802 66.7046L79.9348 69.7211L82.1475 68.8044C86.2265 67.1145 88.9426 63.8242 90.0867 60.0817Z" fill="url(#paint0_linear_13878_3374)"/> +<path d="M72.6223 40.8607C70.5435 39.5438 65.3649 36.6364 64.6843 36.454L62.8524 50.0973L56.6525 63.026L65.3884 64.4549L65.6079 64.3847C75.5737 61.1975 79.2151 48.9853 72.6223 40.8607Z" fill="#7A7A7A"/> +<path d="M72.6221 40.8608C70.5433 39.5439 65.3647 36.6365 64.6841 36.4541L64.5396 38.6951L75.1134 45.1758L74.3365 43.4949C73.8947 42.539 73.3173 41.6518 72.6221 40.8608Z" fill="#9F9F9F"/> +<path d="M75.8732 50.8505C73.7944 49.5336 61.8095 44.8025 61.1289 44.6201L59.7835 54.7462L56.653 63.0261L65.3889 64.455L66.7838 63.8951C72.1409 61.7449 75.7113 56.6208 75.8732 50.8505Z" fill="#444549"/> +<path d="M56.6525 63.025L65.3884 64.4539L65.8387 64.3016C69.4136 63.0927 72.3914 60.5634 74.1628 57.2312L59.783 54.745L56.6525 63.025Z" fill="#1A1A1A"/> +<path opacity="0.5" d="M63.8172 49.9C59.5994 65.641 46.6574 75.8499 34.9104 72.7023C23.1634 69.5547 17.0598 54.2425 21.2776 38.5015C25.4954 22.7606 38.4374 12.5516 50.1844 15.6992C61.9314 18.8468 68.035 34.159 63.8172 49.9Z" fill="url(#paint1_linear_13878_3374)"/> +<path d="M55.7183 61.4086L45.5475 50.0205L48.2831 39.811L62.6408 37.275L63.9312 49.4752L55.7183 61.4086Z" fill="#7A7A7A"/> +<path d="M56.3718 60.6718L46.201 49.2838L46.6875 45.7666L60.9759 53.6986L56.3718 60.6718Z" fill="#444549"/> +<path d="M62.2605 47.2034L47.4857 42.7886L47.9416 41.087L63.264 38.3536L62.2605 47.2034Z" fill="#9F9F9F"/> +<path d="M63.6276 42.0986L47.4849 42.7885L49.103 41.8542L64.0001 39.0068L63.6276 42.0986Z" fill="#BEBEBE"/> +<path d="M51.1687 46.0549C50.4133 48.8742 48.0868 50.7004 45.9723 50.1338C43.8579 49.5672 42.7562 46.8225 43.5116 44.0032C44.267 41.1839 46.5935 39.3577 48.708 39.9243C50.8224 40.4909 51.9241 43.2356 51.1687 46.0549Z" fill="#444549"/> +<path d="M50.3179 45.8269C49.5625 48.6462 47.4265 50.5234 45.5469 50.0198C43.6674 49.5162 42.7562 46.8225 43.5116 44.0032C44.267 41.1839 46.403 39.3067 48.2826 39.8103C50.1621 40.3139 51.0733 43.0077 50.3179 45.8269Z" fill="#BEBEBE"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M50.2164 41.7521C49.8614 41.3286 49.4197 41.0269 48.9054 40.8891C47.0259 40.3855 44.8898 42.2627 44.1344 45.082C43.7334 46.5786 43.802 48.0398 44.2359 49.1568C43.2935 48.0327 42.9629 46.0511 43.5116 44.0032C44.267 41.1839 46.403 39.3067 48.2826 39.8103C49.1643 40.0466 49.833 40.7649 50.2164 41.7521Z" fill="#B0B0B0"/> +<path d="M48.4621 47.2644C47.8259 48.216 46.8549 48.6832 46.2932 48.3077C45.7316 47.9323 45.792 46.8564 46.4282 45.9048C47.0644 44.9531 48.0354 44.486 48.597 44.8614C49.1586 45.2369 49.0982 46.3127 48.4621 47.2644Z" fill="#DDDDDD"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M50.5507 66.3097C55.2925 62.5694 59.2888 56.5907 61.2648 49.2161C63.2408 41.8415 62.7692 34.6656 60.533 29.0555C58.2969 23.4458 54.3849 19.5604 49.5005 18.2516C44.616 16.9428 39.2854 18.3517 34.544 22.0918C29.8023 25.8322 25.806 31.8109 23.83 39.1855C21.8539 46.56 22.3256 53.7359 24.5618 59.346C26.7979 64.9557 30.7098 68.8412 35.5943 70.1499C40.4788 71.4587 45.8094 70.0498 50.5507 66.3097ZM34.9104 72.7023C46.6574 75.8499 59.5994 65.641 63.8172 49.9C68.035 34.159 61.9314 18.8468 50.1844 15.6992C38.4374 12.5516 25.4954 22.7606 21.2776 38.5015C17.0598 54.2425 23.1634 69.5547 34.9104 72.7023Z" fill="#BEBEBE"/> +<path d="M23.2458 54.9485C24.0786 58.9143 25.6708 62.3467 27.8293 64.9751C30.4393 68.1533 33.7649 70.0302 37.3779 70.5043C41.0047 70.9802 44.9457 70.0439 48.7109 67.6246C51.808 65.6345 54.6387 62.7307 56.9278 59.1426C57.1327 58.8214 57.4563 58.5925 57.8294 58.5155C58.9697 58.2804 59.8494 59.4675 59.2269 60.4513C56.744 64.3751 53.6269 67.6066 50.1394 69.8476C45.9294 72.5528 41.3687 73.6931 37.0341 73.1243C32.6994 72.5555 28.7855 70.3032 25.7872 66.6521C23.2961 63.6187 21.5301 59.7329 20.6303 55.3492C20.4014 54.2337 21.599 53.4387 22.5814 54.0145C22.9256 54.2163 23.1638 54.558 23.2458 54.9485Z" fill="#A4A4A4"/> +<path d="M61.954 46.1163C62.9238 40.6463 62.6034 35.1935 61.0611 30.5095C59.2284 24.9434 55.8532 20.977 51.7645 19.0754C47.7078 17.1886 42.9379 17.3262 38.2497 19.7063C34.2198 21.7522 30.5102 25.3366 27.6977 30.0177C27.5035 30.3409 27.1907 30.577 26.8243 30.6659C25.6872 30.9421 24.7661 29.7752 25.3651 28.77C28.402 23.6742 32.4817 19.6712 37.0535 17.3502C42.3749 14.6486 47.9997 14.4102 52.8789 16.6794C57.758 18.9486 61.5583 23.5706 63.571 29.6831C65.3349 35.0401 65.6201 41.2214 64.4158 47.3249C64.224 48.2969 62.9654 48.4828 62.455 47.6337L62.1314 47.0952C61.9549 46.8017 61.8942 46.4535 61.954 46.1163Z" fill="#DDDDDD"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M57.4813 21.1955C58.0012 20.8953 58.6624 20.9887 59.0522 21.4452C60.979 23.7023 62.5189 26.4894 63.5706 29.6835C63.6196 29.8323 63.6675 29.9817 63.7142 30.1318C63.8905 30.6981 63.6387 31.3048 63.125 31.6014C62.3735 32.0353 61.4161 31.627 61.1543 30.7996C61.1236 30.7027 61.0924 30.6061 61.0607 30.5099C60.1255 27.6695 58.7886 25.2457 57.1602 23.3003C56.6102 22.6432 56.7392 21.6239 57.4813 21.1955Z" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M55.8878 63.57C56.1631 64.0468 56.1099 64.6472 55.7402 65.0551C54.0295 66.9427 52.1461 68.5593 50.1402 69.8483C46.4962 72.1898 42.5896 73.3589 38.7941 73.2621C38.0825 73.2439 37.5592 72.6169 37.6094 71.9068C37.6621 71.1623 38.3228 70.6159 39.0691 70.6241C42.2111 70.6586 45.5244 69.6733 48.7117 67.6253C50.4792 66.4895 52.16 65.0562 53.7028 63.3678C54.3194 62.6932 55.4309 62.7785 55.8878 63.57Z" fill="#808080"/> +<path opacity="0.35" d="M61.3541 69.3015L59.911 66.1792L61.3197 64.2971L64.5069 66.0429L63.2599 70.6968C63.2068 70.8952 62.9575 70.9598 62.8147 70.8121L61.3541 69.3015Z" fill="#5B450C"/> +<path d="M59.0522 72.7879L57.7231 69.2402L59.9336 71.2003L62.7139 71.0334L63.5647 71.2614L60.8373 74.634L59.0522 72.7879Z" fill="black"/> +<line x1="4.37175" y1="30.3352" x2="16.8351" y2="34.1284" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="13.9136" y1="22.9175" x2="19.4175" y2="26.5867" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="9.10629" y1="41.6364" x2="15.4698" y2="40.7274" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="60.6811" y1="16.219" x2="61.0525" y2="14.4857" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="64.293" y1="21.2223" x2="70.0555" y2="14.2071" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="24.2178" y1="71.8974" x2="23.0639" y2="72.282" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<line x1="28.5584" y1="73.9936" x2="25.1604" y2="81.2751" stroke="#E3B82A" stroke-width="3" stroke-linecap="round"/> +<defs> +<linearGradient id="paint0_linear_13878_3374" x1="88.4449" y1="46.4689" x2="67.0894" y2="64.9114" gradientUnits="userSpaceOnUse"> +<stop stop-color="#FFD752"/> +<stop offset="0.714248" stop-color="#5B450C"/> +</linearGradient> +<linearGradient id="paint1_linear_13878_3374" x1="38.2733" y1="12.5077" x2="45.9402" y2="77.4815" gradientUnits="userSpaceOnUse"> +<stop stop-color="#25262B"/> +<stop offset="1" stop-color="#60626C"/> +</linearGradient> +</defs> +</svg> + diff --git a/src/assets/icons/visu/egl-logo-white.svg b/src/assets/icons/visu/egl-logo-white.svg deleted file mode 100644 index 5f48da82136bb266dbbfcd95f1df7f699ce7cb1a..0000000000000000000000000000000000000000 --- a/src/assets/icons/visu/egl-logo-white.svg +++ /dev/null @@ -1,25 +0,0 @@ -<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M9.98869 50.3503C9.68579 50.6552 9.24152 50.8189 8.71967 50.8189H7V45.7662H8.71967C9.24152 45.7662 9.68579 45.9299 9.98869 46.2348C10.5105 46.7601 10.4818 47.5336 10.4818 48.2364C10.4818 48.9393 10.5095 49.8261 9.98869 50.3514M9.61458 46.6189C9.35418 46.3493 9.01514 46.2498 8.6272 46.2498H7.53567V50.3375H8.62826C9.0162 50.3375 9.35418 50.238 9.61564 49.9684C9.96106 49.6068 9.94724 48.8548 9.94724 48.2364C9.94724 47.6181 9.96106 46.9805 9.61564 46.6189" fill="#A0A0A0"/> -<path d="M13.2816 50.8607C12.2666 50.8607 11.5332 50.1579 11.5332 49.1501V45.7653H12.0689V49.1073C12.0689 49.8733 12.5482 50.3772 13.2816 50.3772C14.0149 50.3772 14.5017 49.8733 14.5017 49.1073V45.7653H15.0374V49.1501C15.0374 50.1579 14.2966 50.8607 13.2816 50.8607Z" fill="#A0A0A0"/> -<path d="M19.216 50.2798C18.8568 50.6564 18.3838 50.8618 17.8131 50.8618C17.2423 50.8618 16.8119 50.6628 16.459 50.3087C15.952 49.7973 15.9659 49.1662 15.9659 48.2932C15.9659 47.4202 15.952 46.7891 16.459 46.2777C16.8119 45.9225 17.2487 45.7246 17.8131 45.7246C18.5113 45.7246 18.8993 45.9161 19.3499 46.3708L18.6867 47.0383C18.4051 46.7548 18.1999 46.6051 17.8131 46.6051C17.5452 46.6051 17.3263 46.711 17.186 46.8746C16.9957 47.0875 16.9469 47.3218 16.9469 48.2943C16.9469 49.2667 16.9957 49.5074 17.186 49.7203C17.3273 49.884 17.5452 49.9824 17.8131 49.9824C18.1096 49.9824 18.3211 49.8765 18.4827 49.6989C18.6453 49.5213 18.7016 49.2592 18.7016 49.011V48.8335H17.8131V48.0097H19.6815V48.734C19.6815 49.4646 19.5689 49.9118 19.216 50.2809" fill="#A0A0A0"/> -<path d="M23.1494 50.8189L22.1695 48.8034H21.4648V50.8189H20.4849V45.7662H22.4522C23.4746 45.7662 24.0804 46.4691 24.0804 47.3132C24.0804 48.0225 23.65 48.4632 23.1643 48.6397L24.2856 50.8178H23.1505L23.1494 50.8189ZM22.3884 46.6467H21.4648V47.9807H22.3884C22.8189 47.9807 23.1005 47.7036 23.1005 47.3142C23.1005 46.9248 22.8189 46.6478 22.3884 46.6478" fill="#A0A0A0"/> -<path d="M27.8106 50.8189L27.5141 49.9246H25.7306L25.4277 50.8189H24.4053L26.2312 45.7662H26.9997L28.833 50.8189H27.8106ZM26.6404 47.2565L26.0059 49.0944H27.2537L26.6404 47.2565Z" fill="#A0A0A0"/> -<path d="M32.279 50.8189L30.2905 47.7176V50.8189H29.3105V45.7662H30.1853L32.1728 48.8601V45.7662H33.1527V50.8189H32.279Z" fill="#A0A0A0"/> -<path d="M37.3196 50.3364C36.988 50.6702 36.5161 50.8189 35.9943 50.8189H34.1821V45.7662H35.9943C36.5161 45.7662 36.988 45.916 37.3196 46.2487C37.884 46.8168 37.8277 47.5122 37.8277 48.2706C37.8277 49.0291 37.884 49.7684 37.3196 50.3354M36.6362 46.958C36.4672 46.7526 36.2419 46.6456 35.9029 46.6456H35.1631V49.9385H35.9029C36.2408 49.9385 36.4672 49.8315 36.6362 49.6261C36.819 49.3993 36.8477 49.0377 36.8477 48.2706C36.8477 47.5036 36.819 47.1848 36.6362 46.958Z" fill="#A0A0A0"/> -<path d="M38.6865 50.8189V45.7662H39.6665V49.9385H41.9431V50.8189H38.6865Z" fill="#A0A0A0"/> -<path d="M43.9524 48.7467V50.8189H42.9799V48.7467L41.4707 45.7662H42.5357L43.4731 47.8021L44.3967 45.7662H45.4606L43.9524 48.7467Z" fill="#A0A0A0"/> -<path d="M48.8942 50.3076C48.5413 50.6628 48.112 50.8607 47.5402 50.8607C46.9683 50.8607 46.5315 50.6617 46.1797 50.3076C45.6717 49.7963 45.6866 49.1651 45.6866 48.2921C45.6866 47.4191 45.6728 46.788 46.1797 46.2766C46.5326 45.9214 46.9694 45.7235 47.5402 45.7235C48.1109 45.7235 48.5413 45.9225 48.8942 46.2766C49.4022 46.788 49.3948 47.4191 49.3948 48.2921C49.3948 49.1651 49.4022 49.7963 48.8942 50.3076ZM48.1683 46.8725C48.0269 46.7088 47.8091 46.6029 47.5412 46.6029C47.2734 46.6029 47.0481 46.7088 46.9067 46.8725C46.7165 47.0854 46.6676 47.3197 46.6676 48.2921C46.6676 49.2646 46.7165 49.4988 46.9067 49.7117C47.0481 49.8754 47.2734 49.9813 47.5412 49.9813C47.8091 49.9813 48.028 49.8754 48.1683 49.7117C48.3585 49.4988 48.4149 49.2646 48.4149 48.2921C48.4149 47.3197 48.3585 47.0854 48.1683 46.8725Z" fill="#A0A0A0"/> -<path d="M53.2229 50.8189L51.2343 47.7176V50.8189H50.2544V45.7662H51.1291L53.1166 48.8601V45.7662H54.0965V50.8189H53.2229Z" fill="#A0A0A0"/> -<path d="M20.8979 32.9372C20.7417 32.6334 20.5291 32.2943 20.2634 31.9263C20.105 31.7273 19.8925 31.4834 19.6299 31.1988C19.2611 30.8479 18.9954 30.62 18.8211 30.5034C18.5416 30.2927 18.3099 30.1333 18.1143 30.0145C17.7732 29.8081 17.3172 29.6037 16.7581 29.4058C16.028 29.1608 15.2744 29.0314 14.5177 29.0207H14.3721C13.6015 29.0207 12.8182 29.1501 12.0434 29.4058C11.4844 29.6037 11.0284 29.8081 10.6883 30.0145C10.4917 30.1322 10.2547 30.297 9.9847 30.5013C9.8072 30.619 9.5415 30.8479 9.1695 31.202C8.91017 31.4834 8.6976 31.7273 8.53712 31.9284C8.27141 32.2954 8.05884 32.6345 7.90473 32.9362C7.32548 34.0477 7.0332 35.2106 7.0332 36.3916V36.4804C7.0332 37.6797 7.3308 38.8575 7.91748 39.9808C8.10454 40.3274 8.35218 40.6965 8.65403 41.0774C8.92718 41.4315 9.28323 41.7952 9.7158 42.16C9.96132 42.3579 10.1834 42.5227 10.3779 42.65C11.6087 43.447 12.967 43.8514 14.4146 43.8514C15.4891 43.8514 16.5551 43.6117 17.584 43.1378C17.9847 42.9313 18.3811 42.6885 18.7595 42.4146C18.9657 42.2756 19.2144 42.0648 19.495 41.792C19.6841 41.6337 19.7809 41.4732 19.7809 41.317V41.2742C19.7809 41.1833 19.7522 41.0966 19.6958 41.0153L18.7148 40.0129C18.5767 39.8407 18.4268 39.753 18.2716 39.753C18.1622 39.753 18.0548 39.7925 17.956 39.8696L17.9496 39.8749C17.8348 39.9905 17.7136 40.1028 17.5882 40.2098C17.3278 40.4334 17.0855 40.6088 16.8687 40.7318C16.0939 41.1651 15.2787 41.3855 14.4454 41.3855C13.3539 41.3855 12.3548 41.0635 11.4727 40.4269C11.3196 40.3221 11.1071 40.1317 10.8413 39.8631C10.6288 39.6289 10.463 39.4277 10.3503 39.2673C10.0113 38.7602 9.76682 38.2253 9.62015 37.6754H21.2943C21.6057 37.6861 21.7694 37.5213 21.7694 37.2004V35.7005C21.7694 35.5882 21.7492 35.4919 21.7088 35.4149C21.5898 34.573 21.3188 33.7385 20.9 32.9372M14.3731 31.4716C14.5475 31.4716 14.7069 31.4812 14.8631 31.5005C15.3329 31.5486 15.809 31.6663 16.2767 31.8482C17.5117 32.3799 18.4098 33.2689 18.9455 34.4895C19.0401 34.7238 19.1208 34.9656 19.1857 35.2106H9.61802C9.68179 34.9667 9.76257 34.7249 9.85716 34.4906C10.3928 33.2689 11.292 32.3799 12.5259 31.8482C13.1477 31.5978 13.7695 31.4716 14.3721 31.4716" fill="#A0A0A0"/> -<path d="M37.7937 36.4867C37.7937 34.7354 37.2484 33.1542 36.1728 31.7849C35.8508 31.3923 35.4799 31.0189 35.0685 30.6734C34.6944 30.377 34.3479 30.1363 34.0376 29.9609C32.9025 29.3329 31.7025 29.0141 30.4707 29.0141H30.3836C29.2963 29.0141 28.2207 29.2687 27.1876 29.7694C26.9049 29.8967 26.5627 30.101 26.1694 30.3781C25.9218 30.5471 25.6253 30.7964 25.2841 31.1205C25.0024 31.403 24.7888 31.6373 24.6496 31.8181C24.3945 32.1636 24.1862 32.4771 24.0321 32.752C23.3869 33.9127 23.0596 35.1355 23.0596 36.385V36.4728C23.0596 37.5265 23.2923 38.5739 23.7525 39.588C24.3977 40.9349 25.3691 42.0133 26.6403 42.791C27.8232 43.4896 29.088 43.8437 30.3974 43.8437H37.3037C37.3133 43.8437 37.3239 43.8437 37.3335 43.8437C37.4993 43.8437 37.6236 43.7999 37.7012 43.7132C37.7767 43.6287 37.8075 43.5057 37.7926 43.3527V36.4856L37.7937 36.4867ZM35.3598 36.5305V41.3917H30.4271C29.2974 41.3917 28.2494 41.0152 27.313 40.2748C27.1185 40.109 26.8943 39.8833 26.6488 39.6062C25.8835 38.652 25.4945 37.5832 25.4945 36.4268C25.4945 35.8009 25.6157 35.1751 25.8548 34.5685C26.0759 34.0186 26.3958 33.5169 26.805 33.0761L26.8783 33.0013C27.1005 32.768 27.2854 32.5979 27.4257 32.4931C28.3355 31.8095 29.3441 31.4618 30.4261 31.4618C31.3922 31.4618 32.2999 31.7357 33.1214 32.2738C33.334 32.4193 33.5774 32.6151 33.842 32.8526C34.0982 33.1211 34.2735 33.3211 34.3766 33.4634C34.5786 33.7437 34.738 34.0122 34.8539 34.2626C35.1887 34.9269 35.3587 35.6897 35.3587 36.5273" fill="#A0A0A0"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M53.951 29.1362C54.0286 29.2164 54.0658 29.3341 54.0605 29.4838H54.0616V32.1219H51.6266V29.4368C51.6266 29.241 51.7085 29.0067 52.0985 29.0067H53.5737C53.7417 29.0067 53.8681 29.0506 53.951 29.1362ZM51.4746 37.6603C51.3318 38.2213 51.0887 38.7582 50.7477 39.2651C50.6339 39.4277 50.4724 39.6234 50.2577 39.8599C49.9888 40.1305 49.7752 40.321 49.6232 40.4258C48.7421 41.0613 47.7568 41.3833 46.6951 41.3833C45.6333 41.3833 44.648 41.0613 43.7659 40.4247C43.615 40.321 43.4013 40.1305 43.1346 39.862C42.922 39.6277 42.7562 39.4266 42.6435 39.2661C42.06 38.3996 41.7635 37.4475 41.7635 36.4354V29.4528C41.7635 29.256 41.6817 29.0217 41.2905 29.0217H39.8153C39.6463 29.0217 39.5199 29.0656 39.437 29.1511C39.3594 29.2324 39.3232 29.3491 39.3275 29.4967V36.5103C39.3275 37.7021 39.6251 38.8692 40.2118 39.9808C40.3999 40.3284 40.6475 40.6975 40.9483 41.0773C41.2225 41.4325 41.5796 41.7962 42.0101 42.1599C42.2545 42.3568 42.4777 42.5215 42.6733 42.6499C43.9041 43.4469 45.257 43.8513 46.6951 43.8513C48.1331 43.8513 49.4861 43.4469 50.7168 42.6499C50.9124 42.5215 51.1281 42.3621 51.3811 42.1589C51.8105 41.7951 52.1676 41.4314 52.4418 41.0773C52.7437 40.6954 52.9913 40.3263 53.1784 39.9797C53.5714 39.2286 53.8342 38.452 53.9649 37.6603H51.4746Z" fill="#A0A0A0"/> -<path d="M72.9993 37.7876H46.7632V31.9946H72.9993V37.7887V37.7876ZM47.0161 37.533H72.7463V32.2492H47.0161V37.533Z" fill="#A0A0A0"/> -<path d="M48.5164 36.5522C48.4856 36.5522 48.4644 36.5308 48.4644 36.4997V33.0657C48.4644 33.0346 48.4856 33.0132 48.5164 33.0132H49.8811C50.6453 33.0132 51.1055 33.4765 51.1055 34.1526C51.1055 34.8287 50.64 35.2866 49.8811 35.2866H49.2551C49.2338 35.2866 49.2243 35.2973 49.2243 35.3187V36.4987C49.2243 36.5297 49.203 36.5511 49.1722 36.5511H48.5154L48.5164 36.5522ZM50.3456 34.1547C50.3456 33.868 50.1543 33.6755 49.8344 33.6755H49.2551C49.2338 33.6755 49.2243 33.6862 49.2243 33.7065V34.5966C49.2243 34.6169 49.2349 34.6276 49.2551 34.6276H49.8344C50.1543 34.6276 50.3456 34.4404 50.3456 34.1547Z" fill="#A0A0A0"/> -<path d="M51.5767 35.2523V33.0678C51.5767 33.0368 51.5969 33.0154 51.6277 33.0154H52.2845C52.3153 33.0154 52.3366 33.0368 52.3366 33.0678V35.2737C52.3366 35.6952 52.5693 35.9349 52.9265 35.9349C53.2836 35.9349 53.51 35.6952 53.51 35.2737V33.0678C53.51 33.0368 53.5312 33.0154 53.562 33.0154H54.2178C54.2497 33.0154 54.2699 33.0368 54.2699 33.0678V35.2523C54.2699 36.1317 53.7119 36.6099 52.9265 36.6099C52.141 36.6099 51.5777 36.1317 51.5777 35.2523H51.5767Z" fill="#A0A0A0"/> -<path d="M54.9272 33.0665C54.9272 33.0354 54.9485 33.014 54.9793 33.014H56.3493C57.1135 33.014 57.4706 33.3938 57.4706 33.9555C57.4706 34.3406 57.2952 34.5802 57.0625 34.7107V34.7214C57.2952 34.8102 57.5323 35.1012 57.5323 35.5227C57.5323 36.2202 57.072 36.5529 56.3121 36.5529H54.9793C54.9485 36.5529 54.9272 36.5316 54.9272 36.5005V33.0665ZM56.2558 34.4615C56.5459 34.4615 56.716 34.3053 56.716 34.0453C56.716 33.7854 56.5459 33.6345 56.2558 33.6345H55.7191C55.6978 33.6345 55.6882 33.6452 55.6882 33.6655V34.4305C55.6882 34.4508 55.6989 34.4615 55.7191 34.4615H56.2558ZM55.7191 35.9335H56.2983C56.6087 35.9335 56.7734 35.7666 56.7734 35.4917C56.7734 35.2168 56.6076 35.0499 56.2983 35.0499H55.7191C55.6978 35.0499 55.6882 35.0606 55.6882 35.0809V35.9036C55.6882 35.9239 55.6989 35.9346 55.7191 35.9346V35.9335Z" fill="#A0A0A0"/> -<path d="M58.0815 33.0665C58.0815 33.0354 58.1028 33.014 58.1336 33.014H58.7905C58.8213 33.014 58.8425 33.0354 58.8425 33.0665V35.8394C58.8425 35.8608 58.8532 35.8704 58.8734 35.8704H60.424C60.4549 35.8704 60.4761 35.8918 60.4761 35.9228V36.5005C60.4761 36.5316 60.4549 36.5529 60.424 36.5529H58.1347C58.1039 36.5529 58.0826 36.5316 58.0826 36.5005V33.0665H58.0815Z" fill="#A0A0A0"/> -<path d="M60.9248 33.0665C60.9248 33.0354 60.9461 33.014 60.9769 33.014H61.6337C61.6645 33.014 61.6858 33.0354 61.6858 33.0665V36.5005C61.6858 36.5316 61.6645 36.5529 61.6337 36.5529H60.9769C60.9461 36.5529 60.9248 36.5316 60.9248 36.5005V33.0665Z" fill="#A0A0A0"/> -<path d="M64.7935 36.8066C64.7723 36.828 64.7415 36.8323 64.716 36.8066L64.3588 36.4472C64.1516 36.551 63.9093 36.6087 63.6457 36.6087C63.0314 36.6087 62.5446 36.3231 62.3639 35.7507C62.2874 35.5058 62.2661 35.3089 62.2661 34.7826C62.2661 34.2562 62.2874 34.0594 62.3639 33.8144C62.5446 33.2421 63.0314 32.9564 63.6457 32.9564C64.26 32.9564 64.7415 33.2431 64.9275 33.8144C65.005 34.0594 65.0263 34.2562 65.0263 34.7826C65.0263 35.3089 65.005 35.5058 64.9275 35.7507C64.9019 35.8288 64.8711 35.8962 64.8392 35.9647L65.2059 36.3284C65.2272 36.3498 65.2272 36.3809 65.2059 36.4012L64.7935 36.8066ZM63.8317 35.9176L63.6095 35.694C63.5883 35.6727 63.584 35.647 63.6095 35.6213L64.023 35.2265C64.0538 35.2009 64.0793 35.2051 64.0995 35.2265L64.2387 35.3667C64.2547 35.2469 64.26 35.0704 64.26 34.7836C64.26 34.3215 64.2451 34.1439 64.2037 34.0198C64.1261 33.7748 63.9348 33.6293 63.6457 33.6293C63.3566 33.6293 63.1642 33.7748 63.0877 34.0198C63.0462 34.1439 63.0314 34.3215 63.0314 34.7836C63.0314 35.2458 63.0462 35.4234 63.0877 35.5486C63.1642 35.7935 63.3555 35.939 63.6457 35.939C63.7126 35.939 63.7753 35.9337 63.8317 35.9176Z" fill="#A0A0A0"/> -<path d="M65.5908 35.2523V33.0678C65.5908 33.0368 65.611 33.0154 65.6429 33.0154H66.2987C66.3295 33.0154 66.3507 33.0368 66.3507 33.0678V35.2737C66.3507 35.6952 66.5835 35.9349 66.9406 35.9349C67.2977 35.9349 67.5241 35.6952 67.5241 35.2737V33.0678C67.5241 33.0368 67.5443 33.0154 67.5762 33.0154H68.232C68.2638 33.0154 68.284 33.0368 68.284 33.0678V35.2523C68.284 36.1317 67.7261 36.6099 66.9406 36.6099C66.1552 36.6099 65.5919 36.1317 65.5919 35.2523H65.5908Z" fill="#A0A0A0"/> -<path d="M68.9424 33.0665C68.9424 33.0354 68.9636 33.014 68.9945 33.014H71.2477C71.2785 33.014 71.2998 33.0354 71.2998 33.0665V33.6228C71.2998 33.6549 71.2785 33.6752 71.2477 33.6752H69.7331C69.7119 33.6752 69.7023 33.6859 69.7023 33.7062V34.4091C69.7023 34.4305 69.7129 34.4401 69.7331 34.4401H70.9947C71.0255 34.4401 71.0457 34.4615 71.0457 34.4925V35.0445C71.0457 35.0755 71.0255 35.0969 70.9947 35.0969H69.7331C69.7119 35.0969 69.7023 35.1076 69.7023 35.128V35.8608C69.7023 35.8822 69.7129 35.8918 69.7331 35.8918H71.2477C71.2785 35.8918 71.2998 35.9132 71.2998 35.9442V36.5005C71.2998 36.5316 71.2785 36.5529 71.2477 36.5529H68.9945C68.9636 36.5529 68.9424 36.5316 68.9424 36.5005V33.0665Z" fill="#A0A0A0"/> -</svg> diff --git a/src/assets/icons/visu/enedis-logo-white.svg b/src/assets/icons/visu/enedis-logo-white.svg deleted file mode 100644 index 2e93ddf0e692d2733c5414944f2fa1d80954f73d..0000000000000000000000000000000000000000 --- a/src/assets/icons/visu/enedis-logo-white.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M26 16C20.4772 16 16 20.4772 16 26V37H45C46.6569 37 48 35.6569 48 34V32C48 30.3431 46.6569 29 45 29H35C33.3431 29 32 30.3431 32 32V35H25V28C25 24.6863 27.6863 22 31 22H49C52.3137 22 55 24.6863 55 28V38C55 41.3137 52.3137 44 49 44H32V46C32 48.7615 34.2386 51 37 51H64V26C64 20.4772 59.5229 16 54 16H26Z" fill="#E0E0E0"/> -<path d="M63.2141 57.8925C63.1989 57.9284 63.1835 57.9643 63.1679 58H37C30.3726 58 25 52.6274 25 46V44H16V64H54C58.1421 64 61.6961 61.4816 63.2141 57.8925Z" fill="#E0E0E0"/> -</svg> diff --git a/src/assets/icons/visu/enedis-logo.svg b/src/assets/icons/visu/enedis-logo.svg deleted file mode 100644 index 4e0312002a35ad8764d33b7fe8d330bd86ea4974..0000000000000000000000000000000000000000 --- a/src/assets/icons/visu/enedis-logo.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M26 16C20.4772 16 16 20.4772 16 26V37H45C46.6569 37 48 35.6569 48 34V32C48 30.3431 46.6569 29 45 29H35C33.3431 29 32 30.3431 32 32V35H25V28C25 24.6863 27.6863 22 31 22H49C52.3137 22 55 24.6863 55 28V38C55 41.3137 52.3137 44 49 44H32V46C32 48.7615 34.2386 51 37 51H64V26C64 20.4772 59.5229 16 54 16H26Z" fill="black"/> -<path d="M63.2141 57.8925C63.1989 57.9284 63.1835 57.9643 63.1679 58H37C30.3726 58 25 52.6274 25 46V44H16V64H54C58.1421 64 61.6961 61.4816 63.2141 57.8925Z" fill="black"/> -</svg> diff --git a/src/assets/icons/visu/grdf-logo-white.svg b/src/assets/icons/visu/grdf-logo-white.svg deleted file mode 100644 index 65da9c4501419f02721c8dbc35d9e2b9e1e10516..0000000000000000000000000000000000000000 --- a/src/assets/icons/visu/grdf-logo-white.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg width="80" height="80" viewBox="0 0 80 80" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M23.3263 36.7197C24.3672 36.7636 24.5097 37.6053 24.5268 37.8259V42.1903C24.5033 42.2177 24.4795 42.2456 24.4555 42.2738C24.3526 42.3946 24.2455 42.5204 24.1343 42.6335C23.9307 42.8372 23.6054 43.1515 23.4832 43.2571C21.2467 45.1895 18.619 45.8932 16.1679 45.8932C14.1533 45.8932 11.3813 45.3135 9.01992 43.2531C5.01385 39.7429 4.97366 34.122 9.01771 30.6451C9.76686 30.0056 10.0569 29.7666 11.2492 29.15C12.8944 28.2958 14.7593 28 16.2658 28C17.5885 28 19.0367 28.2605 20.1211 28.6684C20.3737 28.7615 20.6589 28.8726 21.0172 29.0608C21.9766 29.5658 23.2355 30.4514 23.8646 31.8514V31.8578H12.0324V38.3987C12.1222 39.5646 12.4007 40.4899 13.1873 41.1404C13.8225 41.6678 14.7929 42.0135 16.2658 42.1494C16.7376 42.1957 17.266 42.2181 17.8528 42.2181L20.4244 42.2127C20.4002 42.2052 20.3027 42.1494 19.9461 41.746C19.5024 41.2385 19.4028 40.3699 19.4028 39.721H19.4006V36.7188L23.3263 36.7197Z" fill="#E0E0E0"/> -<path d="M60.7194 28.0364V36.8039C61.5869 36.156 62.9647 35.9398 65.1229 35.8128L65.118 31.8614H68.5648C70.3774 31.7871 74.4082 31.2961 74.4 28.0364H60.7194Z" fill="#E0E0E0"/> -<path d="M46.0852 52.1797C46.0852 52.4656 45.8259 52.6942 45.5133 52.6942H34.9647C34.6543 52.6942 34.4016 52.4656 34.4016 52.1797V50.7035C34.4016 50.4191 34.6543 50.188 34.9647 50.188H45.5133C45.8259 50.188 46.0852 50.4191 46.0852 50.7035V52.1797Z" fill="#E0E0E0"/> -<path d="M71.1433 35.7125H72.0565C72.0565 35.7125 72.0543 36.3051 72.0543 36.5367C72.0543 38.3571 70.2912 39.2799 66.8224 39.2799H65.1182V42.2951C65.1182 43.3564 64.8397 45.8058 62.196 45.8571H60.7191V41.4404C61.1375 36.3435 68.5562 35.7672 71.1433 35.7125Z" fill="#E0E0E0"/> -<path d="M51.0715 28.0408L41.4746 28.0378V45.8568C44.8196 45.4823 46.0427 44.0454 46.2199 41.9272V31.8593H50.4385C50.4904 31.8624 50.5493 31.8654 50.6085 31.8684C50.7105 31.8735 50.8134 31.8787 50.8827 31.8847C52.884 32.1008 54.1594 32.8967 54.2888 36.5499C54.3036 36.6929 54.2989 36.8537 54.2947 36.9997C54.2928 37.0642 54.291 37.126 54.291 37.1819C54.188 43.1001 49.211 44.9125 46.4539 45.5739L46.4395 45.5784C46.4065 45.5909 46.3829 45.6058 46.3829 45.6362V45.7956C46.3829 45.8279 46.4109 45.8523 46.4395 45.8558L46.4489 45.8568H46.772C50.7907 45.8568 58.8673 44.9728 58.8673 36.9867V36.8407C58.8199 29.9194 55.5239 28.0408 51.0715 28.0408Z" fill="#E0E0E0"/> -<path d="M33.1002 31.8759L30.8318 31.859C30.6871 31.859 30.5462 31.8535 30.402 31.844C27.6063 31.6632 26.0089 29.7353 25.3578 28.7243C25.2086 28.5171 25.0666 28.3044 24.9323 28.0798C24.9323 28.0798 24.9185 28.0365 24.9416 28.0365H31.4296C33.6005 28.0365 34.5049 28.158 35.466 28.4987C35.6927 28.5754 35.9289 28.67 36.1793 28.7751C37.5725 29.3678 38.5165 30.4296 38.8941 31.7917C38.9502 31.9795 38.986 32.1802 39.0168 32.3809C39.0592 32.6454 39.0834 32.9208 39.0834 33.2057C39.0878 35.3239 37.922 36.5316 36.3092 37.3773C36.307 37.3808 36.2806 37.3947 36.2806 37.3947C36.2586 37.4022 36.2586 37.4022 36.2459 37.4117C36.2281 37.4196 36.2123 37.4282 36.1975 37.4364C36.188 37.4416 36.1789 37.4466 36.17 37.451C36.165 37.451 36.1413 37.4669 36.1413 37.4669C35.9531 37.5526 35.7681 37.6054 35.5959 37.6437C35.5688 37.6488 35.5429 37.6551 35.5185 37.6611C35.4973 37.6662 35.4772 37.6712 35.4588 37.6746V33.5025C35.3994 32.2166 34.1488 31.8804 33.4293 31.8804C33.4066 31.8804 33.3831 31.8806 33.3589 31.8808C33.2802 31.8816 33.1941 31.8824 33.1002 31.8759Z" fill="#E0E0E0"/> -<path d="M28.2799 36.7198C27.1868 36.7581 27.0811 37.67 27.0684 37.8488V40.5393H31.1741C31.5201 40.9994 31.8645 41.4549 32.1846 41.8785L32.5486 42.3601C33.0109 42.9623 33.4546 43.5305 33.639 43.7482C33.6516 43.7633 33.6662 43.782 33.6833 43.804C33.9164 44.103 34.6185 45.0036 37.0429 45.5421C37.9298 45.7381 38.9071 45.7964 39.4538 45.829C39.5528 45.8349 39.6383 45.84 39.7059 45.8449L39.9492 45.8559L39.9233 45.8131C39.9233 45.8131 39.4841 45.2622 38.9292 44.3936L38.8083 44.2042C38.0444 43.0071 35.4535 38.9468 34.9562 38.1541C34.5081 37.4394 33.7948 37.1212 33.0649 36.928H33.0577C32.5348 36.7965 31.9607 36.7462 31.5308 36.7262C31.5118 36.7255 31.4932 36.7245 31.4747 36.7234C31.4422 36.7216 31.41 36.7198 31.3767 36.7198H28.2799Z" fill="#E0E0E0"/> -</svg> diff --git a/src/assets/icons/visu/onboarding/partners_consent.svg b/src/assets/icons/visu/onboarding/partners_consent.svg index 754c3387d32cd3624daf9b35a0e8b44ef2195890..84a3f80b2de39d9d8656d9072bb8747718588652 100644 --- a/src/assets/icons/visu/onboarding/partners_consent.svg +++ b/src/assets/icons/visu/onboarding/partners_consent.svg @@ -1,42 +1,302 @@ -<svg width="191" height="142" viewBox="0 0 191 142" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M0 6.3035L98.374 0C105.955 12.2568 116.145 28.4708 117.414 45.7004C120.587 88.7743 110.01 111.012 106.307 126.595L2.11557 135C4.93633 129.747 11.953 116.615 17.4534 101.907C24.329 83.5214 18.5112 56.7315 16.3957 45.1751C14.7032 35.93 4.76003 15.4086 0 6.3035Z" fill="url(#paint0_linear_11182_68748)"/> -<path d="M87.487 111.853C85.9862 111.489 83.5827 110.805 82.2251 111.991C80.5632 113.442 80.6408 115.889 82.1632 117.411C83.6463 118.894 85.4429 119.278 86.6261 117.328C87.3907 116.068 88.6238 114.319 87.611 112.969" stroke="#121212" stroke-width="2" stroke-linecap="round"/> -<path d="M89.7188 108.754C90.9892 112.005 91.8263 115.288 91.8263 118.796" stroke="#121212" stroke-width="2" stroke-linecap="round"/> -<path d="M91.2061 114.085C92.9063 112.551 95.0518 110.648 96.7297 109.029C97.5397 108.248 98.5142 107.36 99.0851 106.35C99.1458 106.243 99.2642 105.903 99.2642 106.027" stroke="#121212" stroke-width="2" stroke-linecap="round"/> -<path d="M93.1895 113.961C94.6129 114.714 95.9659 115.563 97.308 116.454C98.4338 117.202 99.8259 118.01 100.765 119.03C100.884 119.158 100.946 119.379 101 119.54" stroke="#121212" stroke-width="2" stroke-linecap="round"/> -<path d="M65.5996 35.9149C64.2289 36.0203 63.034 35.1133 62.938 33.8641L62.9068 33.4584L68.2142 33.0503C70.0455 32.9096 71.4436 31.4381 71.3164 29.7832L71.1694 27.872C71.0414 26.2064 69.4466 24.9758 67.6044 25.1174L62.9768 25.4731C62.7136 25.4934 62.4614 25.5128 62.2023 25.5864C60.7246 26.0222 59.7671 27.3416 59.8746 28.7403L59.96 29.8507C59.9797 30.107 60.1817 30.2955 60.423 30.277L62.2214 30.1387C62.4516 30.121 62.6334 29.903 62.6137 29.6467L62.5924 29.3691L62.5587 28.9314C62.5144 28.3548 63.0047 27.8446 63.6626 27.794L67.2923 27.5149C67.9393 27.4652 68.5127 27.8937 68.557 28.4702L68.6441 29.602C68.6884 30.1785 68.1981 30.6888 67.5402 30.7394L58.5592 31.4298L58.7398 33.7787L60.253 33.6624L60.2842 34.0681C60.4796 36.6092 62.9518 38.492 65.7919 38.2736L73.4571 37.6844L73.2757 35.3248L65.5996 35.9149Z" fill="#91C21D"/> -<path d="M53.1787 28.5999C54.5494 28.4945 55.7459 29.4228 55.8411 30.6614L56.4493 38.573C56.4666 38.7972 56.6897 38.9734 56.9529 38.9531L58.6526 38.8224C58.9158 38.8022 59.1101 38.6047 59.0921 38.3698L58.4839 30.4582C58.2885 27.9171 55.8264 26.0228 52.9973 26.2403L47.5253 26.661C47.295 26.6787 47.1133 26.8967 47.133 27.153L48.0572 39.1752C48.0769 39.4314 48.2789 39.62 48.5202 39.6014L50.3186 39.4632C50.5488 39.4455 50.7306 39.2274 50.7109 38.9712L49.9328 28.8494L53.1787 28.5999Z" fill="#0063A6"/> -<path d="M38.3204 29.7429L45.2947 29.2068C45.5469 29.1874 45.7413 28.9898 45.724 28.7656L45.605 27.2175C45.5878 26.9933 45.3764 26.8269 45.1133 26.8472L38.0842 27.3875C36.1323 27.5376 34.6412 29.0914 34.7759 30.8424L35.2823 37.4301C35.4169 39.1811 37.117 40.4896 39.0798 40.3387L46.1089 39.7983C46.3611 39.7789 46.5555 39.5814 46.5383 39.3571L46.4193 37.809C46.402 37.5848 46.1797 37.4193 45.9275 37.4387L38.9533 37.9748C38.4379 38.0145 37.9798 37.6523 37.9437 37.1825L37.805 35.3781L41.972 35.0578C42.2242 35.0384 42.4186 34.8408 42.4014 34.6166L42.2848 33.1005C42.2676 32.8763 42.0453 32.7108 41.7931 32.7302L37.6261 33.0505L37.4438 30.6803C37.4077 30.2105 37.805 29.7826 38.3204 29.7429Z" fill="#0063A6"/> -<path d="M100.989 31.0784C100.98 30.961 100.971 30.8435 100.95 30.7163C100.707 29.285 99.0994 28.3131 97.4984 28.4362L93.5178 28.7422L93.4191 28.7498C92.7831 28.7987 92.225 28.2831 92.1733 27.6105L92.106 26.735C92.0583 26.1157 92.579 25.5709 93.2808 25.517L94.849 25.3964L94.8599 25.3956L98.8295 25.0904C99.0379 25.0744 99.2043 24.9434 99.257 24.7675C99.2756 24.7231 99.2723 24.6804 99.2691 24.6377L99.1509 23.1002C99.1336 22.876 98.9105 22.6999 98.6473 22.7201L92.4516 23.1964C90.6532 23.3347 89.2738 24.7617 89.3986 26.3846L89.5398 28.2211C89.6744 29.9721 91.1323 31.2884 92.7991 31.1603L97.1416 30.8264C97.7776 30.7775 98.3357 31.2931 98.3874 31.9658L98.4096 32.254C98.4572 32.8733 97.9365 33.4181 97.2457 33.4712L90.4688 33.9922C90.2604 34.0082 90.094 34.1392 90.0414 34.3151C90.0227 34.3595 90.026 34.4022 90.0293 34.4449L90.1475 35.9824C90.1647 36.2066 90.3878 36.3827 90.651 36.3625L96.1997 35.9359L98.0858 35.7909C99.8842 35.6527 101.231 34.2281 101.106 32.6052L100.989 31.0784Z" fill="#0063A6"/> -<path d="M78.6576 24.2676L72.8896 24.711C72.6593 24.7287 72.4775 24.9468 72.4972 25.203L73.0825 32.8157C73.1022 33.0719 73.3042 33.2604 73.5454 33.2419L75.3438 33.1036C75.5741 33.0859 75.7559 32.8679 75.7362 32.6116L75.297 26.8995L78.5429 26.65C79.9137 26.5446 81.1101 27.4729 81.2054 28.7114L81.5247 32.8647C81.6199 34.1033 80.5457 34.7658 79.175 34.8712L73.2762 35.3354L73.4576 37.695L79.3572 37.2415C82.1864 37.024 84.3644 35.224 84.1682 32.6722L83.8465 28.4869C83.6585 26.0419 81.3881 24.0577 78.6576 24.2676Z" fill="#0063A6"/> -<path d="M88.2869 31.722L87.9545 27.3978C87.9348 27.1415 87.7328 26.953 87.4915 26.9716L85.704 27.109C85.4738 27.1267 85.292 27.3447 85.3117 27.601L85.6441 31.9251L85.9765 36.2493C85.9962 36.5055 86.1983 36.6941 86.4395 36.6755L88.227 36.5381C88.4573 36.5204 88.639 36.3024 88.6193 36.0461L88.2869 31.722Z" fill="#0063A6"/> -<path d="M87.7359 24.5577L87.6957 24.0346C87.676 23.7783 87.474 23.5898 87.2327 23.6083L85.4453 23.7458C85.215 23.7635 85.0332 23.9815 85.0529 24.2377L85.0931 24.7609L85.1637 25.6791C85.1834 25.9354 85.3854 26.1239 85.6267 26.1054L87.4141 25.9679C87.6444 25.9502 87.8262 25.7322 87.8065 25.476L87.7359 24.5577Z" fill="#0063A6"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M60.2359 92.9966C59.3763 93.0107 59.4455 93.2626 59.4182 92.328L61.0402 92.2479C61.0621 92.6911 61.1033 93.1429 61.0493 93.5804L61.0399 93.5809C61.0413 93.6091 61.0337 93.6473 61.0351 93.6756L61.0257 93.6761L61.0276 93.7138L61.0181 93.7143L61.02 93.752L61.0106 93.7525L61.0124 93.7902C60.9747 93.792 60.9977 93.876 60.96 93.8779L60.9614 93.9061L60.952 93.9066L60.9534 93.9349C60.825 94.2059 60.5259 94.4665 60.2778 94.6111C60.2589 94.612 60.2311 94.6228 60.2122 94.6238L60.2127 94.6332L60.175 94.6351L60.1755 94.6445L60.1377 94.6464L60.1382 94.6558L60.1005 94.6577L60.1009 94.6671L60.0632 94.669L60.0637 94.6784L60.0071 94.6812L60.0076 94.6906C59.7831 94.7395 59.4634 94.7742 59.2159 94.7392L59.2154 94.7297L59.1588 94.7325L59.1584 94.7231L59.1018 94.7259L59.1013 94.7165L59.0636 94.7183L59.0631 94.7089L59.0066 94.7117L59.0061 94.7023L58.9778 94.7037L58.9773 94.6942L58.9396 94.6961L58.9391 94.6867L58.9109 94.688L58.9104 94.6786L58.8727 94.6805C58.2066 94.4014 57.8845 93.8123 57.8784 92.924C57.8026 91.9635 57.7527 91.1435 58.4654 90.6451C58.5296 90.6041 58.631 90.5519 58.6951 90.5109L58.7234 90.5095L58.7229 90.5001L58.7607 90.4982L58.7602 90.4888L58.7885 90.4874L58.788 90.4779C59.4006 90.2492 60.2564 90.3487 60.7252 90.8455C60.5365 91.0439 60.368 91.2696 60.1689 91.4496C59.9282 91.1684 59.5157 91.047 59.1436 91.1694L59.144 91.1788L59.1158 91.1802L59.1162 91.1896L59.0785 91.1915L59.079 91.2009L59.0507 91.2023L59.0511 91.2118C58.9026 91.2664 58.8261 91.4403 58.7567 91.5666L58.7586 91.6043L58.7491 91.6048L58.7519 91.6614L58.7425 91.6619L58.7458 91.7279L58.7363 91.7283L58.741 91.8226L58.7316 91.8231C58.7324 92.031 58.7341 92.2578 58.7547 92.4837L58.7453 92.4841C58.7823 92.851 58.783 93.248 58.8653 93.5748L58.8748 93.5743L58.8766 93.6121C58.9586 93.7404 59.0707 93.905 59.2338 93.9537L59.2343 93.9631L59.272 93.9612L59.2725 93.9706L59.3102 93.9688L59.3107 93.9782L59.3484 93.9764L59.3488 93.9858L59.4148 93.9825C59.9405 94.0984 60.3251 93.654 60.2359 92.9966ZM54.3431 90.6313C54.4443 91.7229 54.344 92.9473 54.5942 93.9937C54.6315 93.9824 54.6069 94.0593 54.6347 94.0484L54.6361 94.0767L54.6456 94.0763C54.7416 94.2984 55.0272 94.5301 55.3308 94.5529L55.3313 94.5623L55.3973 94.5591L55.3978 94.5685L55.5769 94.5596L55.5774 94.5691C55.6057 94.5677 55.6052 94.5582 55.6052 94.5582L55.7844 94.5494L55.784 94.54L55.8688 94.5358L55.8684 94.5263L55.9249 94.5236L55.9245 94.5141L55.9622 94.5123L55.9617 94.5028L55.9994 94.501L55.999 94.4915L56.0367 94.4897C56.2485 94.3752 56.4372 94.1768 56.5302 93.9548L56.5284 93.9171L56.5378 93.9166L56.5364 93.8883L56.5458 93.8879L56.544 93.8502C56.6738 92.8417 56.443 91.6147 56.4474 90.5557L56.9095 90.5329L57.0613 93.6072L57.0519 93.6076L57.0575 93.7208L57.0481 93.7213L57.0523 93.8061L57.0428 93.8066L57.0456 93.8632L57.0362 93.8637L57.039 93.9202L57.0296 93.9207L57.0314 93.9584L57.022 93.9589L57.0239 93.9966L57.0144 93.9971L57.0163 94.0348C56.9781 94.0272 57.0101 94.1013 56.9814 94.0932L56.9832 94.131L56.9738 94.1314L56.9752 94.1597L56.9658 94.1602C56.9681 94.2073 56.9039 94.2483 56.9063 94.2955L56.8968 94.2959C56.8293 94.46 56.6567 94.6009 56.5298 94.7111C56.4736 94.7233 56.4203 94.7921 56.3736 94.8039L56.3741 94.8133L56.3364 94.8152C56.3477 94.8524 56.2708 94.8279 56.2817 94.8557L56.2439 94.8576L56.2444 94.867L56.2067 94.8689L56.2071 94.8783L56.1694 94.8802L56.1699 94.8896L56.1322 94.8914L56.1326 94.9009L56.0761 94.9037L56.0765 94.9131L56.0105 94.9164L56.011 94.9258L55.945 94.9291L55.9454 94.9385L55.8323 94.9441C55.7035 95.0166 55.4447 94.9443 55.2943 94.9612L55.2938 94.9518C55.2561 94.9536 55.2179 94.9461 55.1802 94.9479L55.1797 94.9385L55.142 94.9403L55.1415 94.9309L55.1038 94.9328L55.1033 94.9233L55.0656 94.9252L55.0651 94.9158L55.0274 94.9176C55.035 94.8795 54.9609 94.9115 54.969 94.8827C54.6814 94.8024 54.4425 94.5589 54.28 94.3306L54.2786 94.3023C54.2409 94.3042 54.2555 94.2184 54.2178 94.2203L54.216 94.1825L54.2065 94.183L54.2051 94.1547L54.1957 94.1552C54.1844 94.1179 54.1726 94.0712 54.1614 94.034L54.1519 94.0345C53.9673 92.9753 54.0218 91.7815 53.93 90.6895C53.9739 90.6211 54.2111 90.6378 54.3431 90.6313ZM69.3184 89.8917C69.5744 89.9074 69.9093 89.7964 70.1124 89.8903C70.135 89.9648 70.2227 90.0172 70.2457 90.1012C70.3056 90.1644 70.3664 90.2465 70.4083 90.3295C70.4681 90.3927 70.5289 90.4748 70.5708 90.5578C70.6306 90.621 70.6914 90.7031 70.7333 90.7861C70.8436 90.913 70.9449 91.0498 71.0278 91.1969C71.0876 91.2602 71.1484 91.3422 71.1903 91.4253C71.2501 91.4885 71.3109 91.5706 71.3528 91.6536C71.5728 91.8979 71.7094 92.1748 71.9403 92.447L71.8085 89.7782L72.6572 89.7363L72.8724 94.0931C72.3613 94.0805 72.1169 94.3006 71.8843 93.8016C71.774 93.6747 71.6727 93.5379 71.5898 93.3907C71.4796 93.2638 71.3783 93.127 71.2954 92.9799C71.1852 92.853 71.0839 92.7162 71.001 92.569C70.7301 92.2515 70.5318 91.8737 70.2519 91.5661L70.3828 94.216L69.534 94.258L69.3184 89.8917ZM77.4662 89.4894L78.3149 89.4474L78.4933 93.0592L80.4737 92.9614L80.5109 93.7159L77.6818 93.8556L77.4662 89.4894ZM79.8898 89.3697C80.109 89.4061 80.8263 89.1911 80.8672 89.4443L80.8766 89.4438L80.878 89.4721L80.8874 89.4716L80.8888 89.4999C80.9374 89.5259 80.9434 89.6485 80.992 89.6745L80.9938 89.7122C81.0316 89.7103 81.0169 89.7961 81.0546 89.7943L81.056 89.8225L81.0655 89.8221L81.0668 89.8504L81.0763 89.8499L81.0781 89.8876C81.1159 89.8858 81.1012 89.9716 81.1389 89.9697L81.1403 89.998C81.1776 89.9867 81.153 90.0635 81.1808 90.0527L81.1827 90.0904C81.2204 90.0886 81.2057 90.1744 81.2435 90.1725L81.2449 90.2008L81.2543 90.2003L81.2557 90.2286L81.2651 90.2282L81.267 90.2659C81.3151 90.2824 81.3103 90.3772 81.3584 90.3937L81.3598 90.422L81.3692 90.4215L81.3711 90.4593C81.4088 90.4574 81.3941 90.5432 81.4318 90.5413L81.4332 90.5696L81.4427 90.5692L81.4441 90.5975L81.4535 90.597L81.4554 90.6347C81.4931 90.6329 81.4784 90.7187 81.5161 90.7168L81.5175 90.7451L81.5269 90.7446L81.5283 90.7729L81.5378 90.7724L81.5396 90.8102L81.5491 90.8097C81.5627 90.8941 81.6405 90.9375 81.655 91.0408L81.6833 91.0394C81.6885 90.9541 81.7437 90.923 81.74 90.8475L81.7494 90.8471L81.748 90.8188L81.7575 90.8183L81.7561 90.79L81.7655 90.7896L81.7641 90.7613L81.7735 90.7608L81.7721 90.7325L81.7816 90.732L81.7802 90.7038L81.7896 90.7033L81.7877 90.6656C81.8255 90.6637 81.8024 90.5798 81.8401 90.5779L81.8387 90.5496C81.8854 90.5379 81.8614 90.435 81.8987 90.4238L81.8973 90.3955L81.9067 90.395C81.9058 90.3761 81.9138 90.3474 81.9129 90.3285C81.9506 90.3267 81.9276 90.2427 81.9653 90.2409L81.9634 90.2031C82.0011 90.2013 81.9781 90.1173 82.0158 90.1155L82.0144 90.0872L82.0238 90.0867L82.0225 90.0584L82.0319 90.0579L82.03 90.0202C82.0677 90.0184 82.0447 89.9344 82.0824 89.9326L82.081 89.9043L82.0904 89.9038C82.0895 89.8849 82.0975 89.8562 82.0966 89.8373C82.1343 89.8355 82.1113 89.7515 82.149 89.7497L82.1471 89.7119C82.1849 89.7101 82.1618 89.6261 82.1995 89.6243L82.1981 89.596L82.2076 89.5955L82.2057 89.5578C82.2434 89.5559 82.2204 89.472 82.2581 89.4701L82.2567 89.4418L82.2661 89.4414L82.2647 89.4131L82.2742 89.4126L82.2723 89.3749C82.3006 89.3735 82.3139 89.2594 82.3323 89.249L83.247 89.2039C83.1813 89.4056 83.0676 89.5909 83.001 89.7738L82.9916 89.7742L82.993 89.8025L82.9835 89.803L82.9849 89.8313C82.9467 89.8237 82.9787 89.8977 82.95 89.8897L82.9514 89.918C82.9132 89.9104 82.9452 89.9845 82.9165 89.9765L82.9179 90.0047L82.9084 90.0052L82.9098 90.0335L82.9004 90.034L82.9018 90.0623L82.8924 90.0627L82.8938 90.091L82.8843 90.0915L82.8857 90.1198C82.8244 90.2173 82.7569 90.3814 82.7153 90.4969L82.7059 90.4973L82.7073 90.5256C82.67 90.5369 82.6836 90.6213 82.6468 90.642L82.6482 90.6703L82.6388 90.6708L82.6402 90.6991L82.6308 90.6996L82.6322 90.7279L82.6227 90.7283L82.6241 90.7566L82.6147 90.7571L82.6161 90.7854C82.5703 90.816 82.5755 90.9197 82.5297 90.9503L82.5311 90.9786L82.5217 90.9791L82.5231 91.0074L82.5136 91.0079L82.515 91.0361L82.5056 91.0366L82.507 91.0649C82.4891 91.0847 82.4631 91.1332 82.4551 91.162C82.4367 91.1724 82.4188 91.1921 82.4296 91.22L82.4202 91.2204L82.4216 91.2487C82.3668 91.2892 82.3724 91.4024 82.3177 91.4429L82.3191 91.4712L82.3097 91.4717L82.3111 91.5L82.3016 91.5004L82.303 91.5287L82.2936 91.5292L82.295 91.5575C82.2573 91.5593 82.2803 91.6433 82.2426 91.6452L82.244 91.6734L82.2346 91.6739L82.236 91.7022L82.2265 91.7027L82.2279 91.731L82.2185 91.7314L82.2199 91.7597C82.1817 91.7521 82.2137 91.8262 82.185 91.8182L82.1864 91.8464L82.1769 91.8469L82.1783 91.8752L82.1689 91.8757L82.2565 93.6486L81.4266 93.6896L81.339 91.9167L81.3296 91.9171C81.3278 91.8794 81.2967 91.8242 81.2674 91.8068L81.2661 91.7785L81.2566 91.7789L81.2552 91.7506L81.2458 91.7511L81.2444 91.7228L81.235 91.7233L81.2336 91.695L81.2241 91.6955L81.2227 91.6672C81.1535 91.6044 81.1276 91.4639 81.0584 91.4011L81.057 91.3728L81.0475 91.3733L81.0461 91.345L81.0367 91.3455L81.0353 91.3172L81.0259 91.3177L81.0245 91.2894L81.015 91.2898L81.0136 91.2615L81.0042 91.262C81.0127 91.2427 80.9929 91.2248 80.9731 91.2068C80.9623 91.179 80.9406 91.1233 80.9119 91.1153L80.9105 91.087L80.9011 91.0875L80.8997 91.0592L80.8902 91.0597L80.8888 91.0314L80.8794 91.0318L80.878 91.0035C80.7979 90.913 80.7518 90.7451 80.6717 90.6545L80.6703 90.6262L80.6609 90.6267L80.6595 90.5984L80.65 90.5989L80.6487 90.5706L80.6392 90.571L80.6378 90.5427C80.5987 90.5163 80.5747 90.4135 80.5361 90.3965L80.5347 90.3682L80.5252 90.3687L80.5239 90.3404L80.5144 90.3409L80.513 90.3126L80.5036 90.313L80.5022 90.2847L80.4928 90.2852L80.4914 90.2569L80.4819 90.2574L80.4805 90.2291C80.4424 90.2215 80.4476 90.1362 80.4089 90.1192L80.4075 90.0909L80.3981 90.0914L80.3967 90.0631L80.3873 90.0635L80.3859 90.0353L80.3765 90.0357L80.3751 90.0074C80.3378 90.0187 80.3624 89.9419 80.3345 89.9527L80.3331 89.9244L80.3237 89.9249L80.3223 89.8966L80.3129 89.8971L80.3115 89.8688L80.3021 89.8692L80.3007 89.8409L80.2912 89.8414L80.2898 89.8131C80.0579 89.7111 79.9732 89.5263 79.8898 89.3697ZM87.5189 88.9929C87.7664 89.0279 88.2668 88.8236 88.3553 89.0839C88.4152 89.1472 88.4759 89.2292 88.5178 89.3122C88.5777 89.3755 88.6385 89.4575 88.6804 89.5405C88.7402 89.6038 88.801 89.6858 88.8429 89.7689C88.9027 89.8321 88.9635 89.9142 89.0054 89.9972C89.0653 90.0604 89.126 90.1425 89.168 90.2255C89.2278 90.2887 89.2886 90.3708 89.3305 90.4538C89.3903 90.517 89.4511 90.5991 89.493 90.6821C89.7239 90.9543 89.8901 91.258 90.1413 91.5576L90.0095 88.8888L90.8582 88.8469L91.0733 93.2037C90.4029 93.2179 90.3268 93.4013 89.9943 92.7938C89.8841 92.6669 89.7828 92.5301 89.6999 92.3829C89.6401 92.3197 89.5793 92.2376 89.5374 92.1546C89.4271 92.0277 89.3258 91.8909 89.2429 91.7438C88.9522 91.4083 88.7643 91.0489 88.4529 90.6767L88.5837 93.3266L87.735 93.3686L87.5189 88.9929ZM53.0121 92.011L53.0027 92.0115L52.998 91.9172L52.9886 91.9176L52.9853 91.8516L52.9759 91.8521L52.9727 91.7861L52.9632 91.7866L52.9604 91.73L52.951 91.7304L52.9491 91.6927L52.9397 91.6932L52.9379 91.6555L52.9284 91.6559L52.9266 91.6182L52.9171 91.6187C52.9157 91.5904 52.9049 91.5626 52.9035 91.5343C52.854 91.4894 52.8211 91.3965 52.7801 91.3324C52.2817 90.6196 51.2693 90.7925 50.4771 90.8317C50.3357 90.8386 50.0797 90.8229 49.9684 90.8662L50.183 95.2136C50.8139 95.1635 51.524 95.1852 52.1333 95.0795L52.1328 95.07L52.1894 95.0673L52.1889 95.0578C52.2262 95.0465 52.2728 95.0348 52.3101 95.0235L52.3096 95.014L52.3379 95.0127L52.3375 95.0032L52.3752 95.0014C52.3733 94.9636 52.4591 94.9783 52.4573 94.9406L52.4856 94.9392C52.586 94.8681 52.6856 94.7781 52.7851 94.6881C52.8639 94.5613 52.9437 94.4534 53.0032 94.3181L53.0013 94.2803L53.0107 94.2799L53.0093 94.2516L53.0188 94.2511L53.0169 94.2134L53.0263 94.2129L53.0245 94.1752L53.0339 94.1748L53.032 94.137L53.0415 94.1366L53.0396 94.0988L53.049 94.0984C53.0472 94.0607 53.0547 94.0225 53.0529 93.9847L53.0623 93.9843L53.0591 93.9183L53.0685 93.9178L53.0643 93.8329L53.0737 93.8325L53.0681 93.7193L53.0776 93.7188C53.0963 93.1413 53.0769 92.5561 53.0121 92.011ZM52.6215 93.0985L52.6121 93.099C52.6336 93.3437 52.6184 93.6092 52.6107 93.8364L52.6013 93.8369L52.6041 93.8935L52.5946 93.8939L52.5974 93.9505L52.588 93.951L52.5908 94.0076L52.5814 94.008L52.5832 94.0458L52.5738 94.0462L52.5757 94.0839C52.5375 94.0764 52.5695 94.1504 52.5407 94.1424C52.4845 94.3437 52.3038 94.5133 52.109 94.5891L52.1095 94.5985L52.0812 94.5999L52.0817 94.6094L52.044 94.6112L52.0444 94.6207L52.0067 94.6225L52.0072 94.6319L51.9694 94.6338L51.9699 94.6432L51.9039 94.6465L51.9044 94.6559L51.8384 94.6592L51.8388 94.6686C51.4536 94.716 51.0283 94.7181 50.6322 94.7377L50.458 91.2107C51.1285 91.1965 52.0533 90.9712 52.4249 91.6052L52.4263 91.6335C52.464 91.6316 52.4493 91.7174 52.4871 91.7155L52.4889 91.7533L52.4983 91.7528L52.5002 91.7905L52.5096 91.79L52.5124 91.8466L52.5219 91.8462L52.5247 91.9027L52.5341 91.9023L52.5383 91.9871L52.5477 91.9867L52.5519 92.0716L52.5613 92.0711L52.5679 92.2031L52.5773 92.2027C52.5743 92.5242 52.6165 92.8057 52.6215 93.0985ZM86.0774 89.2815C86.0302 89.2838 85.9892 89.2197 85.9421 89.222C85.6696 89.0653 85.3009 89.0646 84.9525 89.0913C84.7752 89.1379 84.5318 89.1877 84.4049 89.2979L84.3766 89.2993C84.1201 89.4633 83.8591 89.7314 83.742 90.0397L83.7434 90.068L83.734 90.0684L83.7359 90.1061L83.7264 90.1066L83.7278 90.1349L83.7184 90.1354C83.6063 90.7365 83.6935 91.5451 83.7346 92.1859L83.744 92.1855C83.7576 92.2699 83.7713 92.3543 83.7853 92.4481L83.7948 92.4477L83.7976 92.5042L83.807 92.5038L83.8089 92.5415L83.8183 92.541L83.8202 92.5788L83.8296 92.5783L83.8314 92.616L83.8409 92.6155L83.8427 92.6533C83.8805 92.6514 83.8658 92.7372 83.9035 92.7353L83.9049 92.7636L83.9143 92.7632L83.9157 92.7915C83.9355 92.8094 83.9661 92.8551 83.977 92.883C84.1574 93.0915 84.3855 93.3071 84.6636 93.3879C84.8772 93.5002 85.2954 93.5458 85.5472 93.4766L85.6603 93.471L85.6599 93.4616L85.7448 93.4574L85.7443 93.448L85.8103 93.4447L85.8098 93.4353C85.8381 93.4339 85.8754 93.4226 85.9037 93.4212L85.9032 93.4118L85.9409 93.4099L85.9405 93.4005C86.8134 93.0832 86.9776 92.1959 86.8777 91.3217C86.8848 90.5084 86.7773 89.6723 86.0774 89.2815ZM85.7132 92.6271C85.7151 92.6648 85.6293 92.6501 85.6311 92.6878L85.5934 92.6897L85.5939 92.6991C85.5561 92.701 85.5189 92.7123 85.4812 92.7141C85.4642 92.7528 85.1237 92.7507 85.1223 92.7224L85.0846 92.7243L85.0842 92.7148L85.0464 92.7167C84.8824 92.6492 84.7344 92.5241 84.6416 92.368L84.6398 92.3303L84.6303 92.3308L84.6275 92.2742L84.6181 92.2747L84.6153 92.2181L84.6059 92.2185L84.6017 92.1337L84.5923 92.1341L84.5867 92.021L84.5773 92.0214C84.5333 91.5131 84.4723 90.8544 84.5335 90.3693L84.5429 90.3688L84.541 90.3311L84.5505 90.3306L84.5486 90.2929L84.558 90.2924L84.5566 90.2641C84.6161 90.1288 84.7421 89.9997 84.8704 89.9178L84.8987 89.9164L84.8982 89.9069L84.9359 89.9051L84.9355 89.8957L84.9732 89.8938L84.9727 89.8844L85.0293 89.8816L85.0289 89.8721L85.142 89.8665L85.1416 89.8571C85.4339 89.8427 85.5894 89.9295 85.7662 90.0626C85.8774 90.2084 85.9814 90.4017 85.9738 90.629L85.9832 90.6285C85.9757 91.2434 86.2712 92.2497 85.7132 92.6271ZM65.0011 94.1604L64.9917 94.1609L64.9903 94.1326L64.9808 94.133L64.9794 94.1048L64.97 94.1052L64.9686 94.0769L64.9592 94.0774L64.9578 94.0491L64.9483 94.0496L64.947 94.0213L64.9375 94.0217L64.9361 93.9935C64.8565 93.9123 64.8 93.726 64.7105 93.6359L64.7091 93.6076L64.6997 93.6081C64.6474 93.5067 64.5744 93.3685 64.5037 93.2775L64.5023 93.2492L64.4929 93.2496L64.4915 93.2213L64.4821 93.2218C64.4906 93.2025 64.4708 93.1845 64.451 93.1666C64.4496 93.1383 64.4397 93.1294 64.4208 93.1303C64.4185 93.0831 64.3704 93.0666 64.3775 93.019L64.3681 93.0195L64.3667 92.9912L64.3573 92.9916L64.3559 92.9633C64.2942 92.8624 64.2037 92.7534 64.159 92.6138C64.4471 92.5145 64.6623 92.277 64.7921 92.0343L64.7907 92.006C64.8284 92.0041 64.8054 91.9202 64.8431 91.9183C64.8417 91.89 64.8497 91.8613 64.8483 91.833L64.8578 91.8325C64.9098 91.5463 64.8845 91.2262 64.7857 90.9475L64.7763 90.9479L64.7749 90.9196L64.7654 90.9201L64.7636 90.8824C64.6501 90.6895 64.479 90.4805 64.2745 90.3582C64.2457 90.3502 64.1882 90.3341 64.1774 90.3063L64.1491 90.3077L64.1486 90.2983L64.1203 90.2997C64.1185 90.262 64.0345 90.285 64.0327 90.2473L63.9949 90.2492L63.9945 90.2397L63.9568 90.2416L63.9563 90.2322L63.9186 90.234L63.9181 90.2246L63.8804 90.2265L63.8799 90.217C63.1774 90.1572 62.4055 90.2237 61.7185 90.286L61.9332 94.6333L62.7914 94.5909L62.7057 92.8558L63.3092 92.826C63.3285 92.8345 63.353 92.9467 63.3813 92.9453L63.3827 92.9736L63.3921 92.9731L63.3935 93.0014L63.4029 93.0009L63.4043 93.0292L63.4138 93.0288L63.4152 93.0571C63.4642 93.0925 63.4792 93.2052 63.5376 93.2401L63.539 93.2684L63.5485 93.2679L63.5499 93.2962L63.5593 93.2957L63.5607 93.324L63.5701 93.3236L63.5715 93.3518L63.581 93.3514L63.5824 93.3797L63.5918 93.3792L63.5936 93.4169C63.6314 93.4151 63.6167 93.5009 63.6544 93.499L63.6558 93.5273L63.6652 93.5268L63.6666 93.5551L63.6761 93.5547L63.6775 93.5829L63.6869 93.5825L63.6883 93.6108L63.6977 93.6103L63.6991 93.6386C63.7472 93.6551 63.7424 93.7499 63.7905 93.7664L63.7919 93.7947L63.8013 93.7943L63.8027 93.8225L63.8122 93.8221L63.8136 93.8504L63.823 93.8499L63.8244 93.8782L63.8338 93.8777L63.8352 93.906L63.8447 93.9056L63.8461 93.9338L63.8555 93.9334L63.8569 93.9617L63.8663 93.9612L63.8677 93.9895C63.9153 93.9966 63.9016 94.1013 63.9398 94.1088L63.9412 94.1371L63.9506 94.1367L63.952 94.1649L63.9614 94.1645L63.9628 94.1928L63.9723 94.1923L63.9736 94.2206C64.0344 94.3027 64.0971 94.4225 64.1503 94.5427L65.131 94.4943C65.124 94.3529 65.034 94.2533 65.0011 94.1604ZM63.9728 91.7155C63.9464 91.7546 63.9124 91.8319 63.8864 91.8805C63.8402 91.9017 63.8157 91.9785 63.7591 91.9813C63.7609 92.019 63.6751 92.0044 63.677 92.0421L63.6393 92.0439C63.3709 92.1612 62.9325 92.0883 62.6132 92.1324L62.5564 90.9819C62.8964 90.9746 63.3 90.9168 63.6239 90.967L63.6244 90.9765L63.6527 90.9751C63.6824 91.002 63.7502 91.0364 63.7889 91.0534C63.8101 91.0996 63.8869 91.1242 63.8897 91.1808C63.9274 91.1789 63.9128 91.2647 63.9505 91.2629L63.9523 91.3006L63.9618 91.3001L63.9646 91.3567C64.0235 91.4011 63.9809 91.6868 63.9728 91.7155ZM75.879 89.7001L75.8413 89.7019L75.8408 89.6925L75.8125 89.6939L75.8121 89.6845L75.7743 89.6863L75.7739 89.6769L75.7362 89.6788L75.7357 89.6693C75.7074 89.6707 75.6692 89.6632 75.6409 89.6646L75.6405 89.6551C75.5933 89.6575 75.5457 89.6504 75.508 89.6522L75.5075 89.6428C74.8917 89.6165 74.2052 89.6882 73.5823 89.7095L73.7975 94.0663C74.4194 94.0262 75.0814 94.0313 75.6925 93.9633L75.692 93.9538L75.7769 93.9497L75.7764 93.9402L75.833 93.9374L75.8326 93.928L75.8891 93.9252L75.8887 93.9158C76.29 93.8109 76.6245 93.5013 76.7393 93.1459L76.7487 93.1454L76.7473 93.1171C76.7855 93.1247 76.7535 93.0506 76.7822 93.0587L76.7804 93.0209L76.7898 93.0205L76.7879 92.9828L76.7974 92.9823L76.7955 92.9446L76.8049 92.9441C76.8035 92.9158 76.8111 92.8776 76.8097 92.8493L76.8191 92.8489L76.8159 92.7829L76.8253 92.7824L76.822 92.7164L76.8315 92.7159L76.8259 92.6027L76.8353 92.6023C76.8181 91.4876 76.9576 90.1006 75.879 89.7001ZM74.5887 93.2426L74.448 90.3947C75.0978 90.3437 75.6151 90.2898 75.8463 90.7605C75.8477 90.7888 75.8585 90.8166 75.8599 90.8449L75.8694 90.8444L75.8726 90.9104L75.882 90.91L75.8853 90.976L75.8947 90.9755L75.9008 91.0981L75.9102 91.0976C76.0122 92.3972 76.3143 93.3465 74.5887 93.2426ZM69.0316 94.037L69.0221 94.0375L69.0207 94.0092L69.0113 94.0096C69 93.9724 68.9883 93.9257 68.977 93.8884L68.9675 93.8889L68.9661 93.8606L68.9567 93.8611C68.9553 93.8328 68.9445 93.805 68.9431 93.7767L68.9337 93.7771L68.9323 93.7488L68.9228 93.7493C68.9214 93.721 68.9106 93.6932 68.9092 93.6649L68.8998 93.6654L68.8979 93.6276L68.8885 93.6281L68.8871 93.5998L68.8776 93.6003C68.8763 93.572 68.8654 93.5442 68.864 93.5159L68.8546 93.5163C68.7958 93.2829 68.6333 93.0546 68.5745 92.8212L68.565 92.8216L68.5632 92.7839L68.5538 92.7844L68.5524 92.7561L68.5429 92.7566C68.5415 92.7283 68.5307 92.7004 68.5293 92.6722L68.5199 92.6726C68.4601 92.4203 68.2877 92.1831 68.2186 91.9312L68.2091 91.9317L68.2077 91.9034L68.1983 91.9039C68.187 91.8666 68.1753 91.8199 68.164 91.7827L68.1545 91.7831L68.1531 91.7549L68.1437 91.7553C68.1324 91.7181 68.1207 91.6714 68.1094 91.6341L68.0999 91.6346L68.0985 91.6063L68.0891 91.6068C68.0778 91.5695 68.0661 91.5228 68.0548 91.4856L68.0453 91.486L68.0439 91.4577L68.0345 91.4582C68.0331 91.4299 68.0223 91.4021 68.0209 91.3738L68.0115 91.3743L68.0101 91.346L68.0006 91.3464L67.9988 91.3087L67.9893 91.3092C67.9879 91.2809 67.9771 91.2531 67.9757 91.2248L67.9663 91.2252L67.9649 91.197L67.9555 91.1974L67.9536 91.1597L67.9442 91.1602C67.9428 91.1319 67.9319 91.104 67.9305 91.0758L67.9211 91.0762L67.9197 91.0479L67.9103 91.0484C67.899 91.0111 67.8872 90.9645 67.8759 90.9272L67.8665 90.9277L67.8651 90.8994L67.8557 90.8998C67.8444 90.8626 67.8326 90.8159 67.8213 90.7786L67.8119 90.7791L67.8105 90.7508L67.8011 90.7513C67.4088 89.8915 67.7228 89.9327 66.8086 89.9873C66.8029 90.0632 66.7486 90.1132 66.7613 90.1787L66.7519 90.1792L66.7533 90.2075L66.7438 90.2079C66.7363 90.2461 66.7292 90.2937 66.7216 90.3319L66.7122 90.3324L66.7136 90.3607L66.7041 90.3611C66.6615 90.6469 66.5053 90.9287 66.4622 91.205L66.4528 91.2055L66.4546 91.2432L66.4452 91.2436L66.4466 91.2719L66.4372 91.2724C66.4386 91.3007 66.4305 91.3294 66.4319 91.3577L66.4225 91.3582L66.4244 91.3959L66.4149 91.3964L66.4163 91.4247L66.4069 91.4251C66.4083 91.4534 66.4003 91.4822 66.4017 91.5105L66.3922 91.511L66.3936 91.5392L66.3842 91.5397C66.3766 91.5779 66.3695 91.6255 66.362 91.6637L66.3525 91.6642L66.3539 91.6925L66.3445 91.6929C66.2528 92.1323 66.0568 92.5674 65.9552 92.9978L65.9457 92.9983L65.9476 93.036L65.9382 93.0365L65.9396 93.0647L65.9301 93.0652L65.932 93.1029L65.9226 93.1034C65.924 93.1317 65.916 93.1604 65.9173 93.1887L65.9079 93.1892L65.9093 93.2175L65.8999 93.218C65.8488 93.523 65.6925 93.8048 65.6414 94.1099L65.632 94.1103L65.6334 94.1386L65.624 94.1391C65.6291 94.2428 65.5564 94.3031 65.5526 94.4168L66.439 94.373C66.4726 94.2863 66.4656 94.1448 66.5194 94.0854L66.5175 94.0477L66.5269 94.0472L66.5251 94.0095L66.5345 94.0091L66.5326 93.9713L66.5421 93.9709L66.5402 93.9331L66.5496 93.9327L66.5482 93.9044L66.5577 93.9039C66.562 93.7997 66.6148 93.7215 66.6286 93.6168L68.1846 93.54C68.5263 94.5252 68.3718 94.2681 69.3539 94.2479C69.0951 94.1756 69.0457 94.1308 69.0316 94.037ZM66.5932 92.9001C66.6423 92.7464 66.7013 92.6017 66.7217 92.44L66.7311 92.4395L66.7298 92.4113L66.7392 92.4108C66.7378 92.3825 66.7458 92.3537 66.7444 92.3254L66.7538 92.325L66.752 92.2873L66.7614 92.2868L66.7595 92.2491L66.769 92.2486L66.7671 92.2109L66.7765 92.2104L66.7747 92.1727L66.7841 92.1722L66.7823 92.1345L66.7917 92.134L66.7903 92.1058L66.7997 92.1053L66.7978 92.0676C66.8611 92.0077 66.8334 91.8295 66.897 91.7791L66.8956 91.7508L66.9051 91.7503C66.9037 91.722 66.9117 91.6933 66.9103 91.665L66.9197 91.6645L66.9179 91.6268L66.9273 91.6263L66.9255 91.5886L66.9349 91.5881L66.933 91.5504L66.9425 91.55L66.9406 91.5122L66.95 91.5118L66.9482 91.474L66.9576 91.4736L66.9562 91.4453L66.9656 91.4448C66.9642 91.4165 66.9723 91.3878 66.9709 91.3595L66.9803 91.359L66.9789 91.3307L66.9883 91.3303C66.9897 91.3586 67.0005 91.3864 67.0019 91.4147L67.0114 91.4142L67.0132 91.4519L67.0227 91.4515L67.0245 91.4892L67.034 91.4887L67.0358 91.5264L67.0452 91.526L67.0471 91.5637L67.0565 91.5632L67.0584 91.6009L67.0678 91.6005L67.0697 91.6382L67.0791 91.6377L67.081 91.6755L67.0904 91.675C67.1398 91.9089 67.2924 92.1282 67.3418 92.3621L67.3512 92.3617L67.3531 92.3994L67.3625 92.3989L67.3644 92.4366L67.3738 92.4362L67.3757 92.4739L67.3851 92.4734C67.3964 92.5107 67.4081 92.5574 67.4194 92.5946L67.4289 92.5942L67.4303 92.6224L67.4397 92.622L67.4416 92.6597L67.451 92.6592C67.4547 92.7347 67.4948 92.78 67.5169 92.845C67.3099 92.8647 66.9515 92.8824 66.5932 92.9001Z" fill="#020304"/> -<path fill-rule="evenodd" clip-rule="evenodd" d="M88.0628 74.1525C88.6027 74.1732 89.2931 73.9878 89.7739 74.1531C89.9318 74.2871 89.9052 74.5153 89.9183 74.7794L90.1581 79.636C90.2277 80.6629 90.2808 81.738 89.9408 82.7001L89.9422 82.7284L89.9327 82.7289C89.9252 82.7671 89.9181 82.8147 89.9105 82.8529L89.9011 82.8533L89.9025 82.8816L89.893 82.8821L89.8949 82.9198L89.8855 82.9203C89.8864 82.9392 89.8784 82.9679 89.8793 82.9868L89.8699 82.9872L89.8713 83.0155L89.8618 83.016L89.8637 83.0537C89.8255 83.0461 89.8575 83.1202 89.8288 83.1122L89.8306 83.1499C89.7924 83.1423 89.8245 83.2164 89.7957 83.2083L89.7971 83.2366L89.7877 83.2371L89.7895 83.2748L89.7801 83.2753L89.7815 83.3036C89.7433 83.296 89.7753 83.37 89.7466 83.362L89.748 83.3903L89.7385 83.3908L89.7399 83.4191L89.7305 83.4195L89.7319 83.4478L89.7225 83.4483L89.7239 83.4766L89.7144 83.477L89.7158 83.5053L89.7064 83.5058L89.7078 83.5341L89.6984 83.5345L89.6998 83.5628L89.6903 83.5633L89.6917 83.5916L89.6823 83.5921C89.6591 83.6972 89.569 83.7867 89.5454 83.8824L89.536 83.8829C89.5208 83.9593 89.4473 84.0007 89.4321 84.0771C89.4137 84.0874 89.3783 84.1364 89.3797 84.1647C88.9686 84.8373 88.2954 85.5607 87.6755 86.0261C87.5458 86.0798 87.4387 86.208 87.2996 86.2621L87.3 86.2715C87.2619 86.264 87.2548 86.3116 87.2166 86.304C87.2081 86.3234 87.1991 86.3333 87.1803 86.3342C87.1718 86.3535 87.1538 86.3733 87.1251 86.3653L87.1255 86.3747L87.0972 86.3761L87.0977 86.3855L87.0694 86.3869L87.0699 86.3964L87.0416 86.3978C87.0529 86.435 86.976 86.4104 86.9869 86.4383L86.9586 86.4397L86.959 86.4491L86.9308 86.4505L86.9312 86.4599L86.9029 86.4613L86.9034 86.4707L86.8751 86.4721C86.8864 86.5094 86.8096 86.4848 86.8204 86.5127L86.7921 86.5141L86.7926 86.5235L86.7548 86.5254L86.7553 86.5348L86.727 86.5362C86.7383 86.5734 86.6615 86.5489 86.6723 86.5767L86.6346 86.5786L86.635 86.588L86.6067 86.5894L86.6072 86.5988L86.5695 86.6007C86.5808 86.6379 86.5039 86.6134 86.5148 86.6412C86.4865 86.6426 86.4587 86.6534 86.4304 86.6548L86.4308 86.6642L86.4025 86.6656L86.403 86.6751C86.3747 86.6765 86.3469 86.6873 86.3186 86.6887L86.3191 86.6981L86.2908 86.6995L86.2912 86.709C86.2629 86.7104 86.2351 86.7212 86.2068 86.7226L86.2073 86.732L86.1696 86.7339L86.17 86.7433L86.1323 86.7452L86.1328 86.7546L86.0951 86.7565L86.0955 86.7659L86.0578 86.7678L86.0583 86.7772L86.0206 86.779L86.021 86.7885L85.9644 86.7913L85.9649 86.8007L85.9272 86.8026L85.9277 86.812C85.8994 86.8134 85.8621 86.8247 85.8338 86.8261L85.8343 86.8355L85.7777 86.8383L85.7782 86.8477C85.7404 86.8496 85.7032 86.8609 85.6655 86.8628L85.6659 86.8722L85.6094 86.875L85.6098 86.8844L85.5532 86.8872L85.5537 86.8966L85.4877 86.8999L85.4881 86.9093L85.4221 86.9126L85.4226 86.922L85.3566 86.9253L85.3571 86.9347L85.291 86.938L85.2915 86.9474C85.2349 86.9502 85.1694 86.9629 85.1128 86.9657L85.1133 86.9751L85.019 86.9798L85.0194 86.9892L84.9063 86.9948L84.9067 87.0042L84.7841 87.0103L84.7846 87.0197L84.6243 87.0276L84.6248 87.037L84.3607 87.0501L84.3612 87.0595L83.9368 87.0805L83.9363 87.071C83.5785 87.0982 83.2451 87.0485 82.9321 87.0261L82.9316 87.0167L82.8656 87.0199L82.8651 87.0105L82.7991 87.0138L82.7986 87.0043L82.7421 87.0071L82.7416 86.9977L82.6756 87.0009L82.6751 86.9915L82.6185 86.9943L82.6181 86.9849L82.5615 86.9877L82.561 86.9782L82.5044 86.981L82.504 86.9716L82.4474 86.9744L82.4469 86.965L82.4092 86.9668L82.4087 86.9574C82.2088 86.9295 81.9595 86.8567 81.7855 86.7802L81.7572 86.7816L81.7568 86.7722L81.7191 86.774L81.7186 86.7646L81.6903 86.766L81.6898 86.7566L81.6521 86.7584C81.6597 86.7203 81.5856 86.7523 81.5937 86.7235L81.5559 86.7254C81.5635 86.6872 81.4895 86.7192 81.4975 86.6905L81.4692 86.6918L81.4687 86.6824L81.431 86.6843L81.4306 86.6749L81.4023 86.6762C81.4098 86.6381 81.3358 86.6701 81.3438 86.6413L81.3155 86.6427L81.3151 86.6333L81.2868 86.6347L81.2863 86.6253L81.258 86.6267L81.2576 86.6172L81.2293 86.6186L81.2288 86.6092L81.2005 86.6106L81.2 86.6012L81.1717 86.6025L81.1713 86.5931L81.143 86.5945L81.1425 86.5851C81.1241 86.5955 81.1043 86.5775 81.0845 86.5596C81.0473 86.5709 81.0544 86.5233 81.0171 86.5346L81.0167 86.5251C80.8243 86.459 80.657 86.3255 80.4831 86.249C80.2281 86.063 79.917 85.8893 79.6583 85.628C79.058 85.1471 78.6537 84.6188 78.2934 84.0221L78.284 84.0226L78.2826 83.9943L78.2731 83.9948L78.2717 83.9665L78.2623 83.967L78.2609 83.9387L78.2515 83.9391L78.2501 83.9108L78.2407 83.9113L78.2393 83.883L78.2298 83.8835L78.2284 83.8552L78.219 83.8557L78.2176 83.8274C78.1799 83.8292 78.1945 83.7434 78.1568 83.7453C78.1559 83.7264 78.1451 83.6986 78.1441 83.6797C78.1069 83.691 78.1314 83.6142 78.1036 83.625L78.1018 83.5873C78.0235 83.5344 78.0241 83.3548 77.9548 83.2921L77.9534 83.2638L77.944 83.2642L77.9421 83.2265L77.9327 83.227L77.9309 83.1893L77.9214 83.1897L77.9196 83.152L77.9101 83.1525L77.9083 83.1147L77.8988 83.1152L77.897 83.0775L77.8875 83.0779L77.8857 83.0402L77.8762 83.0407L77.8744 83.003L77.865 83.0034L77.8631 82.9657L77.8537 82.9662L77.8518 82.9285L77.8424 82.9289L77.8405 82.8912L77.8311 82.8917C77.8297 82.8634 77.8184 82.8261 77.817 82.7978L77.8076 82.7983C77.8057 82.7606 77.7944 82.7233 77.7925 82.6856L77.7831 82.6861L77.7803 82.6295L77.7709 82.63L77.7681 82.5734L77.7587 82.5738L77.7559 82.5173L77.7464 82.5177L77.7436 82.4611L77.7342 82.4616C77.7046 82.2456 77.6185 82.0325 77.6073 81.8061L77.5979 81.8066L77.5914 81.6746L77.5819 81.675L77.5731 81.4959L77.5636 81.4963L77.2479 75.1026C77.2197 74.9149 77.2477 74.715 77.4339 74.6585L77.4335 74.6491L77.4712 74.6473L77.4707 74.6378L77.5367 74.6346L77.5363 74.6251L78.7245 74.5665C78.9881 74.544 79.1955 74.5337 79.318 74.7168C79.4978 76.8254 79.5281 78.9698 79.6607 81.0808L79.6701 81.0804L79.6831 81.3444L79.6926 81.3439L79.6991 81.476L79.7085 81.4755L79.7132 81.5698L79.7226 81.5693C79.7372 81.6726 79.7612 81.7754 79.7757 81.8787L79.7851 81.8782L79.7879 81.9348L79.7974 81.9343L79.8001 81.9909L79.8096 81.9904L79.8124 82.047L79.8218 82.0466L79.8246 82.1031L79.834 82.1027L79.8368 82.1593L79.8463 82.1588L79.8481 82.1965L79.8575 82.196L79.8594 82.2338L79.8688 82.2333L79.8707 82.271L79.8801 82.2705L79.882 82.3083L79.8914 82.3078L79.8933 82.3455L79.9027 82.3451L79.9046 82.3828L79.914 82.3823C79.9154 82.4106 79.9262 82.4384 79.9276 82.4667L79.9371 82.4663L79.9385 82.4945L79.9479 82.4941L79.9498 82.5318L79.9592 82.5313L79.9606 82.5596L79.97 82.5592L79.9719 82.5969C80.0091 82.5856 79.9846 82.6624 80.0124 82.6516L80.0143 82.6893L80.0237 82.6889L80.0251 82.7172C80.0623 82.7059 80.0378 82.7827 80.0656 82.7719L80.067 82.8002L80.0764 82.7997L80.0778 82.828L80.0872 82.8275L80.0886 82.8558L80.0981 82.8553L80.0995 82.8836L80.1089 82.8832L80.1103 82.9115L80.1197 82.911L80.1211 82.9393L80.1306 82.9388L80.132 82.9671L80.1414 82.9666C80.1856 83.0968 80.3138 83.2039 80.367 83.3242C80.6483 83.6601 81.0483 84.1035 81.457 84.3386C81.5456 84.4098 81.6526 84.4707 81.7492 84.5132L81.7497 84.5226C81.7968 84.5203 81.8378 84.5845 81.8849 84.5821L81.8854 84.5916L81.9137 84.5902L81.9142 84.5996C81.9326 84.5892 81.9524 84.6072 81.9722 84.6251C82.0301 84.6506 82.107 84.6752 82.156 84.7105L82.1937 84.7087L82.1942 84.7181L82.2225 84.7167C82.2243 84.7544 82.3083 84.7314 82.3101 84.7691L82.3479 84.7672L82.3483 84.7767L82.3766 84.7753L82.3771 84.7847L82.4148 84.7828L82.4153 84.7923L82.4436 84.7909C82.6269 84.8669 82.8758 84.9302 83.0847 84.9483L83.0852 84.9577L83.1417 84.9549L83.1422 84.9644L83.2082 84.9611L83.2087 84.9705L83.2936 84.9663L83.294 84.9758L83.3789 84.9716L83.3794 84.981L83.4737 84.9763L83.4741 84.9858L83.5967 84.9797L83.5972 84.9891C83.9098 85.0021 84.296 84.9735 84.6058 84.9299L84.6053 84.9205L84.6996 84.9158L84.6991 84.9064L84.784 84.9022L84.7835 84.8928L84.8684 84.8886L84.868 84.8791L84.934 84.8759L84.9335 84.8664L84.9901 84.8636L84.9896 84.8542L85.0556 84.8509L85.0552 84.8415C85.0929 84.8397 85.1301 84.8284 85.1679 84.8265L85.1674 84.8171C85.1957 84.8157 85.233 84.8044 85.2612 84.803L85.2608 84.7936L85.2985 84.7917L85.298 84.7823L85.3357 84.7804L85.3353 84.771L85.373 84.7691L85.3725 84.7597L85.4103 84.7578L85.4098 84.7484L85.4475 84.7465L85.4471 84.7371L85.4848 84.7352L85.4843 84.7258L85.522 84.7239L85.5216 84.7145L85.5499 84.7131L85.5494 84.7037C85.5777 84.7023 85.6055 84.6915 85.6338 84.6901C85.6225 84.6528 85.6993 84.6774 85.6885 84.6495L85.7262 84.6477L85.7258 84.6382L85.7541 84.6368L85.7536 84.6274L85.7819 84.626L85.7814 84.6166L85.8097 84.6152L85.8092 84.6058L85.847 84.6039C85.8451 84.5662 85.9309 84.5808 85.929 84.5431L85.9573 84.5417L85.9569 84.5323L85.9852 84.5309L85.9847 84.5215C86.1516 84.4565 86.2866 84.3175 86.4337 84.2346C86.8253 83.9317 87.2726 83.418 87.5355 82.9985C87.5331 82.9514 87.5973 82.9104 87.5949 82.8632L87.6044 82.8628C87.6195 82.7864 87.6917 82.7167 87.7068 82.6403L87.7163 82.6398L87.7149 82.6115L87.7243 82.6111L87.7229 82.5828L87.7323 82.5823L87.7309 82.554L87.7404 82.5536L87.739 82.5253L87.7484 82.5248L87.747 82.4965L87.7564 82.496L87.755 82.4678L87.7645 82.4673L87.7631 82.439L87.7725 82.4385L87.7711 82.4102C87.8093 82.4178 87.7773 82.3438 87.806 82.3518L87.8046 82.3235L87.8141 82.323L87.8122 82.2853C87.8504 82.2929 87.8184 82.2188 87.8471 82.2269L87.8453 82.1892L87.8547 82.1887L87.8533 82.1604L87.8627 82.1599C87.8613 82.1316 87.8694 82.1029 87.868 82.0746L87.8774 82.0741L87.876 82.0458C87.935 81.9011 87.9903 81.681 88.0003 81.5009L88.0098 81.5004L88.007 81.4438L88.0164 81.4433L88.0131 81.3773L88.0226 81.3769L88.0184 81.292L88.0278 81.2915L88.0236 81.2067L88.033 81.2062L88.0275 81.093L88.0369 81.0926L88.0308 80.97L88.0403 80.9695C87.976 78.9024 87.8354 76.8202 87.7423 74.745C87.7123 74.5196 87.6875 74.2089 87.9209 74.1501L87.9204 74.1407C87.9487 74.1393 87.986 74.128 88.0143 74.1266C88.0633 74.162 88.0628 74.1525 88.0628 74.1525ZM76.2405 86.2883C76.1285 84.4032 76.091 82.4955 75.9319 80.6127L75.9224 80.6132C75.8939 80.227 75.7621 79.8553 75.6779 79.4908L75.6685 79.4913C75.6671 79.463 75.6558 79.4257 75.6544 79.3975L75.645 79.3979C75.6332 79.3512 75.6215 79.3045 75.6102 79.2673L75.6007 79.2678L75.5989 79.23L75.5895 79.2305L75.5876 79.1928L75.5782 79.1932C75.5768 79.165 75.5659 79.1371 75.5645 79.1088L75.5551 79.1093L75.5537 79.081L75.5443 79.0815C75.533 79.0442 75.5212 78.9975 75.5099 78.9603L75.5005 78.9608L75.4991 78.9325L75.4897 78.9329L75.4878 78.8952L75.4784 78.8957C75.4774 78.8768 75.4666 78.849 75.4657 78.8301L75.4563 78.8306L75.4549 78.8023L75.4454 78.8028L75.4436 78.765C75.4063 78.7763 75.4309 78.6995 75.4031 78.7103L75.4012 78.6726C75.3639 78.6839 75.3885 78.6071 75.3607 78.6179L75.3588 78.5802L75.3494 78.5806L75.348 78.5523C75.3107 78.5636 75.3353 78.4868 75.3075 78.4976L75.3061 78.4693L75.2966 78.4698L75.2952 78.4415L75.2858 78.442L75.2844 78.4137L75.275 78.4141L75.2736 78.3858L75.2642 78.3863L75.2628 78.358L75.2533 78.3585L75.2519 78.3302L75.2425 78.3307L75.2411 78.3024L75.2317 78.3028L75.2303 78.2746L75.2209 78.275C75.2294 78.2557 75.2096 78.2378 75.1898 78.2198C75.1884 78.1915 75.1785 78.1826 75.1596 78.1835C75.1672 78.1453 75.1196 78.1382 75.1271 78.1L75.1177 78.1005C75.0334 77.925 74.884 77.7717 74.7908 77.6062C74.3258 76.9958 73.5562 76.3437 72.9322 75.9585C72.9039 75.9599 72.8643 75.9241 72.8445 75.9061C72.7003 75.8566 72.5622 75.7405 72.4085 75.6913L72.408 75.6819L72.3798 75.6833L72.3793 75.6739L72.351 75.6753L72.3505 75.6659L72.3222 75.6672L72.3218 75.6578L72.2935 75.6592L72.293 75.6498L72.2647 75.6512L72.2643 75.6418L72.236 75.6432L72.2355 75.6337L72.2072 75.6351C72.1959 75.5979 72.1115 75.6115 72.0908 75.5747L72.0625 75.5761L72.062 75.5667L72.0243 75.5685C72.0319 75.5303 71.9578 75.5624 71.9659 75.5336L71.9376 75.535L71.9371 75.5256L71.8994 75.5274C71.907 75.4892 71.8329 75.5213 71.8409 75.4925L71.8032 75.4944L71.8028 75.4849L71.7745 75.4863L71.774 75.4769L71.7363 75.4788L71.7358 75.4693L71.7075 75.4707L71.7071 75.4613C71.6788 75.4627 71.65 75.4547 71.6217 75.4561L71.6213 75.4466L71.593 75.448L71.5925 75.4386C71.5642 75.44 71.5354 75.432 71.5072 75.4334L71.5067 75.4239L71.4784 75.4253L71.4779 75.4159C71.4497 75.4173 71.4209 75.4093 71.3926 75.4107L71.3921 75.4012L71.3544 75.4031L71.3539 75.3937L71.3162 75.3955L71.3158 75.3861L71.278 75.388L71.2776 75.3785L71.221 75.3813L71.2205 75.3719L71.1828 75.3737L71.1823 75.3643L71.1446 75.3662L71.1442 75.3568C71.0965 75.3497 71.0395 75.343 70.9919 75.3359L70.9914 75.3265C70.9344 75.3198 70.8773 75.3132 70.8297 75.3061L70.8292 75.2967C70.6689 75.3046 70.4851 75.2191 70.3158 75.237L70.3153 75.2275L70.221 75.2322L70.2206 75.2227L70.1263 75.2274L70.1258 75.218L69.9938 75.2245L69.9933 75.2151C69.7194 75.2191 69.4728 75.203 69.1809 75.2268C69.1365 75.2857 68.9343 75.2106 68.8994 75.2691L68.7391 75.277L68.7395 75.2864L68.6075 75.293L68.608 75.3024L68.5137 75.307L68.5141 75.3165L68.4198 75.3211L68.4203 75.3306C68.194 75.3417 67.9813 75.4373 67.7568 75.4862L67.7573 75.4956C67.7106 75.5074 67.6545 75.5196 67.6078 75.5314L67.6083 75.5408C67.5616 75.5526 67.5149 75.5643 67.4776 75.5756L67.4781 75.5851L67.4404 75.5869L67.4408 75.5964L67.4031 75.5982L67.4036 75.6076L67.3659 75.6095L67.3663 75.6189C67.338 75.6203 67.3102 75.6312 67.2819 75.6326L67.2824 75.642L67.2541 75.6434L67.2546 75.6528C67.2173 75.6641 67.1706 75.6759 67.1334 75.6872L67.1338 75.6966L67.1055 75.698L67.106 75.7074L67.0683 75.7093L67.0687 75.7187C67.0499 75.7196 67.0221 75.7305 67.0032 75.7314L67.0037 75.7408L66.9754 75.7422L66.9758 75.7517L66.9381 75.7535L66.9386 75.763L66.9103 75.7644L66.9108 75.7738L66.873 75.7756C66.8843 75.8129 66.8075 75.7883 66.8183 75.8162L66.7806 75.818C66.7825 75.8558 66.6967 75.8411 66.6985 75.8788L66.6702 75.8802L66.6707 75.8896L66.6424 75.891L66.6429 75.9005L66.6051 75.9023C66.607 75.94 66.5212 75.9254 66.5231 75.9631L66.4948 75.9645L66.4952 75.9739L66.467 75.9753L66.4674 75.9847L66.4391 75.9861L66.4396 75.9956L66.4113 75.997L66.4118 76.0064C66.3924 75.9979 66.3745 76.0177 66.3566 76.0375C66.3283 76.0389 66.3193 76.0488 66.3203 76.0676C66.2453 76.0808 66.2108 76.1487 66.1453 76.1614C66.0283 76.2806 65.8613 76.3455 65.7537 76.4643C65.1962 76.8511 64.5889 77.5711 64.2288 78.1278C64.1873 78.2433 64.0882 78.3427 64.0556 78.4483L64.0462 78.4487C64.0225 78.5444 63.9329 78.6434 63.9092 78.7391L63.8998 78.7396L63.9012 78.7679C63.8644 78.7886 63.8592 78.8739 63.8224 78.8946L63.8238 78.9229C63.7861 78.9248 63.8091 79.0087 63.7714 79.0106L63.7733 79.0483C63.7355 79.0502 63.7586 79.1341 63.7209 79.136L63.7223 79.1643L63.7128 79.1647L63.7142 79.193L63.7048 79.1935L63.7067 79.2312L63.6972 79.2317L63.6986 79.26L63.6892 79.2604L63.6906 79.2887L63.6812 79.2892L63.6826 79.3175L63.6731 79.318L63.675 79.3557L63.6656 79.3561L63.667 79.3844L63.6575 79.3849L63.6594 79.4226L63.65 79.4231C63.6509 79.442 63.6429 79.4707 63.6438 79.4896L63.6344 79.49L63.6358 79.5183L63.6263 79.5188L63.6282 79.5565L63.6188 79.557L63.6202 79.5853L63.6107 79.5857C63.6121 79.614 63.6041 79.6428 63.6055 79.6711L63.5961 79.6715L63.5975 79.6998C63.4492 80.142 63.3616 80.6663 63.3382 81.1495L63.3288 81.15C63.3115 81.5668 63.3339 82.0195 63.3822 82.4236L63.3916 82.4231L63.3982 82.5551L63.4076 82.5547L63.4132 82.6678L63.4226 82.6674L63.4282 82.7805L63.4376 82.7801L63.4418 82.8649L63.4512 82.8645C63.462 83.0814 63.5769 83.3026 63.6064 83.5185L63.6159 83.5181C63.6286 83.5836 63.6507 83.6487 63.6629 83.7048L63.6723 83.7043L63.6742 83.7421L63.6836 83.7416L63.6855 83.7793L63.6949 83.7788L63.6968 83.8166L63.7062 83.8161L63.7081 83.8538L63.7175 83.8534L63.7203 83.9099L63.7297 83.9095L63.7311 83.9378L63.7406 83.9373L63.7424 83.975L63.7518 83.9746C63.7631 84.0118 63.7749 84.0585 63.7862 84.0958L63.7956 84.0953C63.7966 84.1142 63.8074 84.142 63.8083 84.1608L63.8178 84.1604L63.8192 84.1887L63.8286 84.1882C63.83 84.2165 63.8408 84.2443 63.8422 84.2726C63.8795 84.2613 63.8549 84.3381 63.8827 84.3273L63.8846 84.365L63.894 84.3646L63.8954 84.3929L63.9048 84.3924L63.9067 84.4301C63.944 84.4188 63.9194 84.4957 63.9472 84.4848L63.9486 84.5131L63.958 84.5127L63.9599 84.5504C63.9976 84.5485 63.983 84.6343 64.0207 84.6325L64.0221 84.6608L64.0315 84.6603L64.0329 84.6886L64.0423 84.6881L64.0437 84.7164L64.0532 84.7159L64.0546 84.7442L64.064 84.7438C64.0555 84.7631 64.0753 84.781 64.0951 84.799C64.0965 84.8272 64.1064 84.8362 64.1252 84.8353C64.1177 84.8735 64.1653 84.8806 64.1577 84.9188L64.1671 84.9183C64.6226 85.7182 65.4656 86.5179 66.2758 87.0357C66.4304 87.1037 66.5591 87.2202 66.7226 87.2783L66.7231 87.2877C66.7604 87.2764 66.7533 87.3241 66.7905 87.3128C66.8009 87.3312 66.8207 87.3491 66.8485 87.3383L66.849 87.3477L66.8773 87.3463L66.8777 87.3557C66.915 87.3444 66.9079 87.3921 66.9451 87.3808C66.9555 87.3992 66.9753 87.4171 67.0031 87.4063L67.0036 87.4157L67.0319 87.4143L67.0323 87.4237L67.0606 87.4223L67.0611 87.4318L67.0894 87.4304C67.0912 87.4681 67.1752 87.445 67.177 87.4827L67.2148 87.4809C67.2166 87.5186 67.3006 87.4956 67.3024 87.5333L67.3307 87.5319L67.3312 87.5413L67.3689 87.5394C67.3613 87.5776 67.4354 87.5456 67.4274 87.5744L67.4651 87.5725C67.4575 87.6107 67.5316 87.5787 67.5235 87.6074L67.5612 87.6056L67.5617 87.615L67.59 87.6136L67.5905 87.623C67.6093 87.6221 67.6381 87.6301 67.6569 87.6292L67.6574 87.6386C67.6857 87.6372 67.7145 87.6453 67.7427 87.6439L67.7432 87.6533L67.7715 87.6519L67.772 87.6613C67.8102 87.6689 67.8578 87.676 67.896 87.6836L67.8964 87.693L67.9341 87.6911L67.9346 87.7006L67.9723 87.6987L67.9728 87.7081L68.0105 87.7063L68.011 87.7157L68.0487 87.7138L68.0492 87.7233L68.0869 87.7214L68.0874 87.7308C68.1157 87.7294 68.1538 87.737 68.1821 87.7356L68.1826 87.745C68.2109 87.7436 68.2491 87.7512 68.2774 87.7498L68.2778 87.7592C68.6394 87.8076 69.0029 87.8936 69.3712 87.8849L69.3716 87.8943C71.5142 87.8263 73.6907 87.681 75.8413 87.5842C76.0681 87.5825 76.2284 87.5746 76.344 87.4271C76.3494 87.1527 76.2308 86.6669 76.2405 86.2883ZM74.0706 85.6109L69.412 85.8409C69.0325 85.8124 68.6143 85.7669 68.2768 85.6323L68.2485 85.6337L68.248 85.6243L68.2103 85.6261L68.2098 85.6167C68.191 85.6176 68.1622 85.6096 68.1434 85.6105L68.1429 85.6011L68.1146 85.6025L68.1141 85.5931L68.0764 85.5949C68.084 85.5567 68.0099 85.5888 68.018 85.56L67.9802 85.5619C67.9784 85.5241 67.8944 85.5472 67.8926 85.5095L67.8643 85.5109L67.8638 85.5014L67.8355 85.5028L67.8351 85.4934L67.8068 85.4948L67.8063 85.4854C67.7879 85.4957 67.7681 85.4778 67.7483 85.4599C67.72 85.4613 67.7101 85.4523 67.7092 85.4335C67.672 85.4447 67.6602 85.3981 67.6229 85.4094L67.6225 85.3999C67.498 85.3683 67.3981 85.2597 67.2831 85.2276C66.9909 85.053 66.6836 84.7657 66.3967 84.5057C66.3053 84.3778 66.1955 84.2604 66.105 84.1514C66.0824 84.0769 66.0051 84.0429 65.9825 83.9684L65.9731 83.9688C65.8167 83.6741 65.5642 83.3462 65.4895 82.9812L65.48 82.9817L65.4782 82.944L65.4688 82.9444L65.4669 82.9067L65.4575 82.9072L65.4547 82.8506L65.4452 82.8511L65.4424 82.7945L65.433 82.7949L65.4302 82.7384L65.4208 82.7388C65.4189 82.7011 65.4072 82.6544 65.4053 82.6167L65.3959 82.6172L65.3917 82.5323L65.3822 82.5328L65.3781 82.4479L65.3686 82.4484L65.3644 82.3635L65.355 82.364C65.3019 82.0546 65.2796 81.602 65.292 81.2799L65.3014 81.2795C65.2983 81.0244 65.3621 80.7849 65.3971 80.5374L65.4066 80.5369L65.4047 80.4992L65.4141 80.4987L65.4123 80.461L65.4217 80.4605L65.4198 80.4228L65.4293 80.4224L65.4274 80.3846L65.4368 80.3842L65.435 80.3464L65.4444 80.346L65.4426 80.3083L65.452 80.3078C65.4506 80.2795 65.4586 80.2507 65.4572 80.2225L65.4667 80.222L65.4653 80.1937L65.4747 80.1932L65.4728 80.1555L65.4823 80.155L65.4809 80.1268L65.4903 80.1263L65.4884 80.0886C65.5266 80.0961 65.4946 80.0221 65.5233 80.0301L65.522 80.0018L65.5314 80.0014L65.5295 79.9636C65.5672 79.9618 65.5442 79.8778 65.5819 79.876L65.5805 79.8477C65.6079 79.8274 65.6324 79.7506 65.6405 79.7218C65.6589 79.7115 65.6768 79.6917 65.666 79.6639L65.6754 79.6634C65.6641 79.6261 65.7117 79.6332 65.7004 79.596L65.7099 79.5955C65.7245 79.5097 65.8066 79.4489 65.8217 79.3726C66.0851 78.9625 66.523 78.4493 66.9235 78.1365C67.0527 78.0734 67.1692 77.9447 67.3173 77.8807L67.3168 77.8713L67.3451 77.8699L67.3447 77.8605L67.373 77.8591L67.3725 77.8496L67.4008 77.8482L67.4003 77.8388L67.4286 77.8374L67.4282 77.828L67.4564 77.8266L67.456 77.8171L67.4843 77.8157L67.4838 77.8063L67.5121 77.8049L67.5116 77.7955L67.5399 77.7941C67.5286 77.7568 67.6055 77.7814 67.5946 77.7536L67.6229 77.7522L67.6225 77.7427L67.6602 77.7409C67.6489 77.7036 67.7257 77.7282 67.7149 77.7004L67.7526 77.6985L67.7522 77.6891L67.7804 77.6877L67.78 77.6782L67.8177 77.6764L67.8172 77.6669L67.8455 77.6656L67.8451 77.6561C67.8734 77.6547 67.9012 77.6439 67.9295 77.6425L67.929 77.6331L67.9667 77.6312L67.9663 77.6218L68.004 77.6199L68.0035 77.6105L68.0412 77.6086L68.0408 77.5992L68.0785 77.5973L68.078 77.5879L68.1157 77.586L68.1153 77.5766C68.153 77.5747 68.1903 77.5635 68.228 77.5616L68.2275 77.5522L68.2652 77.5503L68.2648 77.5409C68.3025 77.539 68.3492 77.5272 68.3869 77.5254L68.3864 77.5159L68.443 77.5132L68.4425 77.5037L68.5274 77.4995L68.527 77.4901L68.593 77.4868L68.5925 77.4774L68.6774 77.4732L68.6769 77.4638L68.7901 77.4582L68.7896 77.4488L68.9122 77.4427L68.9117 77.4333C69.0734 77.4537 69.3894 77.3435 69.5436 77.4021L69.7322 77.3928L69.7326 77.4022L69.8552 77.3961L69.8557 77.4056C70.1777 77.418 70.5403 77.4852 70.8198 77.5943L70.8481 77.5929L70.8486 77.6023L70.8863 77.6005L70.8867 77.6099L70.915 77.6085L70.9155 77.6179L70.9532 77.6161C70.9457 77.6543 71.0197 77.6222 71.0117 77.651L71.0494 77.6491C71.0512 77.6869 71.1352 77.6638 71.1371 77.7015L71.1653 77.7001L71.1658 77.7096L71.1941 77.7082L71.1946 77.7176L71.2229 77.7162C71.3779 77.7936 71.5618 77.8791 71.698 77.9574C72.1863 78.2736 72.7777 78.7643 73.0664 79.2511L73.0759 79.2506C73.0782 79.2978 73.1461 79.3323 73.1484 79.3794C73.1677 79.3879 73.1875 79.4058 73.1795 79.4346L73.1889 79.4341C73.2101 79.4804 73.2417 79.545 73.2812 79.5808L73.2831 79.6185C73.3204 79.6073 73.2958 79.6841 73.3236 79.6733L73.325 79.7016L73.3344 79.7011L73.3358 79.7294C73.3736 79.7275 73.3589 79.8133 73.3966 79.8115L73.3985 79.8492L73.4079 79.8487L73.4093 79.877C73.4917 80.0147 73.5779 80.2279 73.615 80.4057L73.6245 80.4052L73.6272 80.4618L73.6367 80.4613L73.6395 80.5179L73.6489 80.5175L73.6522 80.5835L73.6616 80.583C73.6681 80.715 73.7411 80.8532 73.7382 80.9857L73.7476 80.9852L73.7542 81.1173L73.7636 81.1168C73.9358 82.4979 73.9848 84.0648 74.0706 85.6109ZM61.8943 82.9224C62.0189 82.765 62.0232 82.6608 62.0007 82.3973L61.9392 81.1525L61.9298 81.1529C61.9284 81.1246 61.9171 81.0874 61.9157 81.0591L61.9063 81.0595L61.9049 81.0313L61.8955 81.0317C61.8857 80.8337 61.7915 80.6493 61.7728 80.4611L61.7633 80.4616C61.7511 80.4055 61.7389 80.3494 61.7271 80.3027L61.7177 80.3031C61.7059 80.2565 61.6937 80.2003 61.682 80.1537L61.6725 80.1541L61.6707 80.1164L61.6612 80.1169L61.6594 80.0791L61.6499 80.0796L61.6481 80.0419L61.6386 80.0424L61.6358 79.9858L61.6264 79.9862L61.6246 79.9485L61.6151 79.949L61.6133 79.9113L61.6038 79.9117L61.602 79.874L61.5925 79.8745L61.5907 79.8368L61.5812 79.8372L61.5798 79.8089L61.5704 79.8094C61.5591 79.7721 61.5474 79.7255 61.5361 79.6882L61.5266 79.6887L61.5252 79.6604L61.5158 79.6608L61.514 79.6231L61.5045 79.6236L61.5031 79.5953L61.4937 79.5958L61.4918 79.558L61.4824 79.5585L61.481 79.5302L61.4716 79.5307L61.4697 79.493L61.4603 79.4934L61.4589 79.4651L61.4494 79.4656L61.4476 79.4279L61.4382 79.4283L61.4368 79.4L61.4273 79.4005L61.4259 79.3722L61.4165 79.3727L61.4151 79.3444L61.4057 79.3449L61.4038 79.3071C61.3661 79.309 61.3808 79.2232 61.343 79.2251L61.3416 79.1968L61.3322 79.1972L61.3308 79.1689L61.3214 79.1694L61.3195 79.1317C61.2818 79.1336 61.2965 79.0477 61.2588 79.0496L61.2574 79.0213C61.2182 78.9949 61.1943 78.8921 61.1556 78.8751L61.1542 78.8468L61.1448 78.8473C61.101 78.7265 60.9926 78.6374 60.9493 78.5261L60.9399 78.5265C60.9074 78.443 60.8197 78.3907 60.7962 78.2973C60.6256 78.0977 60.4433 77.8515 60.2166 77.6642C59.8557 77.2471 59.3589 76.9503 58.9574 76.6676L58.9291 76.669C58.8598 76.6062 58.7528 76.5453 58.676 76.5208L58.6755 76.5113C58.618 76.4953 58.5497 76.4514 58.5106 76.425L58.4823 76.4264L58.4818 76.4169L58.4535 76.4183L58.453 76.4089L58.4248 76.4103L58.4243 76.4009L58.396 76.4023L58.3955 76.3928L58.3672 76.3942C58.3748 76.356 58.3008 76.3881 58.3088 76.3593L58.2805 76.3607L58.28 76.3513L58.2518 76.3527L58.2513 76.3432L58.223 76.3446C58.2211 76.3069 58.1372 76.33 58.1353 76.2922C58.1165 76.2932 58.0877 76.2851 58.0689 76.2861C58.0764 76.2479 58.0024 76.2799 58.0104 76.2511L57.9727 76.253L57.9722 76.2436L57.9439 76.245L57.9435 76.2355C57.9246 76.2365 57.8958 76.2284 57.877 76.2294L57.8765 76.2199L57.8388 76.2218C57.8464 76.1836 57.7723 76.2156 57.7804 76.1869L57.7426 76.1887L57.7422 76.1793L57.7045 76.1812L57.704 76.1717L57.6757 76.1731L57.6752 76.1637C57.6469 76.1651 57.6182 76.1571 57.5899 76.1585L57.5894 76.149L57.5611 76.1504C57.5013 76.0872 57.323 76.1149 57.2726 76.0512L57.216 76.054L57.2156 76.0446L57.1779 76.0465L57.1774 76.037L57.1397 76.0389L57.1392 76.0295C57.0072 76.036 56.871 75.9576 56.7389 75.9642L56.7385 75.9547L56.6819 75.9575L56.6814 75.9481L56.6154 75.9514L56.615 75.9419L56.5301 75.9461L56.5296 75.9367L56.4636 75.9399L56.4631 75.9305L56.3783 75.9347L56.3778 75.9253C56.1609 75.936 55.9313 75.8812 55.7149 75.9013L55.7144 75.8919C55.365 75.8997 55.0166 75.9263 54.6785 75.9714L54.6789 75.9808C54.5182 75.9793 54.3611 76.0532 54.2008 76.0611L54.2013 76.0706C54.1541 76.0729 54.1074 76.0847 54.0697 76.0865L54.0702 76.096L54.0041 76.0992L54.0046 76.1087C53.9485 76.1209 53.883 76.1336 53.8268 76.1458L53.8273 76.1552L53.7707 76.158L53.7712 76.1674L53.7146 76.1702L53.7151 76.1797L53.6773 76.1815L53.6778 76.191C53.6401 76.1928 53.6028 76.2041 53.5651 76.206L53.5656 76.2154L53.5279 76.2173L53.5283 76.2267L53.4906 76.2286L53.4911 76.238L53.4345 76.2408L53.435 76.2502L53.3972 76.2521L53.3977 76.2615L53.36 76.2634L53.3605 76.2728L53.3227 76.2747L53.3232 76.2841C53.2949 76.2855 53.2671 76.2963 53.2388 76.2977L53.2393 76.3072L53.211 76.3085L53.2114 76.318C53.1831 76.3194 53.1553 76.3302 53.127 76.3316L53.1275 76.341L53.0992 76.3424L53.0997 76.3519C53.0714 76.3533 53.0435 76.3641 53.0152 76.3655L53.0157 76.3749L52.9874 76.3763L52.9879 76.3857L52.9502 76.3876L52.9506 76.397L52.9223 76.3984L52.9228 76.4079L52.8851 76.4097L52.8856 76.4192L52.8573 76.4205L52.8577 76.43L52.82 76.4318C52.8313 76.4691 52.7545 76.4445 52.7653 76.4724L52.7276 76.4742C52.7389 76.5115 52.662 76.4869 52.6729 76.5147L52.6446 76.5161L52.645 76.5256L52.6073 76.5274L52.6078 76.5369L52.5795 76.5383C52.5908 76.5755 52.5139 76.5509 52.5248 76.5788L52.4965 76.5802L52.4969 76.5896L52.4686 76.591L52.4691 76.6004L52.4408 76.6018L52.4413 76.6113L52.413 76.6127L52.4135 76.6221L52.3852 76.6235L52.3856 76.6329L52.3573 76.6343L52.3578 76.6437L52.3295 76.6451L52.33 76.6546C52.1088 76.7695 51.9177 76.9207 51.7455 77.071C51.179 77.4677 50.6072 78.1387 50.2192 78.7062C50.2206 78.7345 50.1848 78.7741 50.1668 78.7939C50.0993 78.9579 49.9653 79.1158 49.9081 79.2982L49.8987 79.2987C49.7212 79.7234 49.4898 80.2075 49.4103 80.703L49.4009 80.7034C49.4023 80.7317 49.3947 80.7699 49.3961 80.7982L49.3867 80.7987L49.3886 80.8364L49.3791 80.8369L49.3819 80.8934L49.3725 80.8939C49.3743 80.9316 49.3668 80.9698 49.3686 81.0075L49.3592 81.008L49.3625 81.074L49.353 81.0745L49.3558 81.1311L49.3464 81.1315L49.3497 81.1975L49.3402 81.198L49.3435 81.264L49.3341 81.2645L49.3373 81.3305L49.3279 81.331C49.3307 81.3875 49.3241 81.4446 49.3264 81.4917L49.317 81.4922C49.3202 81.5582 49.314 81.6247 49.3178 81.7001L49.3083 81.7006L49.3139 81.8138L49.3045 81.8142L49.3124 81.9745L49.303 81.975L49.3165 82.2485L49.3071 82.249L49.3299 82.711C49.3916 82.812 49.3542 83.0123 49.3791 83.134L49.3885 83.1335L49.3946 83.2561L49.404 83.2557L49.4096 83.3688L49.4191 83.3684C49.4185 83.548 49.5216 83.7225 49.5305 83.9017L49.5399 83.9012C49.5521 83.9574 49.5644 84.0135 49.5761 84.0602L49.5855 84.0597C49.5874 84.0974 49.5987 84.1347 49.6006 84.1724L49.61 84.1719C49.6114 84.2002 49.6227 84.2375 49.6241 84.2658L49.6335 84.2653L49.6354 84.303L49.6448 84.3026L49.6467 84.3403L49.6561 84.3398L49.6589 84.3964L49.6683 84.3959L49.6702 84.4336L49.6796 84.4332L49.6815 84.4709L49.6909 84.4704L49.6928 84.5082L49.7022 84.5077L49.7041 84.5454L49.7135 84.5449C49.7149 84.5732 49.7257 84.6011 49.7271 84.6294L49.7365 84.6289L49.7379 84.6572L49.7474 84.6567C49.7488 84.685 49.7596 84.7128 49.761 84.7411L49.7704 84.7407L49.7718 84.7689L49.7813 84.7685L49.7831 84.8062L49.7925 84.8057C49.7935 84.8246 49.8043 84.8524 49.8052 84.8713L49.8147 84.8708L49.8161 84.8991L49.8255 84.8986L49.8274 84.9364L49.8368 84.9359L49.8382 84.9642L49.8476 84.9637L49.8495 85.0014C49.8867 84.9901 49.8622 85.067 49.89 85.0562L49.8919 85.0939C49.9296 85.092 49.9149 85.1778 49.9526 85.176L49.954 85.2043L49.9635 85.2038L49.9649 85.2321L49.9743 85.2316L49.9762 85.2693C50.0139 85.2675 49.9992 85.3533 50.0369 85.3514L50.0383 85.3797L50.0477 85.3792L50.0491 85.4075C50.0784 85.425 50.1104 85.499 50.1212 85.5269C50.1405 85.5354 50.1603 85.5533 50.1523 85.582L50.1617 85.5816C50.6261 86.3716 51.4786 87.1709 52.2978 87.6787C52.4519 87.7373 52.5904 87.8628 52.7635 87.9204L52.7639 87.9298C52.8323 87.9737 52.9657 87.9955 53.0345 88.0488L53.0628 88.0474L53.0632 88.0569L53.0915 88.0555L53.092 88.0649L53.1203 88.0635L53.1208 88.0729L53.149 88.0715C53.1603 88.1088 53.2447 88.0952 53.2655 88.132L53.2938 88.1306L53.2942 88.14L53.332 88.1381C53.3244 88.1763 53.3984 88.1443 53.3904 88.173L53.4281 88.1712C53.4206 88.2094 53.4946 88.1774 53.4866 88.2061L53.5243 88.2042L53.5248 88.2137L53.553 88.2123L53.5535 88.2217L53.5912 88.2198L53.5917 88.2293L53.62 88.2279C54.0631 88.3951 54.5977 88.501 55.0904 88.5239L55.0909 88.5334L55.204 88.5278L55.2045 88.5372L55.3271 88.5312L55.3276 88.5406L55.4785 88.5331L55.4789 88.5426L55.743 88.5295L55.7434 88.539L56.1961 88.5166L56.1956 88.5072C56.3371 88.5002 56.4686 88.4842 56.6007 88.4777L56.6002 88.4683C56.9392 88.4421 57.2646 88.3315 57.5919 88.2586L57.5914 88.2492C57.6381 88.2374 57.6942 88.2252 57.7409 88.2134L57.7404 88.204C57.7871 88.1922 57.8338 88.1805 57.8711 88.1692L57.8706 88.1598L57.9083 88.1579L57.9079 88.1485L57.9456 88.1466L57.9451 88.1372L57.9828 88.1353L57.9824 88.1259L58.0201 88.124L58.0196 88.1146C58.0569 88.1033 58.1036 88.0915 58.1408 88.0802L58.1404 88.0708L58.1687 88.0694L58.1682 88.06C58.1965 88.0586 58.2243 88.0478 58.2526 88.0464L58.2521 88.0369L58.2804 88.0355L58.2799 88.0261C58.3082 88.0247 58.3361 88.0139 58.3644 88.0125L58.3639 88.0031L58.3922 88.0017L58.3917 87.9922L58.4294 87.9904C58.4182 87.9531 58.495 87.9777 58.4842 87.9499L58.5219 87.948L58.5214 87.9386L58.5497 87.9372L58.5492 87.9277L58.587 87.9259C58.5757 87.8886 58.6525 87.9132 58.6417 87.8854L58.67 87.884L58.6695 87.8745C58.7072 87.8727 58.753 87.842 58.7799 87.8124L58.8082 87.811L58.8077 87.8015L58.836 87.8001L58.8355 87.7907C59.1128 87.6636 59.3478 87.444 59.577 87.3003C59.6214 87.2414 59.7138 87.199 59.7582 87.1401C59.9591 86.9979 60.1483 86.8089 60.3177 86.602C60.4196 86.5592 60.4692 86.4149 60.5225 86.3461L60.5211 86.3178L60.5305 86.3174C60.6114 85.8501 60.1113 85.6763 59.8517 85.3961C59.6745 85.2536 59.5317 85.0432 59.3479 84.9578C59.3555 84.9196 59.2814 84.9516 59.2895 84.9228L59.2517 84.9247L59.2513 84.9153L59.1853 84.9185L59.1848 84.9091L59.1188 84.9124L59.1192 84.9218L59.0532 84.925C58.7231 85.1304 58.4484 85.5032 58.1465 85.7072C58.0626 85.7302 58.0102 85.8179 57.9168 85.8414L57.9173 85.8509L57.889 85.8523L57.8895 85.8617C57.8343 85.8928 57.7602 85.9248 57.7149 85.9648L57.6772 85.9667L57.6777 85.9761L57.6494 85.9775C57.6513 86.0152 57.5655 86.0006 57.5673 86.0383L57.5296 86.0402C57.5409 86.0774 57.464 86.0529 57.4749 86.0807L57.4372 86.0825L57.4376 86.092L57.4093 86.0934L57.4098 86.1028C57.3815 86.1042 57.3537 86.115 57.3254 86.1164L57.3259 86.1258L57.2976 86.1272C57.0391 86.2534 56.7033 86.3457 56.403 86.3889L56.4034 86.3983L56.2903 86.4039L56.2907 86.4133C56.0276 86.4452 55.6787 86.4624 55.4137 86.4566L55.4132 86.4472L55.2907 86.4532L55.2902 86.4438L55.177 86.4494L55.1766 86.44L55.0917 86.4442L55.0912 86.4347C54.8258 86.4195 54.5297 86.3585 54.2983 86.2659L54.27 86.2673L54.2695 86.2579L54.2318 86.2597L54.2313 86.2503C54.2125 86.2512 54.1837 86.2432 54.1648 86.2441L54.1644 86.2347L54.1361 86.2361L54.1356 86.2267L54.0979 86.2285C54.1055 86.1904 54.0314 86.2224 54.0395 86.1936L54.0017 86.1955C53.9999 86.1578 53.9159 86.1808 53.9141 86.1431L53.8858 86.1445L53.8853 86.1351L53.857 86.1365L53.8566 86.127L53.8283 86.1284L53.8278 86.119L53.7995 86.1204L53.799 86.111C53.6166 86.0538 53.4592 85.9292 53.3046 85.8612C52.7475 85.4917 52.1915 84.952 51.8891 84.3808L51.8797 84.3813L51.8783 84.353L51.8688 84.3534L51.8675 84.3251L51.858 84.3256L51.8566 84.2973L51.8472 84.2978L51.8458 84.2695L51.8364 84.2699L51.835 84.2417L51.8255 84.2421L51.8241 84.2138L51.8147 84.2143L51.8133 84.186L51.8039 84.1865C51.8029 84.1676 51.7921 84.1398 51.7912 84.1209C51.7539 84.1322 51.7785 84.0554 51.7507 84.0662L51.7488 84.0285L51.7394 84.029L51.738 84.0007L51.7286 84.0011C51.7276 83.9823 51.7168 83.9544 51.7159 83.9356L51.7064 83.936L51.7046 83.8983L51.6951 83.8988L51.6937 83.8705L51.6843 83.871C51.6589 83.7399 51.5784 83.6399 51.5521 83.4899C54.897 83.268 58.462 83.2905 61.8943 82.9224ZM51.3786 81.1257L51.3767 81.088L51.3861 81.0875C51.3848 81.0592 51.3928 81.0305 51.3914 81.0022L51.4008 81.0017C51.4084 80.9635 51.4155 80.9159 51.4231 80.8777L51.4325 80.8772L51.4311 80.849L51.4405 80.8485C51.4391 80.8202 51.4471 80.7914 51.4457 80.7632C51.4839 80.7707 51.4519 80.6967 51.4807 80.7047L51.4788 80.667C51.5165 80.6651 51.4935 80.5812 51.5312 80.5793L51.5298 80.551L51.5392 80.5506L51.5378 80.5223L51.5473 80.5218L51.5459 80.4935L51.5553 80.4931L51.5539 80.4648L51.5633 80.4643L51.5619 80.436L51.5714 80.4355L51.57 80.4072L51.5794 80.4068C51.5945 80.3304 51.6667 80.2607 51.6819 80.1843L51.6913 80.1838C51.9222 79.6903 52.4157 79.1555 52.8516 78.7936C53.0082 78.7103 53.1431 78.5712 53.319 78.4964L53.3185 78.487L53.3468 78.4856L53.3464 78.4761L53.3747 78.4747L53.3742 78.4653L53.4025 78.4639L53.402 78.4545L53.4303 78.4531L53.4298 78.4436L53.4581 78.4422L53.4577 78.4328L53.486 78.4314C53.4841 78.3937 53.5699 78.4084 53.568 78.3706L53.6058 78.3688C54.2317 78.0259 55.0658 77.8807 55.815 77.9288L55.8155 77.9382L55.9098 77.9336L55.9102 77.943L55.9951 77.9388L55.9956 77.9483L56.0805 77.9441L56.0809 77.9535L56.1469 77.9502L56.1474 77.9597L56.204 77.9569L56.2044 77.9663L56.2705 77.963L56.2709 77.9725L56.3275 77.9697L56.328 77.9791L56.3846 77.9763L56.385 77.9857C56.4326 77.9928 56.4897 77.9995 56.5373 78.0066L56.5378 78.016L56.5755 78.0142L56.576 78.0236L56.6137 78.0217L56.6141 78.0311L56.6519 78.0293L56.6523 78.0387L56.69 78.0369L56.6905 78.0463L56.7282 78.0444L56.7287 78.0539C56.7669 78.0614 56.8145 78.0685 56.8527 78.0761L56.8532 78.0855L56.8814 78.0841L56.8819 78.0936L56.9196 78.0917C56.9121 78.1299 56.9861 78.0979 56.9781 78.1266L57.0158 78.1248L57.0163 78.1342L57.0446 78.1328C57.037 78.171 57.111 78.139 57.103 78.1677L57.1313 78.1663L57.1318 78.1757L57.1601 78.1743L57.1605 78.1838L57.1888 78.1824L57.1893 78.1918L57.2176 78.1904L57.218 78.1998L57.2463 78.1984L57.2468 78.2079L57.2751 78.2065L57.2755 78.2159L57.3038 78.2145L57.3043 78.2239L57.3326 78.2225L57.3331 78.232C58.0769 78.5545 58.7894 79.1999 59.1836 79.9084L59.193 79.9079C59.2241 79.9631 59.2561 80.0371 59.2962 80.0824L59.2981 80.1201L59.3075 80.1197L59.3089 80.148C59.3466 80.1461 59.3319 80.2319 59.3697 80.23L59.3715 80.2678L59.381 80.2673L59.3824 80.2956L59.3918 80.2951C59.3932 80.3234 59.404 80.3512 59.4054 80.3795L59.4148 80.3791L59.4162 80.4073L59.4257 80.4069C59.4271 80.4352 59.4379 80.463 59.4393 80.4913L59.4487 80.4908C59.4501 80.5191 59.4609 80.5469 59.4623 80.5752L59.4718 80.5748L59.4736 80.6125L59.4831 80.612L59.4849 80.6497L59.4944 80.6493L59.4962 80.687L59.5056 80.6865L59.5084 80.7431L59.5179 80.7426C59.5193 80.7709 59.5306 80.8082 59.532 80.8365L59.5414 80.836L59.5419 80.8455L51.1866 81.2581C51.3492 81.2973 51.3338 81.1752 51.3786 81.1257Z" fill="#FE001C"/> -<path d="M75.6282 64.3946C75.6471 64.6271 75.4681 64.8288 75.234 64.8479L67.3332 65.4929C67.1007 65.5119 66.8963 65.3415 66.8773 65.109L66.7793 63.9086C66.7605 63.6773 66.9343 63.4739 67.1669 63.4549L75.0676 62.8099C75.3018 62.7908 75.5113 62.9629 75.5302 63.1942L75.6282 64.3946Z" fill="#FAB200"/> -<path d="M84.9866 43.866L85.5686 50.9957C86.1753 50.4158 87.1929 50.1557 88.801 49.9205L88.5349 46.7075L91.1166 46.4968C92.4692 46.3256 95.4557 45.6798 95.2331 43.0295L84.9866 43.866Z" fill="#71B857"/> -<path d="M93.3035 49.4707L93.9874 49.4149C93.9874 49.4149 94.0251 49.897 94.0405 50.0853C94.1613 51.5656 92.9021 52.4239 90.304 52.636L89.0276 52.7402L89.2278 55.1921C89.2982 56.0551 89.2522 58.064 87.2755 58.2673L86.1694 58.3576L85.8762 54.7661C85.8511 50.5957 91.3694 49.6735 93.3035 49.4707Z" fill="#71B857"/> -<path d="M77.7604 44.4594L70.5723 45.0438L71.7552 59.5339C74.2357 59.0248 75.0564 57.7816 75.0485 56.0483L74.3801 47.8612L77.5398 47.6032C77.5789 47.6026 77.6232 47.6014 77.6678 47.6002C77.7445 47.5982 77.8218 47.5961 77.8742 47.5967C79.3875 47.6501 80.3956 48.2193 80.735 51.1821C80.7556 51.2975 80.7628 51.4285 80.7693 51.5476C80.7721 51.6001 80.7749 51.6505 80.7786 51.6959C81.0944 56.5149 77.487 58.293 75.4658 58.9994L75.4554 59.004C75.4315 59.0161 75.4148 59.0297 75.4168 59.0544L75.4274 59.184C75.4295 59.2103 75.4521 59.2285 75.4738 59.2295L75.4809 59.2298L75.7229 59.21C78.7329 58.9643 84.7234 57.7516 84.1932 51.2574L84.1836 51.1387C83.6886 45.5133 81.0952 44.1871 77.7604 44.4594Z" fill="#00B1AF"/> -<path d="M64.5543 48.6772L62.8542 48.8021C62.7458 48.811 62.6399 48.8151 62.5312 48.8162C60.4253 48.8402 59.1009 47.3701 58.5461 46.5877C58.4206 46.4284 58.3001 46.2641 58.1846 46.0897C58.1846 46.0897 58.1714 46.0553 58.1888 46.0539L63.0482 45.6572C64.6742 45.5244 65.3596 45.5679 66.102 45.7862C66.277 45.8347 66.4601 45.8972 66.6547 45.9674C67.7375 46.3641 68.515 47.1699 68.8883 48.2545C68.9428 48.4037 68.9829 48.5647 69.0193 48.7261C69.0686 48.9385 69.105 49.161 69.1239 49.3927C69.2679 51.1149 68.4749 52.1683 67.3231 52.9546C67.3216 52.9576 67.3028 52.9705 67.3028 52.9705C67.2868 52.978 67.2868 52.978 67.2779 52.9864C67.2651 52.994 67.2538 53.002 67.2433 53.0095C67.2365 53.0143 67.2301 53.0189 67.2236 53.0231C67.2199 53.0234 67.2033 53.0378 67.2033 53.0378C67.068 53.1189 66.9329 53.1732 66.8064 53.2149C66.7865 53.2207 66.7675 53.2274 66.7497 53.2337C66.7341 53.2392 66.7194 53.2444 66.7058 53.2484L66.4289 49.8557C66.299 48.8136 65.34 48.6167 64.8011 48.6607C64.7841 48.6621 64.7665 48.6637 64.7484 48.6654C64.6895 48.6708 64.6251 48.6767 64.5543 48.6772Z" fill="#009BC4"/> -<path d="M61.2656 52.9109C60.4493 53.0089 60.4307 53.7569 60.4331 53.9031L60.6117 56.0909L63.6868 55.8399C63.9765 56.1929 64.2647 56.5423 64.5326 56.8671L64.8372 57.2365C65.2234 57.6979 65.5935 58.1329 65.746 58.2986C65.7564 58.3101 65.7686 58.3245 65.783 58.3413C65.9773 58.5701 66.563 59.2596 68.4146 59.5493C69.0919 59.6544 69.8278 59.6421 70.2394 59.6352C70.3139 59.6339 70.3783 59.6328 70.4292 59.6327L70.6122 59.6267L70.59 59.5935C70.59 59.5935 70.2244 59.1724 69.7512 58.5L69.6481 58.3533C68.9965 57.4266 66.7863 54.2832 66.3612 53.6691C65.9782 53.1153 65.4227 52.9001 64.8632 52.7876L64.8579 52.788C64.4575 52.7131 64.0242 52.7073 63.7009 52.7174C63.6866 52.7179 63.6726 52.7182 63.6586 52.7185C63.6342 52.719 63.6099 52.7195 63.585 52.7215L61.2656 52.9109Z" fill="#009BC4"/> -<path d="M57.556 53.214C58.3386 53.186 58.5012 53.8617 58.5286 54.0401L58.8184 57.5891C58.8026 57.6128 58.7866 57.637 58.7705 57.6614C58.7015 57.7659 58.6296 57.8748 58.5539 57.9736C58.4148 58.1517 58.1921 58.4271 58.1075 58.5204C56.5608 60.2286 54.6393 60.9615 52.8035 61.1114C51.2946 61.2346 49.1799 60.9327 47.2745 59.4016C44.041 56.7921 43.6377 52.2237 46.4358 49.1491C46.9545 48.5832 47.1559 48.3711 48.0079 47.7968C49.1835 47.0016 50.5606 46.647 51.689 46.5549C52.6797 46.474 53.7816 46.5973 54.6209 46.8627C54.8163 46.923 55.0372 46.9959 55.3181 47.127C56.0702 47.479 57.0719 48.1222 57.6361 49.2222L57.6365 49.2274L48.7743 49.9509L49.2086 55.2698C49.3532 56.2124 49.6232 56.9479 50.2555 57.4287C50.7663 57.8188 51.5161 58.0405 52.6283 58.061C52.9847 58.0698 53.382 58.0558 53.8215 58.0199L55.7472 57.8582C55.7286 57.8536 55.6519 57.8142 55.358 57.5079C54.992 57.1224 54.8597 56.4221 54.8166 55.8944L54.815 55.8946L54.6157 53.4532L57.556 53.214Z" fill="#0053A2"/> -<path d="M147.733 137.116L144.085 137.116L142.35 123.051L147.734 123.051L147.733 137.116Z" fill="#FFB8B8"/> -<path d="M141.479 136.074H148.514V140.502H137.049C137.049 139.921 137.163 139.345 137.386 138.808C137.609 138.27 137.935 137.782 138.346 137.371C138.758 136.96 139.246 136.634 139.783 136.411C140.321 136.189 140.897 136.074 141.479 136.074Z" fill="#61616F"/> -<path d="M167.397 137.116L163.748 137.116L162.014 123.051L167.398 123.051L167.397 137.116Z" fill="#FFB8B8"/> -<path d="M161.143 136.074H168.178V140.502H156.713C156.713 139.921 156.827 139.345 157.05 138.808C157.273 138.27 157.599 137.782 158.01 137.371C158.422 136.96 158.91 136.634 159.448 136.411C159.985 136.189 160.561 136.074 161.143 136.074Z" fill="#61616E"/> -<path d="M156.713 37.1299C161.041 37.1299 164.55 33.6225 164.55 29.2959C164.55 24.9693 161.041 21.4619 156.713 21.4619C152.384 21.4619 148.875 24.9693 148.875 29.2959C148.875 33.6225 152.384 37.1299 156.713 37.1299Z" fill="#FFB8B8"/> -<path d="M115.888 62.7917C116.171 62.459 116.525 62.1925 116.923 62.011C117.32 61.8295 117.753 61.7375 118.191 61.7414C118.628 61.7453 119.059 61.8451 119.454 62.0336C119.849 62.2221 120.197 62.4949 120.475 62.8327L127.016 60.8456L129.195 64.5258L119.919 67.2021C119.32 67.6311 118.585 67.8257 117.853 67.7491C117.121 67.6724 116.442 67.3298 115.945 66.7861C115.448 66.2425 115.168 65.5356 115.157 64.7994C115.147 64.0632 115.407 63.3489 115.888 62.7917Z" fill="#FFB8B8"/> -<path d="M167.61 85.6938C167.424 85.2983 167.326 84.8668 167.324 84.4295C167.322 83.9923 167.417 83.56 167.6 83.1631C167.784 82.7661 168.052 82.4143 168.386 82.1322C168.721 81.8501 169.113 81.6448 169.535 81.5306L170.414 74.7527L174.665 74.2822L173.289 83.8365C173.434 84.5583 173.309 85.3081 172.938 85.9439C172.567 86.5798 171.975 87.0574 171.275 87.2863C170.575 87.5152 169.815 87.4796 169.14 87.1861C168.464 86.8926 167.92 86.3616 167.61 85.6938L167.61 85.6938Z" fill="#FFB8B8"/> -<path d="M163.262 44.0924C163.679 43.5575 164.229 43.142 164.858 42.8877C165.487 42.6335 166.172 42.5495 166.843 42.6443C167.515 42.7391 168.15 43.0093 168.684 43.4277C169.217 43.846 169.631 44.3977 169.884 45.0271L176.308 61.0518C176.964 62.6894 177.174 64.4719 176.914 66.217L174.822 80.3018C174.795 80.4835 174.729 80.6573 174.628 80.8112C174.528 80.9651 174.396 81.0955 174.24 81.1935C174.085 81.2915 173.91 81.3548 173.728 81.3791C173.545 81.4033 173.36 81.388 173.184 81.334L170.428 80.4878C170.142 80.4002 169.896 80.2153 169.733 79.9653C169.57 79.7153 169.5 79.416 169.535 79.1196C170.508 70.8275 169.222 62.4266 165.813 54.8047L162.784 48.0337C162.498 47.3952 162.392 46.6911 162.476 45.9968C162.56 45.3025 162.832 44.6442 163.262 44.0924Z" fill="#F1C017"/> -<path d="M158.62 37.129C159.8 37.1544 160.972 36.9301 162.058 36.4707C163.145 36.0114 164.122 35.3273 164.926 34.4636C165.729 33.5999 166.34 32.576 166.72 31.4593C167.099 30.3425 167.237 29.1582 167.126 27.9842C167.015 26.8101 166.656 25.6729 166.074 24.6472C165.492 23.6215 164.699 22.7306 163.747 22.0331C162.796 21.3355 161.708 20.8471 160.554 20.5999C159.4 20.3527 158.207 20.3523 157.054 20.5987C155.33 19.5527 153.326 18.8488 151.318 19.0278C149.309 19.2068 147.323 20.3987 146.572 22.2691C145.821 24.1396 146.628 26.6051 148.495 27.3653C149.692 27.8526 151.044 27.6163 152.322 27.4197C153.6 27.2232 154.994 27.095 156.106 27.7539C157.218 28.4129 157.717 30.1798 156.722 31.0036C156.194 31.4576 155.817 32.0617 155.641 32.7352C155.465 33.4088 155.499 34.1199 155.737 34.7738C156.238 36.0676 157.604 37.107 158.62 37.129Z" fill="#61616F"/> -<path d="M168.345 80.0762L169.735 132.813C169.74 132.989 169.708 133.164 169.642 133.327C169.576 133.49 169.476 133.637 169.35 133.76C169.225 133.883 169.075 133.978 168.91 134.04C168.745 134.103 168.57 134.13 168.394 134.121L163.814 133.887C163.522 133.873 163.244 133.758 163.026 133.562C162.808 133.367 162.665 133.102 162.619 132.814L157.171 98.5606C157.148 98.414 157.074 98.2801 156.963 98.182C156.851 98.0839 156.709 98.0277 156.561 98.0231C156.412 98.0185 156.267 98.0658 156.149 98.1567C156.032 98.2477 155.95 98.3767 155.918 98.5216L148.544 131.501C148.505 131.677 148.428 131.843 148.32 131.988C148.211 132.132 148.074 132.252 147.915 132.34C147.757 132.427 147.582 132.48 147.402 132.494C147.222 132.509 147.041 132.486 146.871 132.425L142.325 132.148C142.062 132.054 141.837 131.877 141.685 131.644C141.532 131.41 141.46 131.133 141.48 130.855L145.448 79.5771L168.345 80.0762Z" fill="#61616F"/> -<path d="M170.576 55.0278C171.343 47.0361 165.464 39.8076 157.452 39.239C154 38.994 148.641 38.9064 146.874 43.429C141.552 57.0531 150.869 56.722 147.659 68.5258C144.449 80.3297 141.614 81.0062 146.018 81.8585C150.422 82.7109 170.228 87.7424 169.415 79.4344C168.915 74.3277 169.811 62.9995 170.576 55.0278Z" fill="#F1C017"/> -<path d="M151.885 40.5461C152.548 40.6883 153.162 41.0029 153.665 41.4581C154.168 41.9133 154.542 42.493 154.749 43.1388C154.956 43.7845 154.99 44.4734 154.846 45.136C154.701 45.7985 154.385 46.4112 153.928 46.9123L143.268 58.608C141.445 60.608 139.123 62.0875 136.54 62.8951L124.319 66.7152C124.144 66.77 123.959 66.7863 123.777 66.763C123.594 66.7397 123.419 66.6772 123.263 66.58C123.107 66.4827 122.974 66.353 122.873 66.1996C122.772 66.0462 122.705 65.8727 122.677 65.6911L122.237 62.8416C122.192 62.5465 122.251 62.2448 122.405 61.9891C122.559 61.7334 122.798 61.5399 123.08 61.4421L123.96 61.1372C131.274 58.6021 137.767 54.1383 142.752 48.2176L148.128 41.832C148.579 41.297 149.166 40.8947 149.828 40.6681C150.49 40.4416 151.201 40.3994 151.885 40.5461Z" fill="#F1C017"/> -<path d="M190.681 141.258H108.35C108.266 141.258 108.185 141.224 108.125 141.165C108.065 141.105 108.031 141.024 108.031 140.939C108.031 140.854 108.065 140.773 108.125 140.714C108.185 140.654 108.266 140.62 108.35 140.62H190.681C190.765 140.62 190.847 140.654 190.906 140.714C190.966 140.773 191 140.854 191 140.939C191 141.024 190.966 141.105 190.906 141.165C190.847 141.224 190.765 141.258 190.681 141.258Z" fill="#CCCCCC"/> -<defs> -<linearGradient id="paint0_linear_11182_68748" x1="59" y1="27.1205" x2="38.4887" y2="134.992" gradientUnits="userSpaceOnUse"> -<stop stop-color="white"/> -<stop offset="1" stop-color="#E0E0E0"/> -</linearGradient> -</defs> -</svg> +<svg width="200" height="154" viewBox="0 0 200 154" fill="none" xmlns="http://www.w3.org/2000/svg"> + <g clip-path="url(#clip0_15339_1408)"> + <g filter="url(#filter0_d_15339_1408)"> + <mask id="path-1-outside-1_15339_1408" maskUnits="userSpaceOnUse" x="-13.1729" y="-12.2563" width="125.503" + height="126.606" fill="black"> + <rect fill="white" x="-13.1729" y="-12.2563" width="125.503" height="126.606" /> + <path d="M65.431 3.48441L12.6379 25.734L15.6664 50.6449L68.4595 28.3952L65.431 3.48441Z" /> + <path + d="M31.1395 70.0167L34.271 98.1208L87.0641 75.8711L83.9326 47.7671L68.4595 28.3952L15.6664 50.6449L31.1395 70.0167Z" /> + </mask> + <path + d="M68.0752 27.4706L15.2821 49.7202L16.0508 51.5695L68.8438 29.3199L68.0752 27.4706ZM12.6379 25.734L11.8693 23.8847L10.4748 24.4724L10.6581 25.9804L12.6379 25.734ZM65.431 3.48441L67.4108 3.23805L67.0915 0.611323L64.6623 1.63508L65.431 3.48441ZM15.6664 50.6449L13.6866 50.8912L13.7554 51.4575L14.1105 51.902L15.6664 50.6449ZM68.4595 28.3952L66.4797 28.6416L66.5485 29.2079L66.9036 29.6524L68.4595 28.3952ZM31.1395 70.0167L33.1217 69.7904L33.0573 69.2126L32.6954 68.7596L31.1395 70.0167ZM34.271 98.1208L32.2888 98.3471L32.585 101.005L35.0397 99.9701L34.271 98.1208ZM87.0641 75.8711L87.8327 77.7204L89.2127 77.1388L89.0463 75.6448L87.0641 75.8711ZM83.9326 47.7671L85.9147 47.5408L85.8504 46.963L85.4885 46.5099L83.9326 47.7671ZM13.4066 27.5834L66.1996 5.33375L64.6623 1.63508L11.8693 23.8847L13.4066 27.5834ZM17.6463 50.3985L14.6178 25.4877L10.6581 25.9804L13.6866 50.8912L17.6463 50.3985ZM63.4512 3.73077L66.4797 28.6416L70.4393 28.1489L67.4108 3.23805L63.4512 3.73077ZM36.2532 97.8944L33.1217 69.7904L29.1573 70.2431L32.2888 98.3471L36.2532 97.8944ZM86.2955 74.0218L33.5024 96.2714L35.0397 99.9701L87.8327 77.7204L86.2955 74.0218ZM81.9504 47.9934L85.0819 76.0974L89.0463 75.6448L85.9147 47.5408L81.9504 47.9934ZM66.9036 29.6524L82.3767 49.0243L85.4885 46.5099L70.0154 27.138L66.9036 29.6524ZM32.6954 68.7596L17.2223 49.3877L14.1105 51.902L29.5836 71.2739L32.6954 68.7596Z" + fill="#7D96AC" mask="url(#path-1-outside-1_15339_1408)" /> + <path d="M31.1388 70.0169L83.9319 47.7673L87.0634 75.8713L34.2703 98.121L31.1388 70.0169Z" + fill="url(#paint0_radial_15339_1408)" /> + <path d="M31.1388 70.0167L83.9319 47.7671L68.4587 28.3953L15.6657 50.6449L31.1388 70.0167Z" fill="#394047" /> + <path d="M12.6379 25.734L65.4309 3.48437L68.4594 28.3952L15.6664 50.6448L12.6379 25.734Z" + fill="url(#paint1_radial_15339_1408)" /> + <mask id="mask0_15339_1408" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="36" y="51" width="44" + height="40"> + <path + d="M36.015 69.4336L77.8557 51.7998L79.809 64.232L63.1328 71.2602L64.0216 79.4038L38.5828 90.125L36.015 69.4336Z" + fill="#D87B39" /> + </mask> + <g mask="url(#mask0_15339_1408)"> + <rect width="53.0569" height="2.16916" transform="matrix(0.921504 -0.388368 0.385513 0.922702 33.1729 72.9854)" + fill="#3A98EC" /> + <path d="M33.6885 79.8804L80.4711 60.1639L80.935 62.3222L34.5247 81.8819L33.6885 79.8804Z" fill="#3A98EC" /> + <rect width="53.0569" height="2.16912" transform="matrix(0.921504 -0.388368 0.385513 0.922702 35.0684 86.604)" + fill="#3A98EC" /> + </g> + <mask id="mask1_15339_1408" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="21" y="31" width="57" + height="36"> + <path d="M64.8386 31.981L21.3619 50.3042L34.2644 66.6401L77.741 48.3169L64.8386 31.981Z" fill="#D87B39" /> + </mask> + <g mask="url(#mask1_15339_1408)"> + <rect width="53.0569" height="2.16915" transform="matrix(0.921504 -0.388368 0.385513 0.922702 24.707 58.3096)" + fill="#3A98EC" /> + <path d="M19.9365 53.0303L40.6341 44.3073L42.8239 46.2L20.9368 55.4243L19.9365 53.0303Z" fill="#3A98EC" /> + <rect width="53.0569" height="2.16914" transform="matrix(0.921504 -0.388368 0.385513 0.922702 28.7051 63.687)" + fill="#3A98EC" /> + </g> + <g clip-path="url(#clip1_15339_1408)"> + <path + d="M44.1463 24.9897C45.3811 28.0922 43.8762 31.605 40.7973 32.8411C37.7185 34.0772 34.2173 32.5743 32.9824 29.4717C31.7476 26.3692 33.2525 22.8563 36.3313 21.6203C39.4102 20.3842 42.9114 21.8871 44.1463 24.9897Z" + fill="#E0E0E0" stroke="#3A98EC" stroke-width="3" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M32.5076 31.6935C32.6122 30.2595 33.2288 28.0297 35.16 27.2544C36.5551 26.6943 37.5934 27.2705 38.6318 27.8467C39.6701 28.4229 40.7085 28.9991 42.1035 28.439C43.5312 27.8658 43.9953 26.4976 44.404 25.2927C44.6256 24.6394 44.8309 24.0341 45.1647 23.6295C45.303 23.886 45.428 24.1533 45.5385 24.4307C47.0781 28.299 45.2039 32.6884 41.3523 34.2348C38.1029 35.5393 34.4841 34.4035 32.5076 31.6935Z" + fill="#3A98EC" /> + </g> + </g> + <g filter="url(#filter1_d_15339_1408)"> + <mask id="path-16-outside-2_15339_1408" maskUnits="userSpaceOnUse" x="56.8817" y="-14.3539" width="113.721" + height="115.43" fill="black"> + <rect fill="white" x="56.8817" y="-14.3539" width="113.721" height="115.43" /> + <path d="M143.331 3.03542L86.287 7.94633L81.5606 32.5891L138.604 27.6782L143.331 3.03542Z" /> + <path + d="M90.3706 55.7943L84.7669 83.5081L141.81 78.5971L147.414 50.8834L138.604 27.6782L81.5606 32.5891L90.3706 55.7943Z" /> + </mask> + <path + d="M138.522 26.6806L81.4784 31.5915L81.6428 33.5868L138.686 28.6758L138.522 26.6806ZM86.287 7.94633L86.1226 5.95109L84.612 6.08114L84.3256 7.57437L86.287 7.94633ZM143.331 3.03542L145.292 3.40738L145.789 0.81435L143.166 1.04018L143.331 3.03542ZM81.5606 32.5891L79.5992 32.2172L79.492 32.776L79.6936 33.3069L81.5606 32.5891ZM138.604 27.6782L136.643 27.3063L136.536 27.865L136.737 28.396L138.604 27.6782ZM90.3706 55.7943L92.3281 56.186L92.443 55.6177L92.2376 55.0766L90.3706 55.7943ZM84.7669 83.5081L82.8093 83.1163L82.2805 85.7315L84.9313 85.5033L84.7669 83.5081ZM141.81 78.5971L141.975 80.5924L143.47 80.4637L143.768 78.9889L141.81 78.5971ZM147.414 50.8834L149.372 51.2751L149.487 50.7067L149.281 50.1656L147.414 50.8834ZM86.4515 9.94157L143.495 5.03066L143.166 1.04018L86.1226 5.95109L86.4515 9.94157ZM83.5221 32.9611L88.2485 8.31829L84.3256 7.57437L79.5992 32.2172L83.5221 32.9611ZM141.369 2.66346L136.643 27.3063L140.566 28.0502L145.292 3.40738L141.369 2.66346ZM86.7244 83.8998L92.3281 56.186L88.413 55.4026L82.8093 83.1163L86.7244 83.8998ZM141.646 76.6019L84.6024 81.5128L84.9313 85.5033L141.975 80.5924L141.646 76.6019ZM145.457 50.4916L139.853 78.2054L143.768 78.9889L149.372 51.2751L145.457 50.4916ZM136.737 28.396L145.547 51.6011L149.281 50.1656L140.471 26.9605L136.737 28.396ZM92.2376 55.0766L83.4277 31.8714L79.6936 33.3069L88.5035 56.512L92.2376 55.0766Z" + fill="#789C96" mask="url(#path-16-outside-2_15339_1408)" /> + <path d="M90.3708 55.794L147.414 50.8831L141.811 78.5969L84.7671 83.5078L90.3708 55.794Z" + fill="url(#paint2_radial_15339_1408)" /> + <path d="M90.3706 55.7947L147.414 50.8838L138.604 27.6787L81.5605 32.5896L90.3706 55.7947Z" fill="#314340" /> + <path d="M86.2866 7.94611L143.33 3.0352L138.604 27.678L81.5602 32.5889L86.2866 7.94611Z" + fill="url(#paint3_radial_15339_1408)" /> + <mask id="mask2_15339_1408" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="91" y="52" width="50" + height="26"> + <path + d="M95.1888 56.741L140.398 52.8489L138.46 65.2835L120.441 66.8347L118.8 74.8596L91.3128 77.2259L95.1888 56.741Z" + fill="#D87B39" /> + </mask> + <g mask="url(#mask2_15339_1408)"> + <rect width="53.024" height="2.1705" transform="matrix(0.996315 -0.0857733 0.0850376 0.996378 91.3984 59.2456)" + fill="#45D1B8" /> + <path d="M89.7832 65.9668L140.332 61.615L140.115 63.8123L89.9678 68.1294L89.7832 65.9668Z" fill="#45D1B8" /> + <rect width="53.024" height="2.17046" transform="matrix(0.996315 -0.0857733 0.0850376 0.996378 89.043 72.792)" + fill="#45D1B8" /> + </g> + <mask id="mask3_15339_1408" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="87" y="29" width="55" + height="25"> + <path d="M134.062 29.9753L87.0851 34.0196L94.3757 53.5431L141.353 49.4988L134.062 29.9753Z" fill="#D87B39" /> + </mask> + <g mask="url(#mask3_15339_1408)"> + <rect width="53.024" height="2.17049" transform="matrix(0.996315 -0.0857733 0.0850376 0.996378 87.8232 42.6699)" + fill="#45D1B8" /> + <path d="M84.8965 36.1758L107.261 34.2505L108.767 36.7266L85.1173 38.7625L84.8965 36.1758Z" fill="#45D1B8" /> + <rect width="53.024" height="2.17048" transform="matrix(0.996315 -0.0857733 0.0850376 0.996378 89.9863 49.02)" + fill="#45D1B8" /> + </g> + <g clip-path="url(#clip2_15339_1408)"> + <path + d="M112.359 25.1828C116.665 24.1535 119.321 19.8148 118.297 15.4953C117.273 11.1758 112.956 8.50448 108.65 9.53386C104.344 10.5632 101.688 14.9019 102.712 19.2214C103.736 23.5409 108.053 26.2122 112.359 25.1828Z" + fill="#45D1B8" stroke="#45D1B8" /> + <path + d="M108.585 20.6578C109.662 20.4002 110.325 19.3154 110.069 18.2381C109.814 17.1607 108.736 16.492 107.658 16.7496C106.581 17.0072 105.919 18.092 106.174 19.1693C106.429 20.2467 107.507 20.9154 108.585 20.6578Z" + fill="#E0E0E0" stroke="#45D1B8" /> + <path + d="M112.759 21.9855C113.433 21.8243 113.846 21.1463 113.687 20.4742C113.528 19.8022 112.855 19.3838 112.181 19.5449C111.507 19.706 111.094 20.3841 111.253 21.0561C111.412 21.7282 112.085 22.1466 112.759 21.9855Z" + fill="#E0E0E0" stroke="#45D1B8" /> + <path + d="M111.525 18.4038C113.207 18.0015 114.244 16.3066 113.844 14.6214C113.445 12.9362 111.759 11.8919 110.077 12.2943C108.394 12.6966 107.358 14.3914 107.757 16.0767C108.157 17.7619 109.842 18.8061 111.525 18.4038Z" + fill="#E0E0E0" stroke="#45D1B8" /> + </g> + </g> + <g filter="url(#filter2_d_15339_1408)"> + <mask id="path-33-outside-3_15339_1408" maskUnits="userSpaceOnUse" x="5.40693" y="2.46673" width="154.438" + height="155.715" fill="black"> + <rect fill="white" x="5.40693" y="2.46673" width="154.438" height="155.715" /> + <path d="M103.424 21.4342L36.8186 48.1892L40.0728 79.4405L106.678 52.6856L103.424 21.4342Z" /> + <path + d="M59.0339 104.017L62.348 139.268L128.954 112.513L125.639 77.2619L106.678 52.6856L40.0728 79.4405L59.0339 104.017Z" /> + </mask> + <path + d="M106.31 51.7547L39.7041 78.5097L40.4416 80.3714L107.047 53.6165L106.31 51.7547ZM36.8186 48.1892L36.0812 46.3274L34.6774 46.8913L34.8346 48.4014L36.8186 48.1892ZM103.424 21.4342L105.408 21.222L105.134 18.5894L102.687 19.5725L103.424 21.4342ZM40.0728 79.4405L38.0888 79.6528L38.1479 80.2204L38.4956 80.6711L40.0728 79.4405ZM106.678 52.6856L104.694 52.8978L104.753 53.4654L105.101 53.9161L106.678 52.6856ZM59.0339 104.017L61.0199 103.825L60.9655 103.246L60.6111 102.786L59.0339 104.017ZM62.348 139.268L60.362 139.46L60.6123 142.123L63.0854 141.13L62.348 139.268ZM128.954 112.513L129.691 114.375L131.08 113.817L130.94 112.321L128.954 112.513ZM125.639 77.2619L127.625 77.0697L127.571 76.4906L127.217 76.0313L125.639 77.2619ZM37.5561 50.0509L104.162 23.296L102.687 19.5725L36.0812 46.3274L37.5561 50.0509ZM42.0569 79.2283L38.8027 47.9769L34.8346 48.4014L38.0888 79.6528L42.0569 79.2283ZM101.44 21.6465L104.694 52.8978L108.662 52.4734L105.408 21.222L101.44 21.6465ZM64.334 139.076L61.0199 103.825L57.0478 104.209L60.362 139.46L64.334 139.076ZM128.216 110.652L61.6105 137.406L63.0854 141.13L129.691 114.375L128.216 110.652ZM123.653 77.454L126.967 112.705L130.94 112.321L127.625 77.0697L123.653 77.454ZM105.101 53.9161L124.062 78.4924L127.217 76.0313L108.256 51.4551L105.101 53.9161ZM60.6111 102.786L41.6501 78.21L38.4956 80.6711L57.4567 105.247L60.6111 102.786Z" + fill="#CBA991" mask="url(#path-33-outside-3_15339_1408)" /> + <path d="M59.0338 104.016L125.639 77.2615L128.953 112.513L62.3479 139.268L59.0338 104.016Z" + fill="url(#paint4_radial_15339_1408)" /> + <path d="M59.0334 104.017L125.639 77.262L106.678 52.6858L40.0723 79.4407L59.0334 104.017Z" fill="#423D39" /> + <path d="M36.8186 48.1888L103.424 21.4339L106.678 52.6852L40.0728 79.4401L36.8186 48.1888Z" + fill="url(#paint5_radial_15339_1408)" /> + <mask id="mask4_15339_1408" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="65" y="82" width="56" + height="48"> + <path + d="M65.1531 103.388L117.941 82.1832L120.118 97.789L99.0789 106.24L100.016 116.455L67.9216 129.347L65.1531 103.388Z" + fill="#D87B39" /> + </mask> + <g mask="url(#mask4_15339_1408)"> + <rect width="66.4744" height="2.71572" transform="matrix(0.927935 -0.372744 0.369731 0.929139 61.5166 107.775)" + fill="#D87B39" /> + <path d="M62.0127 116.418L121.035 92.7093L121.57 95.4213L63.0168 118.941L62.0127 116.418Z" fill="#D87B39" /> + <rect width="66.4745" height="2.71569" transform="matrix(0.927935 -0.372744 0.369731 0.929139 63.5957 124.865)" + fill="#D87B39" /> + </g> + <mask id="mask5_15339_1408" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="47" y="57" width="71" + height="43"> + <path d="M102.065 57.0992L47.2131 79.1327L63.0201 99.8543L117.872 77.8208L102.065 57.0992Z" fill="#D87B39" /> + </mask> + <g mask="url(#mask5_15339_1408)"> + <rect width="66.4745" height="2.71572" transform="matrix(0.927935 -0.372744 0.369731 0.929139 51.2285 89.2256)" + fill="#D87B39" /> + <path d="M45.3691 82.5161L71.482 72.0268L74.1837 74.4421L46.5701 85.5343L45.3691 82.5161Z" fill="#D87B39" /> + <rect width="66.4745" height="2.71571" transform="matrix(0.927935 -0.372744 0.369731 0.929139 56.1201 96.041)" + fill="#D87B39" /> + </g> + <path + d="M72.5767 59.0298C77.4172 57.0855 80.0489 51.84 78.2083 47.2146C76.3677 42.5891 70.8621 40.6124 66.0216 42.5568C61.1812 44.5011 58.5494 49.7466 60.39 54.372C62.2306 58.9975 67.7362 60.9742 72.5767 59.0298Z" + fill="#D87B39" stroke="#D87B39" stroke-width="2" /> + <path + d="M61.0273 54.4333L63.6041 55.0933L64.1826 51.8945L67.7772 55.1121L67.6999 47.939L72.0215 52.9835L72.2721 47.7975L75.749 51.01L76.411 47.7304L78.1149 48.5229" + stroke="#E0E0E0" /> + </g> + <path + d="M116.514 104.713L118.279 109.525L118.538 109.429C118.632 109.394 118.7 109.354 118.743 109.308C118.786 109.262 118.824 109.193 118.858 109.099L119.64 106.786C119.676 106.687 119.722 106.604 119.779 106.536C119.833 106.464 119.919 106.407 120.035 106.364L121.308 105.893L120.302 108.712C120.267 108.815 120.228 108.913 120.186 109.006C120.142 109.095 120.089 109.178 120.028 109.256C120.128 109.284 120.222 109.324 120.309 109.377C120.397 109.43 120.487 109.489 120.579 109.554L123.537 111.657L122.282 112.122C122.173 112.162 122.074 112.177 121.985 112.167C121.896 112.157 121.805 112.118 121.712 112.05L119.436 110.394C119.347 110.328 119.27 110.293 119.204 110.287C119.138 110.281 119.049 110.3 118.937 110.341L118.621 110.458L119.596 113.115L118.206 113.63L115.123 105.228L116.514 104.713Z" + fill="white" /> + <path + d="M112.093 109.2C112.525 109.041 112.941 108.966 113.341 108.976C113.745 108.985 114.118 109.072 114.46 109.237C114.801 109.401 115.108 109.643 115.378 109.963C115.649 110.282 115.868 110.67 116.035 111.126C116.204 111.586 116.288 112.026 116.289 112.445C116.289 112.864 116.213 113.25 116.061 113.602C115.909 113.954 115.682 114.264 115.38 114.534C115.082 114.803 114.717 115.017 114.286 115.177C113.854 115.337 113.436 115.412 113.032 115.403C112.628 115.394 112.253 115.306 111.906 115.139C111.563 114.971 111.254 114.728 110.98 114.41C110.709 114.09 110.489 113.701 110.321 113.241C110.153 112.785 110.07 112.347 110.069 111.927C110.072 111.507 110.151 111.122 110.305 110.774C110.462 110.425 110.692 110.115 110.993 109.845C111.295 109.575 111.662 109.36 112.093 109.2ZM113.892 114.103C114.372 113.925 114.667 113.632 114.777 113.223C114.891 112.812 114.833 112.294 114.604 111.669C114.374 111.043 114.083 110.609 113.73 110.367C113.381 110.124 112.966 110.091 112.485 110.269C111.997 110.45 111.698 110.749 111.587 111.167C111.474 111.581 111.532 112.099 111.761 112.721C111.989 113.343 112.279 113.775 112.632 114.016C112.984 114.255 113.404 114.283 113.892 114.103Z" + fill="white" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M124.744 110.04L122.468 109.367L122.756 102.116C122.812 101.31 124.797 97.6169 125.344 97.7785L128.404 99.3204C128.951 99.482 128.8 103.079 128.412 103.787L124.744 110.04Z" + fill="#FEEBAE" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M123.336 101.087C123.779 101.077 124.83 101.376 125.494 102.643C126.04 103.687 124.871 107.253 123.875 109.783L124.744 110.04L128.412 103.787C128.799 103.079 128.95 99.4823 128.403 99.3207L126.225 98.223L124.629 98.3898C124.612 98.4126 124.595 98.4358 124.578 98.4594L123.336 101.087Z" + fill="#CEB871" /> + <path + d="M123.037 109.534L124.177 109.871L123.673 111.59C123.581 111.905 123.251 112.085 122.936 111.992C122.622 111.899 122.441 111.568 122.534 111.254L123.037 109.534Z" + fill="#7B7B7B" /> + <path + d="M136.517 55.0606L135.377 54.7239C134.118 54.3519 132.797 55.0753 132.427 56.3397L126.726 75.7995C126.454 76.7308 126.773 77.6959 127.463 78.2883C127.882 78.6484 128.461 78.3328 128.616 77.8028L128.725 77.4327C128.88 76.9027 128.505 76.3405 128.268 75.8408C128.147 75.5849 128.116 75.2849 128.202 74.9916L133.567 56.6765C133.752 56.0443 134.412 55.6826 135.042 55.8686L136.182 56.2053L136.517 55.0606Z" + fill="#FFD64F" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M137.355 62.7704C135.152 62.1194 133.044 62.691 132.646 64.0472L122.835 101.6C123.7 101.343 124.814 101.353 125.954 101.69C127.093 102.026 128.035 102.624 128.624 103.31L140.625 66.4047C141.022 65.0485 139.558 63.4214 137.355 62.7704Z" + fill="#6FB065" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M130.68 71.5713C130.689 71.5738 130.697 71.5764 130.705 71.579C131.277 71.7574 131.727 71.848 132.092 71.9215C133.265 72.1573 133.564 72.2177 134.218 74.4422C134.802 76.4315 130.159 91.4621 126.706 101.96C127.507 102.305 128.17 102.781 128.624 103.31L140.625 66.4037C141.022 65.0475 139.558 63.4204 137.355 62.7694C135.152 62.1184 133.044 62.69 132.646 64.0462L130.68 71.5713Z" + fill="#518A47" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M139.702 54.7582C137.499 54.1072 135.391 54.6788 134.994 56.035L130.061 72.8731C130.045 72.9296 130.032 72.9867 130.021 73.0441C130.534 71.8054 132.56 71.3049 134.673 71.9294C136.784 72.5532 138.216 74.0735 137.983 75.3927C138.004 75.34 138.023 75.2859 138.04 75.2306L142.972 58.3925C143.369 57.0363 141.906 55.4092 139.702 54.7582Z" + fill="#FFD64F" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M140.037 53.6127C137.834 52.9617 135.726 53.5333 135.329 54.8895L130.396 71.7276C130.38 71.7833 130.367 71.8396 130.357 71.8962C130.87 70.6584 132.895 70.1585 135.008 70.7827C137.12 71.407 138.553 72.9287 138.317 74.2485C138.339 74.1954 138.358 74.1409 138.375 74.0851L143.307 57.247C143.704 55.8908 142.241 54.2637 140.037 53.6127Z" + fill="#6FB065" /> + <path fill-rule="evenodd" clip-rule="evenodd" + d="M136.288 71.3112C138.155 66.1003 140.393 59.6139 140.53 58.2985C140.727 56.4012 140.532 55.7712 139.328 53.4433C139.562 53.4856 139.798 53.5417 140.036 53.612C142.239 54.263 143.703 55.8901 143.306 57.2463L138.374 74.0844C138.357 74.1402 138.338 74.1947 138.316 74.2479C138.5 73.2177 137.667 72.0645 136.288 71.3112Z" + fill="#518A47" /> + <path d="M156.349 137.602L153.438 137.602L152.054 126.331L156.35 126.331L156.349 137.602Z" fill="#FFB8B8" /> + <path + d="M151.359 136.767H156.973V140.316H147.824C147.824 139.85 147.916 139.388 148.093 138.958C148.271 138.527 148.531 138.136 148.86 137.807C149.188 137.477 149.577 137.216 150.006 137.037C150.435 136.859 150.895 136.767 151.359 136.767Z" + fill="#61616F" /> + <path d="M172.039 137.602L169.128 137.602L167.744 126.331L172.04 126.331L172.039 137.602Z" fill="#FFB8B8" /> + <path + d="M167.049 136.767H172.663V140.316H163.515C163.515 139.85 163.606 139.388 163.784 138.958C163.961 138.527 164.222 138.136 164.55 137.807C164.878 137.477 165.268 137.216 165.697 137.037C166.126 136.859 166.585 136.767 167.049 136.767Z" + fill="#61616E" /> + <path + d="M163.515 57.4738C166.969 57.4738 169.769 54.663 169.769 51.1956C169.769 47.7283 166.969 44.9175 163.515 44.9175C160.061 44.9175 157.261 47.7283 157.261 51.1956C157.261 54.663 160.061 57.4738 163.515 57.4738Z" + fill="#FFB8B8" /> + <path + d="M130.94 78.0388C131.166 77.7721 131.448 77.5586 131.766 77.4131C132.083 77.2677 132.429 77.194 132.778 77.1971C133.127 77.2002 133.471 77.2802 133.786 77.4313C134.101 77.5824 134.379 77.801 134.601 78.0717L139.82 76.4792L141.558 79.4285L134.156 81.5733C133.679 81.9171 133.093 82.0731 132.508 82.0116C131.924 81.9502 131.382 81.6756 130.985 81.2399C130.589 80.8043 130.365 80.2377 130.357 79.6478C130.349 79.0578 130.556 78.4853 130.94 78.0388Z" + fill="#FFB8B8" /> + <path + d="M172.211 96.3923C172.062 96.0753 171.984 95.7295 171.982 95.3791C171.981 95.0287 172.056 94.6822 172.203 94.3641C172.349 94.0461 172.563 93.7641 172.83 93.538C173.097 93.312 173.409 93.1474 173.746 93.0559L174.448 87.6241L177.84 87.2471L176.742 94.9039C176.858 95.4823 176.758 96.0832 176.462 96.5927C176.165 97.1023 175.693 97.485 175.135 97.6685C174.576 97.852 173.97 97.8234 173.431 97.5882C172.892 97.353 172.458 96.9274 172.211 96.3923L172.211 96.3923Z" + fill="#FFB8B8" /> + <path + d="M168.741 63.0537C169.074 62.625 169.513 62.292 170.015 62.0882C170.517 61.8845 171.063 61.8172 171.599 61.8931C172.135 61.9691 172.641 62.1857 173.067 62.5209C173.493 62.8562 173.823 63.2983 174.025 63.8027L179.151 76.6449C179.675 77.9572 179.842 79.3857 179.635 80.7842L177.965 92.0718C177.943 92.2174 177.891 92.3567 177.811 92.48C177.731 92.6033 177.625 92.7078 177.501 92.7864C177.377 92.8649 177.237 92.9156 177.092 92.9351C176.947 92.9545 176.799 92.9422 176.659 92.899L174.459 92.2208C174.231 92.1506 174.035 92.0024 173.905 91.8021C173.775 91.6017 173.718 91.3619 173.746 91.1243C174.523 84.479 173.496 77.7466 170.776 71.6384L168.36 66.2122C168.132 65.7005 168.047 65.1362 168.114 64.5798C168.181 64.0234 168.398 63.4959 168.741 63.0537Z" + fill="#FF0101" /> + <path + d="M165.038 57.4728C165.979 57.4932 166.914 57.3135 167.781 56.9453C168.648 56.5772 169.428 56.029 170.069 55.3368C170.71 54.6446 171.198 53.8241 171.5 52.9292C171.803 52.0342 171.913 51.0851 171.825 50.1442C171.736 49.2033 171.45 48.2919 170.985 47.47C170.52 46.648 169.888 45.934 169.128 45.375C168.369 44.816 167.501 44.4246 166.58 44.2265C165.66 44.0283 164.708 44.028 163.787 44.2255C162.412 43.3872 160.813 42.8232 159.211 42.9666C157.608 43.1101 156.023 44.0652 155.424 45.5642C154.824 47.0632 155.468 49.0391 156.958 49.6482C157.914 50.0388 158.993 49.8494 160.012 49.6919C161.032 49.5344 162.144 49.4316 163.031 49.9597C163.918 50.4878 164.317 51.9038 163.522 52.564C163.101 52.9279 162.8 53.4119 162.66 53.9517C162.52 54.4915 162.547 55.0614 162.737 55.5854C163.137 56.6223 164.227 57.4552 165.038 57.4728Z" + fill="#61616F" /> + <path + d="M172.797 91.8907L173.907 134.154C173.91 134.295 173.885 134.435 173.832 134.566C173.779 134.696 173.7 134.814 173.6 134.913C173.499 135.011 173.38 135.088 173.248 135.137C173.117 135.187 172.977 135.209 172.837 135.202L169.182 135.015C168.949 135.003 168.727 134.911 168.553 134.754C168.38 134.598 168.265 134.386 168.228 134.154L163.881 106.704C163.863 106.587 163.804 106.479 163.715 106.401C163.626 106.322 163.513 106.277 163.394 106.273C163.276 106.27 163.16 106.307 163.066 106.38C162.973 106.453 162.907 106.557 162.882 106.673L156.998 133.102C156.966 133.244 156.905 133.377 156.819 133.493C156.732 133.608 156.622 133.704 156.496 133.774C156.37 133.844 156.23 133.887 156.087 133.899C155.943 133.91 155.798 133.891 155.663 133.843L152.036 133.62C151.826 133.546 151.646 133.404 151.524 133.217C151.403 133.029 151.345 132.807 151.361 132.584L154.527 91.4907L172.797 91.8907Z" + fill="#61616F" /> + <path + d="M174.577 71.8171C175.189 65.4126 170.498 59.6197 164.105 59.164C161.351 58.9676 157.074 58.8974 155.665 62.5219C151.418 73.4401 158.852 73.1748 156.291 82.6344C153.73 92.0939 151.467 92.6361 154.982 93.3192C158.496 94.0022 174.299 98.0345 173.651 91.3765C173.252 87.2839 173.967 78.2056 174.577 71.8171Z" + fill="#FF0101" /> + <path + d="M159.664 60.2109C160.193 60.3249 160.683 60.577 161.084 60.9418C161.485 61.3066 161.784 61.7712 161.949 62.2887C162.114 62.8062 162.141 63.3583 162.026 63.8892C161.911 64.4202 161.658 64.9112 161.294 65.3128L152.788 74.6857C151.333 76.2885 149.48 77.4742 147.419 78.1213L137.668 81.1828C137.528 81.2267 137.38 81.2398 137.235 81.2211C137.089 81.2024 136.95 81.1523 136.825 81.0744C136.701 80.9965 136.595 80.8925 136.514 80.7696C136.433 80.6466 136.38 80.5076 136.357 80.3621L136.007 78.0785C135.971 77.842 136.018 77.6003 136.141 77.3953C136.264 77.1904 136.454 77.0353 136.679 76.9569L137.381 76.7126C143.218 74.6809 148.398 71.1037 152.376 66.3588L156.666 61.2414C157.025 60.8127 157.494 60.4903 158.022 60.3087C158.55 60.1272 159.118 60.0934 159.664 60.2109Z" + fill="#FF0101" /> + <path + d="M190.619 140.921H124.926C124.858 140.921 124.793 140.894 124.745 140.847C124.698 140.799 124.671 140.734 124.671 140.666C124.671 140.598 124.698 140.533 124.745 140.485C124.793 140.437 124.858 140.41 124.926 140.41H190.619C190.687 140.41 190.752 140.437 190.799 140.485C190.847 140.533 190.874 140.598 190.874 140.666C190.874 140.734 190.847 140.799 190.799 140.847C190.752 140.894 190.687 140.921 190.619 140.921Z" + fill="#3F3D56" /> + </g> + <defs> + <filter id="filter0_d_15339_1408" x="-5.52539" y="-2.38867" width="102.738" height="124.393" + filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> + <feFlood flood-opacity="0" result="BackgroundImageFix" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset dx="-4" dy="9" /> + <feGaussianBlur stdDeviation="6" /> + <feComposite in2="hardAlpha" operator="out" /> + <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0" /> + <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_15339_1408" /> + <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_15339_1408" result="shape" /> + </filter> + <filter id="filter1_d_15339_1408" x="63.4922" y="-2.18555" width="93.9941" height="108.917" + filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> + <feFlood flood-opacity="0" result="BackgroundImageFix" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset dx="-4" dy="9" /> + <feGaussianBlur stdDeviation="6" /> + <feComposite in2="hardAlpha" operator="out" /> + <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0" /> + <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_15339_1408" /> + <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_15339_1408" result="shape" /> + </filter> + <filter id="filter2_d_15339_1408" x="18.6777" y="15.5894" width="120.402" height="147.534" + filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> + <feFlood flood-opacity="0" result="BackgroundImageFix" /> + <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" + result="hardAlpha" /> + <feOffset dx="-4" dy="9" /> + <feGaussianBlur stdDeviation="6" /> + <feComposite in2="hardAlpha" operator="out" /> + <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0" /> + <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_15339_1408" /> + <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_15339_1408" result="shape" /> + </filter> + <radialGradient id="paint0_radial_15339_1408" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(54.2013 61.2167) rotate(67.3244) scale(8.30376 39.5632)"> + <stop stop-color="#2A2B30" /> + <stop offset="1" stop-color="#1B1C22" /> + </radialGradient> + <radialGradient id="paint1_radial_15339_1408" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(36.1878 16.6272) rotate(67.3244) scale(7.39034 38.8742)"> + <stop stop-color="#2A2B30" /> + <stop offset="1" stop-color="#1B1C22" /> + </radialGradient> + <radialGradient id="paint2_radial_15339_1408" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(115.009 54.5239) rotate(85.1218) scale(8.30887 39.5389)"> + <stop stop-color="#2A2B30" /> + <stop offset="1" stop-color="#1B1C22" /> + </radialGradient> + <radialGradient id="paint3_radial_15339_1408" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(111.483 6.53434) rotate(85.1218) scale(7.3949 38.8503)"> + <stop stop-color="#2A2B30" /> + <stop offset="1" stop-color="#1B1C22" /> + </radialGradient> + <radialGradient id="paint4_radial_15339_1408" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(88.1103 93.4798) rotate(68.301) scale(10.3961 49.5684)"> + <stop stop-color="#2A2B30" /> + <stop offset="1" stop-color="#1B1C22" /> + </radialGradient> + <radialGradient id="paint5_radial_15339_1408" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" + gradientTransform="translate(66.5123 37.2785) rotate(68.301) scale(9.25254 48.7052)"> + <stop stop-color="#2A2B30" /> + <stop offset="1" stop-color="#1B1C22" /> + </radialGradient> + <clipPath id="clip0_15339_1408"> + <rect width="200" height="154" fill="white" /> + </clipPath> + <clipPath id="clip1_15339_1408"> + <rect width="16.5337" height="16.584" fill="white" + transform="matrix(0.927954 -0.372554 0.369816 0.929161 27.8262 22.606)" /> + </clipPath> + <clipPath id="clip2_15339_1408"> + <rect width="16.525" height="16.5927" fill="white" + transform="matrix(0.972696 -0.23255 0.230599 0.972939 100.555 11.208)" /> + </clipPath> + </defs> +</svg> \ No newline at end of file diff --git a/src/components/Action/ActionCard/ActionCard.tsx b/src/components/Action/ActionCard/ActionCard.tsx index 909829154ee4ead6e682b18a35d2b1b87c39c35b..b14f909d5324041a112bc3a0538d48ef63028282 100644 --- a/src/components/Action/ActionCard/ActionCard.tsx +++ b/src/components/Action/ActionCard/ActionCard.tsx @@ -2,12 +2,8 @@ import { Button } from '@material-ui/core' import defaultIcon from 'assets/icons/visu/ecogesture/default.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import EcogestureModal from 'components/Ecogesture/EcogestureModal/EcogestureModal' -import { useClient } from 'cozy-client' -import { UsageEventType } from 'enums' import { Ecogesture } from 'models' import React, { useCallback, useEffect, useState } from 'react' -import UsageEventService from 'services/usageEvent.service' -import { useAppSelector } from 'store/hooks' import { importIconById } from 'utils/utils' import './actionCard.scss' @@ -22,8 +18,6 @@ const ActionCard = ({ setSelectedAction, setShowList, }: ActionCardProps) => { - const client = useClient() - const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge) const [actionIcon, setActionIcon] = useState<string>('') const [openEcogestureModal, setOpenEcogestureModal] = useState<boolean>(false) const toggleModal = useCallback(() => { @@ -33,20 +27,8 @@ const ActionCard = ({ const selectEcogesture = useCallback(() => { setSelectedAction(action) setShowList(false) - UsageEventService.addEvent(client, { - type: UsageEventType.ACTION_CHANGE_EVENT, - target: action.id, - context: currentChallenge ? currentChallenge.id : '', - }) toggleModal() - }, [ - setSelectedAction, - setShowList, - action, - toggleModal, - currentChallenge, - client, - ]) + }, [setSelectedAction, setShowList, action, toggleModal]) useEffect(() => { async function handleEcogestureIcon() { diff --git a/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap b/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap index 1d41b8754042458a3a1addbdfefd8e2a277e623d..07ca33e2f1dac1835822ac668fee8ee5fbe887ed 100644 --- a/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap +++ b/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap @@ -21,7 +21,7 @@ exports[`ActionChoose component should render correctly 1`] = ` width="100" > <use - xlink:href="#test-file-stub" + xlink:href="#" /> </svg> </div> @@ -105,9 +105,6 @@ exports[`ActionChoose component should render correctly 1`] = ` > action.apply </span> - <span - class="MuiTouchRipple-root" - /> </button> <button class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary" @@ -119,9 +116,6 @@ exports[`ActionChoose component should render correctly 1`] = ` > action.other </span> - <span - class="MuiTouchRipple-root" - /> </button> </div> </div> diff --git a/src/components/Action/ActionDone/ActionDone.spec.tsx b/src/components/Action/ActionDone/ActionDone.spec.tsx index d293d094852cb135f96e457666bc624988e9cc67..09c2d698ff27ff4764736c633b536282298775cc 100644 --- a/src/components/Action/ActionDone/ActionDone.spec.tsx +++ b/src/components/Action/ActionDone/ActionDone.spec.tsx @@ -2,16 +2,11 @@ import { render, screen } from '@testing-library/react' import { userEvent } from '@testing-library/user-event' import React from 'react' import { Provider } from 'react-redux' -import UsageEventService from 'services/usageEvent.service' import * as challengeActions from 'store/challenge/challenge.slice' import { createMockEcolyoStore } from 'tests/__mocks__/store' import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock' import ActionDone from './ActionDone' -jest.mock('services/usageEvent.service') -const mockAddEvent = jest.fn() -UsageEventService.addEvent = mockAddEvent - const mockUpdateUserChallenge = jest.fn() jest.mock('services/challenge.service', () => { return jest.fn(() => ({ diff --git a/src/components/Action/ActionDone/ActionDone.tsx b/src/components/Action/ActionDone/ActionDone.tsx index 39b6ccce33c1c025191f17e5b819ac131b9eca72..40c5a4b4897192c73f977faa62537933d5707e79 100644 --- a/src/components/Action/ActionDone/ActionDone.tsx +++ b/src/components/Action/ActionDone/ActionDone.tsx @@ -3,12 +3,11 @@ import starFilled from 'assets/icons/visu/challenge/starFilled.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { UsageEventType, UserChallengeUpdateFlag } from 'enums' +import { UserChallengeUpdateFlag } from 'enums' import { UserChallenge } from 'models' import React, { useCallback } from 'react' import { useNavigate } from 'react-router-dom' import ChallengeService from 'services/challenge.service' -import UsageEventService from 'services/usageEvent.service' import { updateUserChallengeList } from 'store/challenge/challenge.slice' import { toggleChallengeActionNotification } from 'store/global/global.slice' import { useAppDispatch } from 'store/hooks' @@ -29,14 +28,6 @@ const ActionDone = ({ currentChallenge, UserChallengeUpdateFlag.ACTION_DONE ) - await UsageEventService.addEvent(client, { - type: UsageEventType.ACTION_END_EVENT, - target: currentChallenge.action.ecogesture - ? currentChallenge.action.ecogesture.id - : '', - context: currentChallenge.id, - startDate: currentChallenge.action.startDate, - }) dispatch(toggleChallengeActionNotification(false)) dispatch(updateUserChallengeList(updatedChallenge)) navigate(-1) diff --git a/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap b/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap index 0b0de6e974f935ad6a181f16e5c8c5081c12f75e..e1772af32ac582ed39669e5e3220281fed659749 100644 --- a/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap +++ b/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap @@ -20,7 +20,7 @@ exports[`ActionList component should match snapshot and render correctly 3 butto width="100" > <use - xlink:href="#test-file-stub" + xlink:href="#" /> </svg> <div @@ -29,9 +29,6 @@ exports[`ActionList component should match snapshot and render correctly 3 butto Poings de glace </div> </span> - <span - class="MuiTouchRipple-root" - /> </button> <button class="MuiButtonBase-root MuiButton-root MuiButton-text action-card" @@ -48,7 +45,7 @@ exports[`ActionList component should match snapshot and render correctly 3 butto width="100" > <use - xlink:href="#test-file-stub" + xlink:href="#" /> </svg> <div @@ -57,9 +54,6 @@ exports[`ActionList component should match snapshot and render correctly 3 butto Chat échaudé </div> </span> - <span - class="MuiTouchRipple-root" - /> </button> <button class="MuiButtonBase-root MuiButton-root MuiButton-text action-card" @@ -76,7 +70,7 @@ exports[`ActionList component should match snapshot and render correctly 3 butto width="100" > <use - xlink:href="#test-file-stub" + xlink:href="#" /> </svg> <div @@ -85,9 +79,6 @@ exports[`ActionList component should match snapshot and render correctly 3 butto Reine du Puzzle </div> </span> - <span - class="MuiTouchRipple-root" - /> </button> </div> </div> diff --git a/src/components/Analysis/Comparison/Comparison.tsx b/src/components/Analysis/Comparison/Comparison.tsx index f488816e361e183b81eee65bf2b1fc6c512ff24e..78f6ecac820f8256cb0fcaebae26b5e6072a29ed 100644 --- a/src/components/Analysis/Comparison/Comparison.tsx +++ b/src/components/Analysis/Comparison/Comparison.tsx @@ -49,9 +49,11 @@ const Comparison = ({ }, } }, [analysisMonth]) - + const NAVIGATION_HEIGHT = 40 const loaderPlaceholderHeight = - fluidsWithData.length * 84 + (fluidsWithData.length - 1) * 10 + fluidsWithData.length * 84 + + (fluidsWithData.length - 1) * 10 + + NAVIGATION_HEIGHT useEffect(() => { let subscribed = true @@ -66,12 +68,18 @@ const Comparison = ({ ) if (fetchedYearIndicators) { setYearPerformanceIndicators(fetchedYearIndicators) + if ( + fetchedYearIndicators.some( + indicator => indicator.value !== 0 || indicator.compareValue !== 0 + ) + ) { + dispatch(setPeriod('year')) + } } setIsLoading(false) } } populateData() - return () => { subscribed = false } @@ -83,24 +91,28 @@ const Comparison = ({ fluidsWithData, periods.monthPeriod, periods.previousYearPeriod, + dispatch, ]) return ( <div className="comparison"> - <div className="tabs"> - <Button - className={period === 'month' ? 'active' : ''} - onClick={() => dispatch(setPeriod('month'))} - > - {t('analysis.compare.month_tab')} - </Button> - <Button - className={period === 'year' ? 'active' : ''} - onClick={() => dispatch(setPeriod('year'))} - > - {t('analysis.compare.year_tab')} - </Button> - </div> + {!isLoading && ( + <div className="tabs"> + <Button + className={period === 'year' ? 'active' : ''} + onClick={() => dispatch(setPeriod('year'))} + > + {t(`analysis.compare.year_tab`)} + </Button> + <Button + className={period === 'month' ? 'active' : ''} + onClick={() => dispatch(setPeriod('month'))} + > + {t(`analysis.compare.month_tab`)} + </Button> + </div> + )} + <div className="performanceIndicators"> {isLoading && ( <div @@ -129,7 +141,6 @@ const Comparison = ({ comparisonDate={periods.previousMonthPeriod.startDate} /> ))} - {!isLoading && fluidsWithData.map(fluid => ( <FluidPerformanceIndicator diff --git a/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss b/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss index 6213c8fdc63a80db0122e252487db98e19b5f4fb..4457dccc9a5eb45d45950391ac206451b1de7afd 100644 --- a/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss +++ b/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss @@ -14,10 +14,8 @@ //MultiFluidIndicator .fi-content { min-height: 23.875rem; - width: 45.75rem; - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; .fi-header { margin-top: 1rem; margin-bottom: 1.25rem; diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx index f62d1ff5506e91ef57d8d556b8d805d03f32eaaf..079b98bd5a78e418233b508098bda144c53b7faf 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx @@ -32,6 +32,7 @@ jest.mock('services/enedisMonthlyAnalysisData.service', () => { return jest.fn(() => ({ getEnedisMonthlyAnalysisByDate: mockGetEnedisMonthlyAnalysisByDate, aggregateValuesToDataLoad: mockAggregateValuesToDataLoad, + getOffPeakHours: () => null, })) }) const mockPerfIndicator: PerformanceIndicator = { @@ -52,10 +53,10 @@ describe('ElecHalfHourMonthlyAnalysis component', () => { beforeEach(() => { jest.clearAllMocks() }) - it('should be rendered correctly when isHalfHourActivated is false', async () => { mockCheckDoctypeEntries.mockResolvedValueOnce(false) mockGetPrices.mockResolvedValue(allLastFluidPrices[0]) + const { container } = render( <Provider store={store}> <ElecHalfHourMonthlyAnalysis perfIndicator={mockPerfIndicator} /> diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx index 4656b493d2289f96eab56868efd15bb8da8908b1..332d2177ccc1fb7d3231789e62c24fcdb6be3e43 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx @@ -3,6 +3,7 @@ import IconButton from '@material-ui/core/IconButton' import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg' import MaxPowerIcon from 'assets/icons/ico/maxPower.svg' import MinIcon from 'assets/icons/ico/minimum.svg' +import OffPeakHourIcon from 'assets/icons/ico/offPeakHour.svg' import RightArrowIcon from 'assets/icons/ico/right-arrow.svg' import Loader from 'components/Loader/Loader' import { useClient } from 'cozy-client' @@ -21,6 +22,7 @@ import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData import FluidPricesService from 'services/fluidsPrices.service' import { useAppSelector } from 'store/hooks' import { getNavPicto } from 'utils/picto' +import { OffPeakHours } from 'utils/utils' import ElecHalfHourChart from './ElecHalfHourChart' import ElecInfoModal from './ElecInfoModal' import './elecHalfHourMonthlyAnalysis.scss' @@ -43,6 +45,7 @@ const ElecHalfHourMonthlyAnalysis = ({ const [facturePercentage, setFacturePercentage] = useState<number>() const [elecPrice, setElecPrice] = useState<FluidPrice>() const [openInfoModal, setOpenInfoModal] = useState<boolean>(false) + const [offPeakHours, setOffPeakHours] = useState<OffPeakHours[]>() const handleChangeWeek = useCallback(() => { setIsWeekend(prev => !prev) @@ -132,6 +135,26 @@ const ElecHalfHourMonthlyAnalysis = ({ } }, [analysisMonth, client]) + useEffect(() => { + let subscribed = true + const enedisMonthlyAnalysisDataService = + new EnedisMonthlyAnalysisDataService(client) + async function getOffPeakHours() { + if (subscribed) { + const offPeakHours = + await enedisMonthlyAnalysisDataService.getOffPeakHours() + if (offPeakHours) { + setOffPeakHours(offPeakHours) + } + } + } + getOffPeakHours() + + return () => { + subscribed = false + } + }, [client]) + return ( <div className="special-elec-container"> <Icon @@ -199,6 +222,28 @@ const ElecHalfHourMonthlyAnalysis = ({ )} </div> </div> + {enedisAnalysisValues?.offPeakHoursRatio != null && ( + <div className="container"> + <Icon + icon={OffPeakHourIcon} + size={40} + className="minIcon" + /> + <div className="text"> + <div className="min text-18-normal"> + {t('special_elec.offPeakHour')} + </div> + </div> + <div className="value kvAval"> + <div className="text-18-bold"> + {Math.round( + enedisAnalysisValues.offPeakHoursRatio * 100 + )} + <span className="text-18-normal"> %</span> + </div> + </div> + </div> + )} <div className="container consomin"> <Icon icon={MinIcon} size={40} className="minIcon" /> <div className="text text-18-normal"> @@ -243,7 +288,11 @@ const ElecHalfHourMonthlyAnalysis = ({ )} </> )} - <ElecInfoModal open={openInfoModal} handleCloseClick={toggleOpenModal} /> + <ElecInfoModal + open={openInfoModal} + offPeakHours={offPeakHours} + handleCloseClick={toggleOpenModal} + /> </div> ) } diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.spec.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.spec.tsx index f41b110bfd9928fd4e04cdd8b6d7a72aceec2cf1..e00eecbcf5d8176eee2aef7ba0d31f5355714503 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.spec.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.spec.tsx @@ -3,9 +3,28 @@ import React from 'react' import ElecInfoModal from './ElecInfoModal' describe('ElecInfoModal component', () => { - it('should be rendered correctly', () => { + it('should be rendered correctly without off-peak hour info', () => { const { baseElement } = render( - <ElecInfoModal open={true} handleCloseClick={jest.fn()} /> + <ElecInfoModal + open={true} + offPeakHours={undefined} + handleCloseClick={jest.fn()} + /> + ) + expect(baseElement).toMatchSnapshot() + }) + it('should be rendered correctly with off-peak hour info', () => { + const { baseElement } = render( + <ElecInfoModal + open={true} + offPeakHours={[ + { + start: { hour: 10, minute: 0 }, + end: { hour: 18, minute: 0 }, + }, + ]} + handleCloseClick={jest.fn()} + /> ) expect(baseElement).toMatchSnapshot() }) diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx index 8f61f8aff2116494afb98998e1b2158a5c9f975d..d90558d7466add54019bd1fb73b204842fbffc81 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx @@ -4,16 +4,30 @@ import CloseIcon from 'assets/icons/ico/close.svg' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' import React from 'react' +import { + OffPeakHours, + formatListWithAnd, + formatOffPeakHours, +} from 'utils/utils' import './elecInfoModal.scss' interface ElecInfoModalProps { open: boolean + offPeakHours: OffPeakHours[] | undefined handleCloseClick: () => void } -const ElecInfoModal = ({ open, handleCloseClick }: ElecInfoModalProps) => { +const ElecInfoModal = ({ + open, + offPeakHours, + handleCloseClick, +}: ElecInfoModalProps) => { const { t } = useI18n() - + const displayedOffPeakHours = + offPeakHours && + formatListWithAnd( + offPeakHours.map(offPeakHour => formatOffPeakHours(offPeakHour)) + ) return ( <Dialog open={open} @@ -37,18 +51,30 @@ const ElecInfoModal = ({ open, handleCloseClick }: ElecInfoModalProps) => { <div className="elecInfoModal"> <div className="title text-18-bold">{t('elec_info_modal.title1')}</div> <div className="text"> - {t('elec_info_modal.text1')} + {t('elec_info_modal.text1-1')} <br /> - {t('elec_info_modal.text2')} + {t('elec_info_modal.text1-2')} </div> <div className="title text-18-bold">{t('elec_info_modal.title2')}</div> <div className="text"> - {t('elec_info_modal.text3')} + {t('elec_info_modal.text2-1')} <br /> - {t('elec_info_modal.text4')} + {t('elec_info_modal.text2-2')} <br /> - {t('elec_info_modal.text5')} + {t('elec_info_modal.text2-3')} </div> + {offPeakHours && ( + <> + <div className="title text-18-bold"> + {t('elec_info_modal.title3')} + </div> + <div className="text"> + {t('elec_info_modal.text3-1', { + offPeakHours: displayedOffPeakHours, + })} + </div> + </> + )} </div> </Dialog> ) diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap index 8c4b0ebdce5bb65be7f044c0c3a84336cc594f8c..7ec215c0aee87c294490ac0a9bf075397e9e3a7b 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap @@ -78,20 +78,20 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` <g> <g class="barContainer " - transform="translate(79.09090909090912, -40)" + transform="translate(21.219512195121922, -40)" > <rect class="background-undefined" fill="#E0E0E0" height="180" - width="711.8181818181818" + width="190.97560975609758" x="0" y="0" /> </g> <g class="barFill" - transform="translate(79.09090909090912, 0)" + transform="translate(21.219512195121922, 0)" > <defs> <lineargradient @@ -124,7 +124,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` /> </g> <g - transform="translate(79.09090909090912, 0)" + transform="translate(21.219512195121922, 0)" > <defs> <lineargradient @@ -161,20 +161,20 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` <g> <g class="barContainer " - transform="translate(79.09090909090912, -40)" + transform="translate(233.41463414634146, -40)" > <rect class="background-undefined" fill="#E0E0E0" height="180" - width="711.8181818181818" + width="190.97560975609758" x="0" y="0" /> </g> <g class="barFill" - transform="translate(79.09090909090912, 0)" + transform="translate(233.41463414634146, 0)" > <defs> <lineargradient @@ -207,7 +207,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` /> </g> <g - transform="translate(79.09090909090912, 0)" + transform="translate(233.41463414634146, 0)" > <defs> <lineargradient @@ -244,20 +244,20 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` <g> <g class="barContainer " - transform="translate(79.09090909090912, -40)" + transform="translate(445.609756097561, -40)" > <rect class="background-undefined" fill="#E0E0E0" height="180" - width="711.8181818181818" + width="190.97560975609758" x="0" y="0" /> </g> <g class="barFill" - transform="translate(79.09090909090912, 0)" + transform="translate(445.609756097561, 0)" > <defs> <lineargradient @@ -290,7 +290,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` /> </g> <g - transform="translate(79.09090909090912, 0)" + transform="translate(445.609756097561, 0)" > <defs> <lineargradient @@ -327,20 +327,20 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` <g> <g class="barContainer " - transform="translate(79.09090909090912, -40)" + transform="translate(657.8048780487804, -40)" > <rect class="background-undefined" fill="#E0E0E0" height="180" - width="711.8181818181818" + width="190.97560975609758" x="0" y="0" /> </g> <g class="barFill" - transform="translate(79.09090909090912, 0)" + transform="translate(657.8048780487804, 0)" > <defs> <lineargradient @@ -373,7 +373,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` /> </g> <g - transform="translate(79.09090909090912, 0)" + transform="translate(657.8048780487804, 0)" > <defs> <lineargradient @@ -415,12 +415,12 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` <g class="tick" opacity="1" - transform="translate(79.09090909090912, 0)" + transform="translate(21.219512195121922, 0)" > <text class="chart-ticks-y-text" dy="0.71em" - x="355.9090909090909" + x="95.48780487804879" y="10" > <tspan @@ -434,17 +434,17 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` <g class="tick" opacity="1" - transform="translate(79.09090909090912, 0)" + transform="translate(233.41463414634146, 0)" /> <g class="tick" opacity="1" - transform="translate(79.09090909090912, 0)" + transform="translate(445.609756097561, 0)" /> <g class="tick" opacity="1" - transform="translate(79.09090909090912, 0)" + transform="translate(657.8048780487804, 0)" /> </g> </svg> diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap index 55b41b0e8aa630ef74c40b99539bdeea6581b22d..120a26734e421ffd093d96aa49886940c689423f 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ElecInfoModal component should be rendered correctly 1`] = ` +exports[`ElecInfoModal component should be rendered correctly with off-peak hour info 1`] = ` <body style="padding-right: 0px; overflow: hidden;" > @@ -71,9 +71,9 @@ exports[`ElecInfoModal component should be rendered correctly 1`] = ` <div class="text" > - elec_info_modal.text1 + elec_info_modal.text1-1 <br /> - elec_info_modal.text2 + elec_info_modal.text1-2 </div> <div class="title text-18-bold" @@ -83,11 +83,121 @@ exports[`ElecInfoModal component should be rendered correctly 1`] = ` <div class="text" > - elec_info_modal.text3 + elec_info_modal.text2-1 <br /> - elec_info_modal.text4 + elec_info_modal.text2-2 <br /> - elec_info_modal.text5 + elec_info_modal.text2-3 + </div> + <div + class="title text-18-bold" + > + elec_info_modal.title3 + </div> + <div + class="text" + > + elec_info_modal.text3-1 + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> +</body> +`; + +exports[`ElecInfoModal component should be rendered correctly without off-peak hour info 1`] = ` +<body + style="padding-right: 0px; overflow: hidden;" +> + <div + aria-hidden="true" + /> + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + elec_info_modal.accessibility.window_title + </div> + <button + aria-label="elec_info_modal.accessibility.button_close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <div + class="elecInfoModal" + > + <div + class="title text-18-bold" + > + elec_info_modal.title1 + </div> + <div + class="text" + > + elec_info_modal.text1-1 + <br /> + elec_info_modal.text1-2 + </div> + <div + class="title text-18-bold" + > + elec_info_modal.title2 + </div> + <div + class="text" + > + elec_info_modal.text2-1 + <br /> + elec_info_modal.text2-2 + <br /> + elec_info_modal.text2-3 </div> </div> </div> diff --git a/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap b/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap index c7b9d88446a2c31b5f36e58cee76e0d97662e27e..b731c1f5e66d493e2b636cc801f6d70b22245e9c 100644 --- a/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap +++ b/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap @@ -110,85 +110,8 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = ` > <g class="axis y" - fill="none" - font-family="sans-serif" - font-size="10" - text-anchor="start" transform="translate(885, 20)" - > - <g - class="tick" - opacity="1" - transform="translate(0,180.5)" - > - <line - stroke="currentColor" - x2="-940" - /> - <text - class="chart-ticks-y-text" - dy="0.32em" - fill="currentColor" - x="3" - > - 0 - </text> - </g> - <g - class="tick" - opacity="1" - transform="translate(0,128.46206434490742)" - > - <line - stroke="currentColor" - x2="-940" - /> - <text - class="chart-ticks-y-text" - dy="0.32em" - fill="currentColor" - x="3" - > - 20 FLUID.ELECTRICITY.UNIT - </text> - </g> - <g - class="tick" - opacity="1" - transform="translate(0,76.42412868981485)" - > - <line - stroke="currentColor" - x2="-940" - /> - <text - class="chart-ticks-y-text" - dy="0.32em" - fill="currentColor" - x="3" - > - 40 FLUID.ELECTRICITY.UNIT - </text> - </g> - <g - class="tick" - opacity="1" - transform="translate(0,24.386193034722293)" - > - <line - stroke="currentColor" - x2="-940" - /> - <text - class="chart-ticks-y-text" - dy="0.32em" - fill="currentColor" - x="3" - > - 60 FLUID.ELECTRICITY.UNIT - </text> - </g> - </g> + /> <g transform="translate(10,20)" > @@ -418,7 +341,6 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = ` transform="translate(54.6875, 0)" > <text - class="chart-ticks-y-text" dy="0.71em" transform="translate(109.375)" y="10" @@ -430,7 +352,6 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = ` transform="translate(328.125, 0)" > <text - class="chart-ticks-y-text" dy="0.71em" transform="translate(109.375)" y="10" @@ -442,7 +363,6 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = ` transform="translate(601.5625, 0)" > <text - class="chart-ticks-y-text" dy="0.71em" transform="translate(109.375)" y="10" diff --git a/src/components/Analysis/ProfileComparator/ProfileComparator.tsx b/src/components/Analysis/ProfileComparator/ProfileComparator.tsx index 7635f1ede663a2c653ed98ec146e17210f4671a7..a4159281de4a8465b23d8f55af85bbd6219d0117 100644 --- a/src/components/Analysis/ProfileComparator/ProfileComparator.tsx +++ b/src/components/Analysis/ProfileComparator/ProfileComparator.tsx @@ -91,11 +91,10 @@ const ProfileComparator = ({ useEffect(() => { let subscribed = true async function loadAverageConsumption() { + const analysisDate = analysisMonth.minus({ month: 1 }).startOf('month') const profileTypeEntityService = new ProfileTypeEntityService(client) const profileType: ProfileType | null = - await profileTypeEntityService.getProfileType( - analysisMonth.minus({ month: 1 }).startOf('month') - ) + await profileTypeEntityService.getProfileType(analysisDate) if (profileType !== null) { const profileTypeService: ProfileTypeService = new ProfileTypeService( profileType, @@ -104,7 +103,8 @@ const ProfileComparator = ({ ) const monthlyForecast: MonthlyForecast = await profileTypeService.getMonthlyForecast( - analysisMonth.minus({ month: 1 }).startOf('month').month + analysisDate.year, + analysisDate.month ) if (subscribed) { setForecast(monthlyForecast) diff --git a/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap b/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap index bcb5b25883c896920cc746a8a40bb53224c071e4..c8c370b1e1cd54cf3b3e63cd84f919ea15d67680 100644 --- a/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap +++ b/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap @@ -203,9 +203,6 @@ exports[`AnalysisConsumption component should be rendered correctly with profile /> </svg> </span> - <span - class="MuiTouchRipple-root" - /> </div> </div> <div diff --git a/src/components/Analysis/monthlyanalysis.scss b/src/components/Analysis/monthlyanalysis.scss index 15f293d72097d6eeab8e3212c9e6f473ae7679d0..2d7afc608946784ee4dd2714cb147b7a35c7fc74 100644 --- a/src/components/Analysis/monthlyanalysis.scss +++ b/src/components/Analysis/monthlyanalysis.scss @@ -1,5 +1,4 @@ @import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; .analysis-root { display: flex; @@ -9,11 +8,8 @@ gap: 1rem; .analysis-content { - width: 45.75rem; - - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; } .status-header { display: grid; diff --git a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx index 7ac922efb3966c92c59af76cc516215f42c6f369..46c7d7a5ff3dbaa547b01c59af4ec345d753f0ea 100644 --- a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx +++ b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx @@ -3,7 +3,6 @@ import { userEvent } from '@testing-library/user-event' import { FluidType } from 'enums' import React from 'react' import { Provider } from 'react-redux' -import UsageEventService from 'services/usageEvent.service' import { createMockEcolyoStore, mockChallengeState, @@ -19,9 +18,6 @@ jest.mock('services/challenge.service', () => { })) }) -jest.mock('services/usageEvent.service') -UsageEventService.addEvent = jest.fn() - describe('ChallengeCardUnlocked component', () => { const store = createMockEcolyoStore() it('should be rendered correctly', () => { diff --git a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx index be661f7eb8a4002db535d7d089470063483d0d97..83926cbe364a54b9e8a17c80d1e5f80bcf32429e 100644 --- a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx +++ b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx @@ -3,11 +3,10 @@ import defaultIcon from 'assets/icons/visu/challenge/challengeLocked.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidState, UsageEventType } from 'enums' +import { FluidState } from 'enums' import { UserChallenge } from 'models' import React, { useCallback, useEffect, useState } from 'react' import ChallengeService from 'services/challenge.service' -import UsageEventService from 'services/usageEvent.service' import { updateUserChallengeList } from 'store/challenge/challenge.slice' import { useAppDispatch, useAppSelector } from 'store/hooks' import { getChallengeTitleWithLineReturn, importIconById } from 'utils/utils' @@ -48,10 +47,6 @@ const ChallengeCardUnlocked = ({ const challengeService = new ChallengeService(client) const updatedChallenge = await challengeService.startUserChallenge(userChallenge) - await UsageEventService.addEvent(client, { - type: UsageEventType.CHALLENGE_LAUNCH_EVENT, - target: userChallenge.id, - }) dispatch(updateUserChallengeList(updatedChallenge)) } else { return toggleNoFluidModal() diff --git a/src/components/Charts/Bar.tsx b/src/components/Charts/Bar.tsx index 45a4b36c61b54eda6fdbafcb9242a822bab3f0c1..62ca898f1ec8a8c770095689814a9ab8bb715593 100644 --- a/src/components/Charts/Bar.tsx +++ b/src/components/Charts/Bar.tsx @@ -48,7 +48,7 @@ const Bar = ({ }: BarProps) => { const dispatch = useAppDispatch() const { - chart: { selectedDate }, + chart: { selectedDate, currentTimeStep }, global: { fluidStatus }, } = useAppSelector(state => state.ecolyo) const [clicked, setClicked] = useState(false) @@ -81,18 +81,25 @@ const Bar = ({ const lastDataDates = fluidStatus.map( fluid => fluid.lastDataDate ?? DateTime.local(0) ) - const lastDataDate = isMulti + /** Pick current fluid date or max for multi */ + let lastDataDate = isMulti ? DateTime.max(...lastDataDates) : lastDataDates[fluidType] - const dataMissingUpcoming = Boolean( + /** Remove a day when viewing half-hour */ + lastDataDate = lastDataDate.plus({ + days: currentTimeStep === TimeStep.HALF_AN_HOUR ? 1 : 0, + }) + + /** True when between lastData and today's range */ + const isDataMissingOrUpcoming = Boolean( dataload.date > lastDataDate && dataload.date < DateTime.local() ) let value = dataload.value /** Adjust value for upcoming data (placeholder bars) */ - if (dataMissingUpcoming && average) { + if (isDataMissingOrUpcoming && average) { if (average > 1) { // Use 10% of average if average is above 1 value = average * 0.1 @@ -194,7 +201,7 @@ const Bar = ({ </g> )} {/* placeholder bar for upcoming values */} - {height > 0 && dataMissingUpcoming && ( + {height > 0 && isDataMissingOrUpcoming && ( <g transform={`translate(${xScaleValue}, ${yScaleValue})`} className="barFill" diff --git a/src/components/CommonKit/FormNavigation/FormNavigation.spec.tsx b/src/components/CommonKit/FormNavigation/FormNavigation.spec.tsx index c28c8322612668f9fbbf3e0637f934beb1fa87ff..b9be78286030fbeb9deedf9ac78ed3b28526f7e6 100644 --- a/src/components/CommonKit/FormNavigation/FormNavigation.spec.tsx +++ b/src/components/CommonKit/FormNavigation/FormNavigation.spec.tsx @@ -1,6 +1,5 @@ import { render, screen } from '@testing-library/react' import { userEvent } from '@testing-library/user-event' -import { ProfileTypeStepForm } from 'enums' import React from 'react' import FormNavigation from './FormNavigation' @@ -10,10 +9,10 @@ describe('FormNavigation component', () => { const mockHandleNext = jest.fn() render( <FormNavigation - step={ProfileTypeStepForm.COOKING_FLUID} handlePrevious={mockHandlePrevious} handleNext={mockHandleNext} disableNextButton={false} + disablePrevButton={false} /> ) const [prevButton, nextButton] = screen.getAllByRole('button') diff --git a/src/components/CommonKit/FormNavigation/FormNavigation.tsx b/src/components/CommonKit/FormNavigation/FormNavigation.tsx index be6e49794736fb118e6d1215b314976f231b4c62..cd13d77ef248aa7df3649c9b6f22ab9497fcb9ef 100644 --- a/src/components/CommonKit/FormNavigation/FormNavigation.tsx +++ b/src/components/CommonKit/FormNavigation/FormNavigation.tsx @@ -1,78 +1,50 @@ import Button from '@material-ui/core/Button' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { EcogestureStepForm, ProfileTypeStepForm, SgeStep } from 'enums' import React, { useCallback } from 'react' -import { useNavigate } from 'react-router-dom' import './formNavigation.scss' interface FormNavigationProps { - step: ProfileTypeStepForm | EcogestureStepForm | SgeStep handlePrevious: () => void handleNext: () => void - disableNextButton: boolean disablePrevButton?: boolean - isEcogesture?: boolean - isLastConnectStep?: boolean + disableNextButton: boolean + isLastStep?: boolean isLoading?: boolean } const FormNavigation = ({ - step, handlePrevious, handleNext, - disableNextButton, disablePrevButton, - isEcogesture, - isLastConnectStep, + disableNextButton, + isLastStep, isLoading, }: FormNavigationProps) => { const { t } = useI18n() - const navigate = useNavigate() - const handlePreviousClick = () => { - handlePrevious() - } - const handleNextClick = () => { - handleNext() - // handle go back to connect for SGE - if (isLastConnectStep) { - navigate('/consumption/electricity') - } - } const getSecondButtonLabel = useCallback(() => { - if (isLoading) { - return t('profile_type.form.button_loading') - } else if ( - isLastConnectStep || - step === ProfileTypeStepForm.UPDATE_DATE || - (step === EcogestureStepForm.EQUIPMENTS && isEcogesture) - ) { - return t('profile_type.form.button_end') - } else { - return t('profile_type.form.button_next') - } - }, [isEcogesture, isLastConnectStep, isLoading, step, t]) + if (isLoading) return t('profile_type.form.button_loading') + if (isLastStep) return t('profile_type.form.button_end') + return t('profile_type.form.button_next') + }, [isLastStep, isLoading, t]) return ( <div className="profile-navigation"> <Button aria-label={t('profile_type.accessibility.button_previous')} - onClick={handlePreviousClick} + onClick={handlePrevious} className="btnSecondary" - disabled={ - disablePrevButton || step === ProfileTypeStepForm.HOUSING_TYPE - } + disabled={disablePrevButton} > {t('profile_type.form.button_previous')} </Button> <Button aria-label={ - step === ProfileTypeStepForm.UPDATE_DATE || - (step === EcogestureStepForm.EQUIPMENTS && isEcogesture) + isLastStep ? t('profile_type.accessibility.button_end') : t('profile_type.accessibility.button_next') } - onClick={handleNextClick} + onClick={handleNext} className="btnPrimary" disabled={disableNextButton} > diff --git a/src/components/CommonKit/FormProgress/FormProgress.spec.tsx b/src/components/CommonKit/FormProgress/FormProgress.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..988676204d9026082667229b6852b27b65eef867 --- /dev/null +++ b/src/components/CommonKit/FormProgress/FormProgress.spec.tsx @@ -0,0 +1,19 @@ +import { render, screen } from '@testing-library/react' +import React from 'react' +import FormProgress from './FormProgress' + +describe('FormProgress', () => { + it('should be rendered correctly with a progressbar', () => { + render(<FormProgress currentStep={5} totalSteps={10} />) + expect(screen.getByRole('progressbar')).toBeInTheDocument() + }) + + it('should min out to "1%"', () => { + render(<FormProgress currentStep={0} totalSteps={5} />) + expect(screen.getByText('1%')).toBeInTheDocument() + }) + it('should max out to "100%"', () => { + render(<FormProgress currentStep={5} totalSteps={0} />) + expect(screen.getByText('100%')).toBeInTheDocument() + }) +}) diff --git a/src/components/CommonKit/FormProgress/FormProgress.tsx b/src/components/CommonKit/FormProgress/FormProgress.tsx index 103e6305a72b80eee37158e5db0414c0c2d2ac49..d5c35a49f6b1bc29ccc4cff00337660d0cdbb52d 100644 --- a/src/components/CommonKit/FormProgress/FormProgress.tsx +++ b/src/components/CommonKit/FormProgress/FormProgress.tsx @@ -1,28 +1,25 @@ -import { ProfileTypeStepForm, SgeStep } from 'enums' +import { LinearProgress } from '@material-ui/core' import React from 'react' import './formProgress.scss' -interface FormProgressProps { - step: ProfileTypeStepForm | SgeStep - formType: 'sge' | 'profile' -} +const FormProgress = ({ + currentStep, + totalSteps, +}: { + currentStep: number + /** When working with numeric enums, divide the result by 2, because a reverse mapping is generated. */ + totalSteps: number +}) => { + const progress = Math.min( + Math.round((currentStep / totalSteps) * 100) || 1, + 100 + ) -const FormProgress = ({ step, formType }: FormProgressProps) => { - const getProgress = () => { - const total: number = - Object.values(formType === 'sge' ? SgeStep : ProfileTypeStepForm).length / - 2 - const progress: number = Math.round((step / total) * 100) || 1 - return progress - } return ( - <div className="profile-type-progress"> - <div className="profile-type-progress-label">{getProgress()}%</div> - <div className="profile-type-progress-bar-container"> - <div - className="profile-type-progress-bar-content" - style={{ width: `${getProgress()}%` }} - /> + <div className="formProgress"> + <span>{progress}%</span> + <div className="container"> + <LinearProgress variant="determinate" value={progress} /> </div> </div> ) diff --git a/src/components/CommonKit/FormProgress/formProgress.scss b/src/components/CommonKit/FormProgress/formProgress.scss index dd1f500a85c283e899f54be9a04d1b5963755057..7a70e0fde58da161995fe400ac9971fcf800fb03 100644 --- a/src/components/CommonKit/FormProgress/formProgress.scss +++ b/src/components/CommonKit/FormProgress/formProgress.scss @@ -1,26 +1,18 @@ @import 'src/styles/base/color'; -.profile-type-progress { +.formProgress { display: flex; flex-direction: row; justify-content: center; align-items: center; - .profile-type-progress-label { + gap: 8px; + span { font-size: 0.938rem; font-weight: 700; - width: 1.875rem; color: $gold-shadow; - text-align: right; } - .profile-type-progress-bar-container { - margin-left: 0.5rem; + .container { flex: 1; height: 6px; - background-color: $dark-light-2; - .profile-type-progress-bar-content { - height: 100%; - background-color: $gold-shadow; - border-radius: 12px; - } } } diff --git a/src/components/Connection/EPGLConnect/FormLogin/FormLogin.tsx b/src/components/Connection/EPGLConnect/FormLogin/FormLogin.tsx index 3d17b4adb881229e024a767a57496c4e2edf94f5..68ca5f4fbf8b5585b43bc24dbe0dd7ec20d100dd 100644 --- a/src/components/Connection/EPGLConnect/FormLogin/FormLogin.tsx +++ b/src/components/Connection/EPGLConnect/FormLogin/FormLogin.tsx @@ -1,6 +1,7 @@ import Button from '@material-ui/core/Button' import * as Sentry from '@sentry/react' import TrailingIcon from 'assets/icons/ico/trailing-icon.svg' +import EglLogo from 'assets/icons/visu/egl-logo.svg' import classNames from 'classnames' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton' @@ -11,7 +12,6 @@ import { Account, AccountAuthData } from 'models' import React, { useEffect, useState } from 'react' import { useAppSelector } from 'store/hooks' import logApp from 'utils/logger' -import { getPartnerPicto } from 'utils/picto' import './formLogin.scss' const FormLogin = () => { @@ -31,7 +31,6 @@ const FormLogin = () => { const [loading, setLoading] = useState<boolean>(false) const [showPassword, setShowPassword] = useState(false) - const icon = getPartnerPicto(konnectorSlug) const [connect, update, connectError] = useKonnectorAuth( currentFluidStatus.fluidType, login, @@ -138,7 +137,7 @@ const FormLogin = () => { > <div className="connection-form-connect-button-content"> <div className="connection-form-connect-button-content-icon"> - {icon && <StyledIcon icon={icon} size={80} />} + <StyledIcon icon={EglLogo} size={80} /> </div> <div className="connection-form-connect-button-text text-18-bold"> <div>{t(`auth.${konnectorSlug}.connect_form.label`)}</div> diff --git a/src/components/Connection/GRDFConnect/GrdfInit.tsx b/src/components/Connection/GRDFConnect/GrdfInit.tsx index 8761ee395e1bac7ac8fbcc9a15b075cb798a7731..d851448b4ba66e7fc1f36d827593bcb1bc938b4e 100644 --- a/src/components/Connection/GRDFConnect/GrdfInit.tsx +++ b/src/components/Connection/GRDFConnect/GrdfInit.tsx @@ -1,11 +1,10 @@ import GrdfConnectModal from 'components/Connection/PartnerConnectModal/GrdfConnectModal' import { useClient } from 'cozy-client' -import { FluidType, UsageEventType } from 'enums' +import { FluidType } from 'enums' import { FluidConnection, Konnector, Trigger } from 'models' import React, { useCallback, useState } from 'react' import AccountService from 'services/account.service' import TriggerService from 'services/triggers.service' -import UsageEventService from 'services/usageEvent.service' import { updateFluidConnection } from 'store/global/global.slice' import { useAppDispatch, useAppSelector } from 'store/hooks' import { openConnectionModal } from 'store/modal/modal.slice' @@ -24,8 +23,6 @@ const GrdfInit = ({ onSuccess }: { onSuccess: () => Promise<void> }) => { const [showForm, setShowForm] = useState(false) const currentFluidStatus = fluidStatus[FluidType.GAS] - const konnectorSlug: string = - currentFluidStatus.connection.konnectorConfig.slug const siteLink: string = currentFluidStatus.connection.konnectorConfig.siteLink const konnector: Konnector | null = currentFluidStatus.connection.konnector @@ -47,11 +44,6 @@ const GrdfInit = ({ onSuccess }: { onSuccess: () => Promise<void> }) => { fluidConnection: updatedConnection, }) ) - await UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: konnectorSlug, - result: 'error', - }) } else { const triggersServices = new TriggerService(client) const trigger: Trigger = await triggersServices.createTrigger( @@ -80,7 +72,6 @@ const GrdfInit = ({ onSuccess }: { onSuccess: () => Promise<void> }) => { currentFluidStatus.fluidType, currentFluidStatus.connection, onSuccess, - konnectorSlug, ] ) diff --git a/src/components/Connection/PartnerConnectModal/Steps/GrdfFormOAuth.tsx b/src/components/Connection/PartnerConnectModal/Steps/GrdfFormOAuth.tsx index 30941eb12345ab546420212726d5f09d88f371fb..aa598b45f1ac7ed9491ed17aff330cadc5ce08d2 100644 --- a/src/components/Connection/PartnerConnectModal/Steps/GrdfFormOAuth.tsx +++ b/src/components/Connection/PartnerConnectModal/Steps/GrdfFormOAuth.tsx @@ -2,10 +2,9 @@ import Button from '@material-ui/core/Button' import { useClient } from 'cozy-client' import { OAuthWindow } from 'cozy-harvest-lib/dist/components/OAuthWindow' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidType, UsageEventType } from 'enums' +import { FluidType } from 'enums' import { Konnector } from 'models' import React, { useCallback, useEffect, useState } from 'react' -import UsageEventService from 'services/usageEvent.service' import { setShouldRefreshConsent } from 'store/global/global.slice' import { useAppDispatch, useAppSelector } from 'store/hooks' @@ -14,9 +13,6 @@ const GrdfFormOAuth = ({ }: { onSuccess: (accountId: string) => Promise<void> }) => { - const IDLE = 'idle' - const WAITING = 'waiting' - const { t } = useI18n() const client = useClient() const { shouldRefreshConsent, fluidStatus } = useAppSelector( @@ -25,25 +21,13 @@ const GrdfFormOAuth = ({ const currentFluidStatus = fluidStatus[FluidType.GAS] const konnector: Konnector | null = currentFluidStatus.connection.konnector const dispatch = useAppDispatch() - const [status, setStatus] = useState<string>(IDLE) + const [status, setStatus] = useState<'idle' | 'waiting'>('idle') const endOAuth = useCallback(() => { - setStatus(IDLE) + setStatus('idle') // Set back to false the variable that allows to automatically refresh the consent (deletes and recreates the account) dispatch(setShouldRefreshConsent(false)) }, [dispatch]) - const startOAuth = useCallback(async () => { - // If first connexion, send the usage event - if (konnector?.slug && currentFluidStatus.lastDataDate === null) { - await UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: konnector.slug, - result: 'error', - }) - } - setStatus(WAITING) - }, [client, currentFluidStatus.lastDataDate, konnector]) - const handleAccountId = useCallback( (accountId: string) => { endOAuth() @@ -52,14 +36,14 @@ const GrdfFormOAuth = ({ [endOAuth, onSuccess] ) - const isWaiting = status === WAITING + const isWaiting = status === 'waiting' useEffect(() => { if (shouldRefreshConsent) { - // If user has selected accept button on Expired consent modal, his account has been deleted on KonnectorViewerCard, such as his consent (for GRDF), then automatically launch oauth connxion flow - startOAuth() + // If user has selected accept button on Expired consent modal, his account has been deleted on KonnectorViewerCard, such as his consent (for GRDF), then automatically launch oauth connection flow + setStatus('waiting') } - }, [shouldRefreshConsent, startOAuth]) + }, [shouldRefreshConsent]) if (!konnector) { return null @@ -69,7 +53,7 @@ const GrdfFormOAuth = ({ <> <Button aria-label={t('auth.accessibility.button_connect')} - onClick={startOAuth} + onClick={() => setStatus('waiting')} disabled={isWaiting} className="btnPrimary" > diff --git a/src/components/Connection/SGEConnect/SgeConnect.scss b/src/components/Connection/SGEConnect/SgeConnect.scss index 8e7b745ae7caf6b2ef5fdfbb282cea3e9ec22eb0..feb9ac3bc4103c797bdbb1348a5fe8d3939221ce 100644 --- a/src/components/Connection/SGEConnect/SgeConnect.scss +++ b/src/components/Connection/SGEConnect/SgeConnect.scss @@ -71,39 +71,39 @@ } } .sgeHintModal { - text-align: center; - .title { + padding: 1rem; + display: flex; + flex-direction: column; + text-align: left; + + h1 { + text-align: center; color: $gold-shadow; margin: 1rem 0; } - .pdl { - padding: 1rem; + + .sgeHintModal-content { display: flex; flex-direction: column; gap: 1rem; - background: #eff2f4; - text-align: left; - p { - color: #526576; + color: $grey-bright; margin: 0; + text-wrap: pretty; } .bill { display: flex; + align-items: center; gap: 0.5rem; + p { + color: $gold-shadow; + } } svg.prm { width: 100%; height: 180px; } - svg.bill { - width: 150px; - height: 80px; - } - } - button { - margin-top: 1rem; } } diff --git a/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx index 02d958a4e4a22cd6962b356a853e5ca3f4988234..d7c9af6ba030bc7974378d9cdb429050d76f1e0f 100644 --- a/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx +++ b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx @@ -2,6 +2,7 @@ import { render, screen } from '@testing-library/react' import { userEvent } from '@testing-library/user-event' import React from 'react' import { Provider } from 'react-redux' +import { BrowserRouter } from 'react-router-dom' import * as storeHooks from 'store/hooks' import { createMockEcolyoStore } from 'tests/__mocks__/store' import SgeConnectView from './SgeConnectView' @@ -19,7 +20,9 @@ describe('SgeConnectView component', () => { it('should be rendered correctly', () => { const { container } = render( <Provider store={store}> - <SgeConnectView /> + <BrowserRouter> + <SgeConnectView /> + </BrowserRouter> </Provider> ) expect(container).toMatchSnapshot() @@ -29,7 +32,9 @@ describe('SgeConnectView component', () => { it('should call nextStep method', async () => { render( <Provider store={store}> - <SgeConnectView /> + <BrowserRouter> + <SgeConnectView /> + </BrowserRouter> </Provider> ) await userEvent.click(screen.getAllByRole('button')[1]) diff --git a/src/components/Connection/SGEConnect/SgeConnectView.tsx b/src/components/Connection/SGEConnect/SgeConnectView.tsx index d09bc8f7292733bea6dc556aee98b317007192a5..5a5df27cc2eb7d666ebcdfe02487f0d85a392311 100644 --- a/src/components/Connection/SGEConnect/SgeConnectView.tsx +++ b/src/components/Connection/SGEConnect/SgeConnectView.tsx @@ -6,6 +6,7 @@ import Header from 'components/Header/Header' import { SgeStep } from 'enums' import { SgeStore } from 'models' import React, { useCallback, useState } from 'react' +import { useNavigate } from 'react-router' import { updateSgeStore } from 'store/global/global.slice' import { useAppDispatch, useAppSelector } from 'store/hooks' import './SgeConnect.scss' @@ -24,6 +25,7 @@ export type SGEKeysForm = | 'pdlConfirm' const SgeConnectView = () => { + const navigate = useNavigate() const dispatch = useAppDispatch() const { sgeConnect } = useAppSelector(state => state.ecolyo.global) const [isLoading, setIsLoading] = useState(false) @@ -80,8 +82,9 @@ const SgeConnectView = () => { } setCurrentSgeState(updatedState) dispatch(updateSgeStore(updatedState)) + navigate('/consumption/electricity') } - }, [currentSgeState, currentStep, dispatch, isNextValid, isLoading]) + }, [currentStep, isNextValid, isLoading, dispatch, currentSgeState, navigate]) const handlePrev = useCallback(() => { if (currentStep !== SgeStep.IdentityAndPDL) { @@ -137,18 +140,19 @@ const SgeConnectView = () => { <Content heightOffset={headerHeight}> <div className="sge-view"> <div className="sge-container"> - <FormProgress step={currentStep} formType="sge" /> + <FormProgress + currentStep={currentStep} + totalSteps={Object.values(SgeStep).length / 2} + /> {renderStep(currentStep)} </div> <FormNavigation - step={currentStep} handlePrevious={handlePrev} handleNext={handleNext} isLoading={isLoading} - disableNextButton={!isNextValid() || isLoading} disablePrevButton={currentStep === SgeStep.IdentityAndPDL} - isLastConnectStep={currentStep === SgeStep.Consent} - isEcogesture={false} + disableNextButton={!isNextValid() || isLoading} + isLastStep={currentStep === SgeStep.Consent} /> </div> </Content> diff --git a/src/components/Connection/SGEConnect/SgeModalHint.tsx b/src/components/Connection/SGEConnect/SgeModalHint.tsx index 788896228f53ad018c000daeba9515d667e729be..4e18157d9b818e0da8ea8b5630c4c7dca05f0f44 100644 --- a/src/components/Connection/SGEConnect/SgeModalHint.tsx +++ b/src/components/Connection/SGEConnect/SgeModalHint.tsx @@ -28,38 +28,44 @@ const SgeModalHint = ({ open, handleCloseClick }: SgeModalHintProps) => { }} > <div id="accessibility-title"> - {t('challenge_no_fluid_modal.accessibility.window_title')} + {t('auth.enedissgegrandlyon.pdlModal.title_accessibility')} </div> <IconButton - aria-label={t('feedback.accessibility.button_close')} + aria-label={t('auth.accessibility.button_close')} className="modal-paper-close-button" onClick={handleCloseClick} > <Icon icon={CloseIcon} size={16} /> </IconButton> <div className="sgeHintModal"> - <div className="title text-20-bold"> - {t('auth.enedissgegrandlyon.modalHint.title')} - </div> - <div className="pdl"> + <h1 className="text-20-bold"> + {t('auth.enedissgegrandlyon.pdlModal.title')} + </h1> + <div className="sgeHintModal-content"> <p>{t('auth.enedissgegrandlyon.pdlModal.txt1')}</p> <p>{t('auth.enedissgegrandlyon.pdlModal.txt2')}</p> <div className="bill"> - <Icon icon={Bill} alt="Facture" className="bill" /> - <p>{t('auth.enedissgegrandlyon.pdlModal.txt3')}</p> + <Icon icon={Bill} alt="" size={52} /> + <p className="text-16-bold"> + {t('auth.enedissgegrandlyon.pdlModal.txt3')} + </p> </div> <p>{t('auth.enedissgegrandlyon.pdlModal.txt4')}</p> - <Icon icon={Prm} alt="PDL" className="prm" /> + <Icon + icon={Prm} + alt={t('auth.enedissgegrandlyon.pdlModal.prm_accessibility')} + className="prm" + /> + <Button + aria-label={t( + 'auth.enedissgegrandlyon.pdlModal.button_accessibility' + )} + onClick={handleCloseClick} + className="btnPrimary" + > + {t('auth.enedissgegrandlyon.pdlModal.button')} + </Button> </div> - <Button - aria-label={t( - 'auth.enedissgegrandlyon.modalHint.button-accessibility' - )} - onClick={handleCloseClick} - className="btnPrimary" - > - {t('auth.enedissgegrandlyon.modalHint.button')} - </Button> </div> </Dialog> ) diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx index 88ac266d83c8d89262674911480394e8a452e0e3..ef172bd9d6f3fb0345cd28e4816dc7d881da0b61 100644 --- a/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx @@ -49,10 +49,10 @@ describe('StepIdentityAndPdl component', () => { expect(mockHandleChange).toHaveBeenCalledWith('pdl', '0', 14) }) it('should open hint modal', async () => { - const pdlHint = screen.getByRole('button', { - name: 'auth.enedissgegrandlyon.pdlHint', + const pdlModalButton = screen.getByRole('button', { + name: 'auth.enedissgegrandlyon.pdlModal.title', }) - await userEvent.click(pdlHint) + await userEvent.click(pdlModalButton) expect(screen.getByRole('dialog')).toBeInTheDocument() }) }) diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx index 973590f570cb079d9c29d13d8d0ec416c1fc9716..b9ef3bd752e76cac895d3cbd720b7a4780e149e7 100644 --- a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx +++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx @@ -69,7 +69,7 @@ const StepIdentityAndPdl = ({ /> </label> <Button className="btnText" onClick={toggleModal}> - {t('auth.enedissgegrandlyon.pdlHint')} + {t('auth.enedissgegrandlyon.pdlModal.title')} </Button> <SgeModalHint open={openHintModal} handleCloseClick={toggleModal} /> </div> diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap index 921a6dd18d944d8834f8cd247257329dd02687d4..036c91711c4583892436719e7182be2c67610df0 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap @@ -86,21 +86,27 @@ exports[`SgeConnectView component should be rendered correctly 1`] = ` class="sge-container" > <div - class="profile-type-progress" + class="formProgress" > - <div - class="profile-type-progress-label" - > + <span> 1 % - </div> + </span> <div - class="profile-type-progress-bar-container" + class="container" > <div - class="profile-type-progress-bar-content" - style="width: 1%;" - /> + aria-valuemax="100" + aria-valuemin="0" + aria-valuenow="1" + class="MuiLinearProgress-root MuiLinearProgress-colorPrimary MuiLinearProgress-determinate" + role="progressbar" + > + <div + class="MuiLinearProgress-bar MuiLinearProgress-barColorPrimary MuiLinearProgress-bar1Determinate" + style="transform: translateX(-99%);" + /> + </div> </div> </div> <div @@ -168,7 +174,7 @@ exports[`SgeConnectView component should be rendered correctly 1`] = ` <span class="MuiButton-label" > - auth.enedissgegrandlyon.pdlHint + auth.enedissgegrandlyon.pdlModal.title </span> <span class="MuiTouchRipple-root" diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap index 78b078c6f75ee3ef999c2c06b7d2fee8b572816b..cc445baab5c109866977c4f3fcd16b676e047082 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap @@ -35,10 +35,10 @@ exports[`SgeModalHint component should be rendered correctly 1`] = ` <div id="accessibility-title" > - challenge_no_fluid_modal.accessibility.window_title + auth.enedissgegrandlyon.pdlModal.title_accessibility </div> <button - aria-label="feedback.accessibility.button_close" + aria-label="auth.accessibility.button_close" class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" tabindex="0" type="button" @@ -63,13 +63,13 @@ exports[`SgeModalHint component should be rendered correctly 1`] = ` <div class="sgeHintModal" > - <div - class="title text-20-bold" + <h1 + class="text-20-bold" > - auth.enedissgegrandlyon.modalHint.title - </div> + auth.enedissgegrandlyon.pdlModal.title + </h1> <div - class="pdl" + class="sgeHintModal-content" > <p> auth.enedissgegrandlyon.pdlModal.txt1 @@ -81,16 +81,18 @@ exports[`SgeModalHint component should be rendered correctly 1`] = ` class="bill" > <svg - alt="Facture" - class="bill styles__icon___23x3R" - height="16" - width="16" + alt="" + class="styles__icon___23x3R" + height="52" + width="52" > <use xlink:href="#test-file-stub" /> </svg> - <p> + <p + class="text-16-bold" + > auth.enedissgegrandlyon.pdlModal.txt3 </p> </div> @@ -98,7 +100,7 @@ exports[`SgeModalHint component should be rendered correctly 1`] = ` auth.enedissgegrandlyon.pdlModal.txt4 </p> <svg - alt="PDL" + alt="auth.enedissgegrandlyon.pdlModal.prm_accessibility" class="prm styles__icon___23x3R" height="16" width="16" @@ -107,22 +109,22 @@ exports[`SgeModalHint component should be rendered correctly 1`] = ` xlink:href="#test-file-stub" /> </svg> - </div> - <button - aria-label="auth.enedissgegrandlyon.modalHint.button-accessibility" - class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary" - tabindex="0" - type="button" - > - <span - class="MuiButton-label" + <button + aria-label="auth.enedissgegrandlyon.pdlModal.button_accessibility" + class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary" + tabindex="0" + type="button" > - auth.enedissgegrandlyon.modalHint.button - </span> - <span - class="MuiTouchRipple-root" - /> - </button> + <span + class="MuiButton-label" + > + auth.enedissgegrandlyon.pdlModal.button + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> </div> </div> </div> diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap index b719879711be267defd23465fc7e0353b80721ab..6699b43c1e3bfd684e788b61345aa311b2d033d5 100644 --- a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap +++ b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap @@ -67,7 +67,7 @@ exports[`StepIdentityAndPdl component should be rendered correctly 1`] = ` <span class="MuiButton-label" > - auth.enedissgegrandlyon.pdlHint + auth.enedissgegrandlyon.pdlModal.title </span> <span class="MuiTouchRipple-root" diff --git a/src/components/Consumption/ConsumptionDetails/__snapshots__/ConsumptionDetails.spec.tsx.snap b/src/components/Consumption/ConsumptionDetails/__snapshots__/ConsumptionDetails.spec.tsx.snap index 8c78033304758d0eafb1a1cf706afff8f575341b..3c0517d1cdd8cbda84246c18ace6328b9def3cca 100644 --- a/src/components/Consumption/ConsumptionDetails/__snapshots__/ConsumptionDetails.spec.tsx.snap +++ b/src/components/Consumption/ConsumptionDetails/__snapshots__/ConsumptionDetails.spec.tsx.snap @@ -10,9 +10,7 @@ exports[`ConsumptionDetails component should be rendered correctly 1`] = ` > <div class="consumption-details-header text-16-normal-uppercase details-title" - > - - </div> + /> <div class="icon-line " > diff --git a/src/components/Consumption/ConsumptionDetails/consumptionDetails.scss b/src/components/Consumption/ConsumptionDetails/consumptionDetails.scss index e8827802dc2190d78ceb48102985d6b4840ea29e..8935757ac095da52dcabaf4cf072c73b30525f5b 100644 --- a/src/components/Consumption/ConsumptionDetails/consumptionDetails.scss +++ b/src/components/Consumption/ConsumptionDetails/consumptionDetails.scss @@ -1,5 +1,4 @@ @import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; .consumption-details-root { display: flex; @@ -12,10 +11,8 @@ margin-bottom: 1rem; .consumption-details-content { - width: 45.75rem; - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; .consumption-details-header { margin-bottom: 0.5rem; color: $grey-bright; diff --git a/src/components/Consumption/FluidButtons/FluidButton.spec.tsx b/src/components/Consumption/FluidButtons/FluidButton.spec.tsx index dac6e52ceb74f3fad1ce7ee4c889971a420d16d1..1c8fa5ea6e1821077906d7488b060d1a10013548 100644 --- a/src/components/Consumption/FluidButtons/FluidButton.spec.tsx +++ b/src/components/Consumption/FluidButtons/FluidButton.spec.tsx @@ -1,17 +1,11 @@ import { render } from '@testing-library/react' -import { userEvent } from '@testing-library/user-event' import { FluidState, FluidType } from 'enums' import { GlobalState } from 'models' import React from 'react' import { Provider } from 'react-redux' -import UsageEventService from 'services/usageEvent.service' import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store' import FluidButton from './FluidButton' -const mockAddEvent = jest.fn() -jest.mock('services/usageEvent.service') -UsageEventService.addEvent = mockAddEvent - describe('FluidButton component', () => { const store = createMockEcolyoStore() @@ -41,18 +35,6 @@ describe('FluidButton component', () => { ) expect(container.getElementsByClassName('active').length).toBeTruthy() }) - - it('should trigger nav event', async () => { - const { container } = render( - <Provider store={store}> - <FluidButton fluidType={FluidType.GAS} isActive={false} /> - </Provider> - ) - const navButton = container.getElementsByClassName('fluid-button')[0] - await userEvent.click(navButton) - expect(mockAddEvent).toHaveBeenCalled() - }) - it('should render errored button', () => { const updatedInitialState: GlobalState = { ...mockGlobalState, diff --git a/src/components/Consumption/FluidButtons/FluidButton.tsx b/src/components/Consumption/FluidButtons/FluidButton.tsx index 80e2a2da4ee4c94231c9159900a4c81493fa3207..f68eaa2d10542bfcbe93bfa8351ea37d049ce2a5 100644 --- a/src/components/Consumption/FluidButtons/FluidButton.tsx +++ b/src/components/Consumption/FluidButtons/FluidButton.tsx @@ -2,12 +2,10 @@ import { IconButton } from '@material-ui/core' import ErrorNotif from 'assets/icons/ico/notif_error.svg' import PartnerIssueNotif from 'assets/icons/ico/notif_maintenance.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidState, FluidType, UsageEventType } from 'enums' +import { FluidState, FluidType } from 'enums' import React, { useCallback, useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' -import UsageEventService from 'services/usageEvent.service' import { useAppSelector } from 'store/hooks' import { getNavPicto } from 'utils/picto' import { getFluidName, isKonnectorActive } from 'utils/utils' @@ -19,7 +17,6 @@ interface FluidButtonProps { const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => { const { t } = useI18n() - const client = useClient() const navigate = useNavigate() const { fluidStatus } = useAppSelector(state => state.ecolyo.global) const [showError, setShowError] = useState<boolean>(false) @@ -45,16 +42,12 @@ const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => { const iconType = getNavPicto(fluidType, isActive, isConnected()) const goToFluid = useCallback(async () => { - await UsageEventService.addEvent(client, { - type: UsageEventType.NAVIGATION_EVENT, - target: getFluidName(fluidType), - }) navigate( fluidType === FluidType.MULTIFLUID ? '/consumption' : `/consumption/${getFluidName(fluidType)}` ) - }, [navigate, fluidType, client]) + }, [navigate, fluidType]) const isFluidMaintenance = () => fluidStatus[fluidType]?.maintenance diff --git a/src/components/Consumption/FluidButtons/fluidButtons.scss b/src/components/Consumption/FluidButtons/fluidButtons.scss index fa69ea60a74c195fe770053c1cc2a84d3e6e3213..7d120d2ee0249a4169662704f3691d5acf693d15 100644 --- a/src/components/Consumption/FluidButtons/fluidButtons.scss +++ b/src/components/Consumption/FluidButtons/fluidButtons.scss @@ -1,5 +1,4 @@ @import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; .fluid-buttons { background: $dark-light-2; @@ -10,11 +9,9 @@ align-items: center; justify-content: space-evenly; box-sizing: border-box; - width: 45.75rem; margin: auto; - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; } .fluid-button { min-width: 80px; diff --git a/src/components/Consumption/consumptionView.scss b/src/components/Consumption/consumptionView.scss index 174d986a8c3b601c82e2a35243727d1f0843b622..ce636ccffbc6ca9efe5bd83c55e3a7eba6f8b436 100644 --- a/src/components/Consumption/consumptionView.scss +++ b/src/components/Consumption/consumptionView.scss @@ -18,11 +18,11 @@ .konnector-section { background-color: $default-background; margin: 0 auto; - width: 45.75rem; box-sizing: border-box; padding-bottom: 1rem; + max-width: 45.75rem; + width: 100%; @media #{$large-phone} { - width: 100%; padding-left: 1rem; padding-right: 1rem; } diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx index f492d59e1824998ce1162220e7946128b106057d..b3c3b46eaefb8309acf47d6d73350e92f672bf24 100644 --- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx +++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx @@ -1,12 +1,10 @@ import { render, screen } from '@testing-library/react' -import { userEvent } from '@testing-library/user-event' import { DataloadState, FluidType } from 'enums' import { DateTime } from 'luxon' import { Dataload } from 'models' import React from 'react' import { Provider } from 'react-redux' import { BrowserRouter } from 'react-router-dom' -import UsageEventService from 'services/usageEvent.service' import { baseDataLoad, baseMultiFluidDataLoad, @@ -179,14 +177,14 @@ describe('Dataload consumption visualizer component', () => { .item(0) expect(element).toBeInTheDocument() }) - it('should render multifluid with no compare and navigate to singleFluid page', async () => { + it('should render multifluid with euro conversions', async () => { jest.mock('services/converter.service', () => { return jest.fn(() => ({ LoadToEuro: jest.fn(), })) }) - render( + const { container } = render( <Provider store={store}> <BrowserRouter> <DataloadConsumptionVisualizer @@ -198,12 +196,10 @@ describe('Dataload consumption visualizer component', () => { </BrowserRouter> </Provider> ) - jest.mock('services/usageEvent.service') - const mockAddEvent = jest.fn() - UsageEventService.addEvent = mockAddEvent - const links = screen.getAllByRole('link') - await userEvent.click(links[0]) - expect(mockAddEvent).toHaveBeenCalled() + const element = container + .getElementsByClassName('dataloadvisualizer-euro') + .item(0) + expect(element).toBeInTheDocument() }) }) diff --git a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx index 91ad2308e6373f01ab92e4b54bf6bec977856b1b..b16a11c999c779d482b909339e28b9ca433f5b92 100644 --- a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx +++ b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx @@ -1,18 +1,11 @@ import classNames from 'classnames' -import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' -import { - DataloadSectionType, - DataloadState, - FluidType, - UsageEventType, -} from 'enums' +import { DataloadSectionType, DataloadState, FluidType } from 'enums' import { Dataload } from 'models' -import React, { useCallback } from 'react' +import React from 'react' import { NavLink } from 'react-router-dom' import ConverterService from 'services/converter.service' -import UsageEventService from 'services/usageEvent.service' import { getNavPicto } from 'utils/picto' import { formatNumberValues, getFluidName } from 'utils/utils' @@ -27,23 +20,12 @@ const DataloadSectionDetail = ({ fluidType, dataloadSectionType, }: DataloadSectionDetailProps) => { - const client = useClient() const { t } = useI18n() const converterService = new ConverterService() const isMulti = fluidType === FluidType.MULTIFLUID const isCompare = dataloadSectionType === DataloadSectionType.NO_COMPARE - const emitNavEvent = useCallback( - async (targetPage: string) => { - await UsageEventService.addEvent(client, { - type: UsageEventType.NAVIGATION_EVENT, - target: targetPage, - }) - }, - [client] - ) - if (!isMulti) { return ( <div @@ -84,7 +66,6 @@ const DataloadSectionDetail = ({ key={FluidType[index]} to={`/consumption/${FluidType[index].toLowerCase()}`} className="dataloadvisualizer-euro-link" - onClick={() => emitNavEvent(FluidType[index].toLowerCase())} > <div className={classNames('dataloadvisualizer-euro-fluid', { diff --git a/src/components/CustomPopup/CustomPopupModal.spec.tsx b/src/components/CustomPopup/CustomPopupModal.spec.tsx index 1503e148ed3cff773276022130c3d56ba88b0ef7..357565d456e0d360ec9ad0730cafe63ed2b17ed4 100644 --- a/src/components/CustomPopup/CustomPopupModal.spec.tsx +++ b/src/components/CustomPopup/CustomPopupModal.spec.tsx @@ -1,4 +1,4 @@ -import { render, screen } from '@testing-library/react' +import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import React from 'react' import { @@ -21,8 +21,8 @@ describe('CustomPopupModal component', () => { expect(baseElement).toMatchSnapshot() }) - it('should render correct title and description', () => { - render( + it('should render correct title, description and icon', async () => { + const { container } = render( <CustomPopupModal customPopup={mockCustomPopup} handleCloseClick={mockHandleClose} @@ -32,6 +32,8 @@ describe('CustomPopupModal component', () => { expect(screen.getByTestId('description')).toHaveTextContent( mockCustomPopup.description ) + await waitFor(() => null, { container }) + expect(screen.getByRole('img')).toBeInTheDocument() }) it('should not be rendered, popup not enabled', () => { diff --git a/src/components/CustomPopup/CustomPopupModal.tsx b/src/components/CustomPopup/CustomPopupModal.tsx index 17f70a4af88a2a22ae82fd40f5c75fb6a0665b74..189e1d290e39dc2775682d56692158f51c020caf 100644 --- a/src/components/CustomPopup/CustomPopupModal.tsx +++ b/src/components/CustomPopup/CustomPopupModal.tsx @@ -2,13 +2,14 @@ import Button from '@material-ui/core/Button' import Dialog from '@material-ui/core/Dialog' import IconButton from '@material-ui/core/IconButton' import CloseIcon from 'assets/icons/ico/close.svg' -import Speaker from 'assets/icons/ico/speaker.svg' +import DefaultIcon from 'assets/icons/visu/ecogesture/bullhorn.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Icon from 'cozy-ui/transpiled/react/Icon' import { DateTime } from 'luxon' import { CustomPopup } from 'models' -import React from 'react' +import React, { useEffect, useState } from 'react' +import { importIconById } from 'utils/utils' import './customPopupModal.scss' interface CustomPopupModalProps { @@ -23,6 +24,15 @@ const CustomPopupModal = ({ const { t } = useI18n() const isPopupOutdated = () => DateTime.local() >= DateTime.fromISO(customPopup.endDate) + const [icon, setIcon] = useState('') + + useEffect(() => { + async function handleIcon() { + const boIcon = await importIconById(customPopup.image, 'ecogesture') + setIcon(boIcon ?? DefaultIcon) + } + handleIcon() + }, [customPopup.image]) return ( <Dialog @@ -46,7 +56,7 @@ const CustomPopupModal = ({ <Icon icon={CloseIcon} size={16} /> </IconButton> <div className="customPopupModal"> - <StyledIcon icon={Speaker} size={100} /> + <StyledIcon icon={icon} size={100} role="img" ariaHidden={false} /> <div className="customPopup-title text-20-bold" data-testid="title"> {customPopup.title} diff --git a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap index 95b7473c4ce76b511f56cff07aa80cf143a5476b..e145623144afc9a9613a33fdbb3d64e1874246a6 100644 --- a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap +++ b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap @@ -64,13 +64,14 @@ exports[`CustomPopupModal component should render correctly 1`] = ` class="customPopupModal" > <svg - aria-hidden="true" + aria-hidden="false" class="styles__icon___23x3R" height="100" + role="img" width="100" > <use - xlink:href="#test-file-stub" + xlink:href="#" /> </svg> <div diff --git a/src/components/Duel/DuelOngoing/DuelOngoing.tsx b/src/components/Duel/DuelOngoing/DuelOngoing.tsx index 574bf643e97845bca6bfa021d8b5e2932a33c816..d0ea2a2b03882d64ee2de72e8a864fcd7824626d 100644 --- a/src/components/Duel/DuelOngoing/DuelOngoing.tsx +++ b/src/components/Duel/DuelOngoing/DuelOngoing.tsx @@ -6,7 +6,6 @@ import { useChartResize } from 'components/Hooks/useChartResize' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { - UsageEventType, UserChallengeSuccess, UserChallengeUpdateFlag, UserDuelState, @@ -15,7 +14,6 @@ import { Dataload, UserChallenge } from 'models' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { useNavigate } from 'react-router-dom' import ChallengeService from 'services/challenge.service' -import UsageEventService from 'services/usageEvent.service' import { unlockNextUserChallenge, updateUserChallengeList, @@ -67,17 +65,6 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => { ? UserChallengeUpdateFlag.DUEL_WIN : UserChallengeUpdateFlag.DUEL_LOSS ) - await UsageEventService.addEvent(client, { - type: UsageEventType.DUEL_END_EVENT, - target: userChallenge.duel.id, - result: winChallenge ? 'win' : 'loss', - startDate: userChallenge.startDate, - }) - await UsageEventService.addEvent(client, { - type: UsageEventType.CHALLENGE_END_EVENT, - target: userChallenge.id, - startDate: userChallenge.startDate, - }) dispatch(updateUserChallengeList(updatedChallenge)) dispatch(unlockNextUserChallenge(updatedChallenge)) dispatch(toggleChallengeDuelNotification(false)) diff --git a/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx b/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx index d1835e74fdd1ee74d2612e44db56a6e8bfa932e7..2020acbf2463e81a138d16451c5542e727c618d3 100644 --- a/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx +++ b/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx @@ -17,8 +17,6 @@ jest.mock('services/challenge.service', () => { })) }) -jest.mock('services/usageEvent.service') - describe('DuelUnlocked component', () => { const store = createMockEcolyoStore() diff --git a/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx b/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx index 27b865cea43441de5a0f32ebacdcb06433df7645..eb4ddcd86952d5ccb0eb188ceb51b8ec497ab27a 100644 --- a/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx +++ b/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx @@ -4,11 +4,10 @@ import defaultIcon from 'assets/icons/visu/duel/default.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { UsageEventType, UserChallengeUpdateFlag } from 'enums' +import { UserChallengeUpdateFlag } from 'enums' import { UserChallenge } from 'models' import React, { useCallback, useEffect, useState } from 'react' import ChallengeService from 'services/challenge.service' -import UsageEventService from 'services/usageEvent.service' import { setChallengeConsumption } from 'store/challenge/challenge.slice' import { useAppDispatch } from 'store/hooks' import { formatNumberValues, importIconById } from 'utils/utils' @@ -36,11 +35,6 @@ const DuelUnlocked = ({ userChallenge }: { userChallenge: UserChallenge }) => { ) const dataloads = await challengeService.getUserChallengeDataload(updatedChallenge) - await UsageEventService.addEvent(client, { - type: UsageEventType.DUEL_LAUNCH_EVENT, - target: userChallenge.duel.id, - context: userChallenge.id, - }) dispatch( setChallengeConsumption({ userChallenge: updatedChallenge, diff --git a/src/components/Ecogesture/EcogestureList/EcogestureList.tsx b/src/components/Ecogesture/EcogestureList/EcogestureList.tsx index e10a47045e4087edd48b148c669e7ebfb55f9f13..35377c4fcb7bca2ef861c29dc220be1ff38a0c65 100644 --- a/src/components/Ecogesture/EcogestureList/EcogestureList.tsx +++ b/src/components/Ecogesture/EcogestureList/EcogestureList.tsx @@ -78,7 +78,7 @@ const EcogestureList = ({ aria-haspopup="true" aria-label={t(`ecogesture.MENU_TITLE`)} onClick={toggleMenu} - size="small" + size="medium" > <StyledIcon icon={SortIcon} size={20} /> <span className={openDropDown ? 'opened' : ''}> diff --git a/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap b/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap index 536577972c3d8ff109992cace617895fd5fd1a6b..73e301dfd68e276c7580c291e7a93f8ed16ec738 100644 --- a/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap +++ b/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap @@ -12,7 +12,7 @@ exports[`EcogesturesList component should be rendered correctly 1`] = ` aria-controls="simple-menu" aria-haspopup="true" aria-label="ecogesture.MENU_TITLE" - class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary btnFilter MuiButton-textSizeSmall MuiButton-sizeSmall" + class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary btnFilter" tabindex="0" type="button" > diff --git a/src/components/Ecogesture/EcogestureList/ecogestureList.scss b/src/components/Ecogesture/EcogestureList/ecogestureList.scss index fc2b9f6fcc2ba03e8b74b182e9fee25a9f8ca175..0380ee61055442ed5baa898e1b1dad1e1bb217a8 100644 --- a/src/components/Ecogesture/EcogestureList/ecogestureList.scss +++ b/src/components/Ecogesture/EcogestureList/ecogestureList.scss @@ -25,7 +25,7 @@ text-align: center; } .btnFilter { - max-width: 12rem; + max-width: 13rem; justify-content: flex-start; span { padding-left: 0.5rem; diff --git a/src/components/Ecogesture/EcogestureTabsView.spec.tsx b/src/components/Ecogesture/EcogestureTabsView.spec.tsx index 4d68fe4730ab8f3043b23408ae75f214b1a41623..d9806f63d0fd7d4fb203a9ec11a604a4eaaa5704 100644 --- a/src/components/Ecogesture/EcogestureTabsView.spec.tsx +++ b/src/components/Ecogesture/EcogestureTabsView.spec.tsx @@ -7,12 +7,11 @@ import * as profileActions from 'store/profile/profile.slice' import { mockedEcogesturesData } from 'tests/__mocks__/ecogesturesData.mock' import { createMockEcolyoStore } from 'tests/__mocks__/store' -const mockGetAllEcogestures = jest.fn() +const mockInitEcogesture = jest.fn().mockResolvedValue(mockedEcogesturesData) jest.mock('services/ecogesture.service', () => { return jest.fn(() => ({ - getAllEcogestures: mockGetAllEcogestures, getEcogestureListByProfile: jest.fn().mockResolvedValue([]), - initEcogesture: jest.fn().mockResolvedValue(mockedEcogesturesData), + initEcogesture: mockInitEcogesture, })) }) jest.mock('services/profile.service', () => { @@ -41,6 +40,10 @@ jest.mock('react-router-dom', () => ({ describe('EcogestureView component', () => { const store = createMockEcolyoStore() + beforeEach(() => { + jest.clearAllMocks() + }) + it('should be rendered correctly', async () => { const { container } = render( <Provider store={store}> @@ -69,6 +72,7 @@ describe('EcogestureView component', () => { }) it('should render empty list', async () => { + mockInitEcogesture.mockResolvedValueOnce([]) const { container } = render( <Provider store={store}> <EcogestureTabsView /> @@ -88,7 +92,6 @@ describe('EcogestureView component', () => { ) await waitFor(() => null, { container }) await userEvent.click(screen.getAllByRole('button')[1]) - mockGetAllEcogestures.mockResolvedValueOnce([]) await waitFor(() => null, { container }) expect( container.getElementsByClassName('ec-empty-container').length diff --git a/src/components/Ecogesture/EcogestureTabsView.tsx b/src/components/Ecogesture/EcogestureTabsView.tsx index 39e1598c90cff947cb7b77383ba231d64c59d1d9..a0491c0974d72c455e4ef61e9ec607394e6a465a 100644 --- a/src/components/Ecogesture/EcogestureTabsView.tsx +++ b/src/components/Ecogesture/EcogestureTabsView.tsx @@ -40,6 +40,7 @@ const TabPanel = ({ children, tab, value }: TabPanelProps) => { const EcogestureTabsView = () => { const { t } = useI18n() const client = useClient() + const navigate = useNavigate() const tab = new URLSearchParams(useLocation().search).get('tab') const dispatch = useAppDispatch() const { profile, profileEcogesture, profileType } = useAppSelector( @@ -50,7 +51,6 @@ const EcogestureTabsView = () => { const [tabValue, setTabValue] = useState<EcogestureTab>( tab ? parseInt(tab) : EcogestureTab.OBJECTIVE ) - const navigate = useNavigate() const [isLoading, setIsLoading] = useState<boolean>(true) const [allEcogestureList, setAllEcogestureList] = useState<Ecogesture[]>([]) const [doingEcogestureList, setDoingEcogestureList] = useState<Ecogesture[]>( diff --git a/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap index e8cc3b0ab9978a7ae15890857254b607675de568..e8ada2259dc01776e81f24afd7453e4054a9b768 100644 --- a/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap +++ b/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap @@ -138,9 +138,6 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` > ecogesture.emptyList.btn1 </span> - <span - class="MuiTouchRipple-root" - /> </button> <button aria-label="ecogesture.emptyList.btn2" @@ -153,9 +150,6 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` > ecogesture.emptyList.btn2 </span> - <span - class="MuiTouchRipple-root" - /> </button> </div> </div> @@ -207,9 +201,6 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` > ecogesture.emptyList.btn1 </span> - <span - class="MuiTouchRipple-root" - /> </button> <button aria-label="ecogesture.emptyList.btn2" @@ -222,9 +213,6 @@ exports[`EcogestureView component should be rendered correctly 1`] = ` > ecogesture.emptyList.btn2 </span> - <span - class="MuiTouchRipple-root" - /> </button> </div> </div> diff --git a/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap index ef9a7d029c57ed922153d936c662b93acdba7e00..d5009811f16c175b7b06d0b1940e281c59c30564 100644 --- a/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap +++ b/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap @@ -69,9 +69,6 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` > ecogesture_modal.show_more </span> - <span - class="MuiTouchRipple-root" - /> </button> <div class="MuiCollapse-root MuiCollapse-hidden" @@ -117,9 +114,6 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` ecogesture.objective </span> </span> - <span - class="MuiTouchRipple-root" - /> </button> <button aria-label="ecogesture.doing" @@ -143,9 +137,6 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = ` ecogesture.doing </span> </span> - <span - class="MuiTouchRipple-root" - /> </button> </div> </div> diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx index ca613d4b9f108a515628586dba9488af2d2dc903..59dfa2b6d36071b61298edabf1f48741dec0b365 100644 --- a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx +++ b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx @@ -17,7 +17,6 @@ describe('EcogestureFormEquipment component', () => { currentProfileEcogesture={mockProfileEcogesture} setPreviousStep={jest.fn()} setNextStepEcogestureForm={jest.fn()} - step={0} /> </Provider> ) @@ -31,7 +30,6 @@ describe('EcogestureFormEquipment component', () => { currentProfileEcogesture={mockProfileEcogesture} setPreviousStep={jest.fn()} setNextStepEcogestureForm={jest.fn()} - step={0} /> </Provider> ) @@ -50,7 +48,6 @@ describe('EcogestureFormEquipment component', () => { currentProfileEcogesture={mockProfileEcogesture} setPreviousStep={jest.fn()} setNextStepEcogestureForm={jest.fn()} - step={0} /> </Provider> ) @@ -60,7 +57,7 @@ describe('EcogestureFormEquipment component', () => { ).toBeTruthy() expect( screen.getByRole('button', { - name: 'profile_type.accessibility.button_next', + name: 'profile_type.accessibility.button_end', }) ).toBeDisabled() }) diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx index eca4b0a774d14d728af91863186e0ee07704edab..4852439abc3a8be68c3a3f3a5ac3afb51c3a4008 100644 --- a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx +++ b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx @@ -2,7 +2,7 @@ import { IconButton } from '@material-ui/core' import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { EcogestureStepForm, EquipmentType, ProfileTypeStepForm } from 'enums' +import { EcogestureStepForm, EquipmentType } from 'enums' import { ProfileEcogesture, ProfileType } from 'models' import React, { useCallback, useState } from 'react' import { useAppSelector } from 'store/hooks' @@ -15,7 +15,6 @@ interface EcogestureFormEquipmentProps { setPreviousStep: () => void setNextStepEcogestureForm?: (_profileEcogesture: ProfileEcogesture) => void setNextStepProfileForm?: (_profileType: ProfileType) => void - step: ProfileTypeStepForm | EcogestureStepForm } const EcogestureFormEquipment = ({ @@ -24,7 +23,6 @@ const EcogestureFormEquipment = ({ setPreviousStep, setNextStepEcogestureForm, setNextStepProfileForm, - step, }: EcogestureFormEquipmentProps) => { const { t } = useI18n() const { isProfileEcogestureCompleted } = useAppSelector( @@ -111,11 +109,10 @@ const EcogestureFormEquipment = ({ </div> </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} disableNextButton={answer.length == 0} - isEcogesture={true} + isLastStep={true} /> </> ) diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap b/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap index ed0bc90c23394c74c1afea2438180aa81028d0e0..61893059fa3c958e17c6ae4e4dc4d66c90fd1952 100644 --- a/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap +++ b/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap @@ -314,9 +314,8 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = ` > <button aria-label="profile_type.accessibility.button_previous" - class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary Mui-disabled Mui-disabled" - disabled="" - tabindex="-1" + class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary" + tabindex="0" type="button" > <span @@ -324,9 +323,12 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = ` > profile_type.form.button_previous </span> + <span + class="MuiTouchRipple-root" + /> </button> <button - aria-label="profile_type.accessibility.button_next" + aria-label="profile_type.accessibility.button_end" class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary Mui-disabled Mui-disabled" disabled="" tabindex="-1" @@ -335,7 +337,7 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = ` <span class="MuiButton-label" > - profile_type.form.button_next + profile_type.form.button_end </span> </button> </div> diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/ecogestureFormEquipment.scss b/src/components/EcogestureForm/EcogestureFormEquipment/ecogestureFormEquipment.scss index be756fd5072c36683d560841f2512b7a17165b51..84dec8e3d431b9ba48eb88b7367ecb90ff7752b8 100644 --- a/src/components/EcogestureForm/EcogestureFormEquipment/ecogestureFormEquipment.scss +++ b/src/components/EcogestureForm/EcogestureFormEquipment/ecogestureFormEquipment.scss @@ -18,8 +18,7 @@ .icons-container { display: grid; grid-template-columns: repeat(3, 1fr); - grid-template-rows: repeat(5, 1fr); - gap: 1rem; + align-items: flex-start; max-width: 400px; margin: 1.5rem auto 3rem auto; .checkbox-equipment { @@ -28,6 +27,7 @@ display: flex; flex-direction: column; gap: 0.5rem; + color: $grey-bright; } } .equipment-icon-container { diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx index 57f1f6692161543435b8f01a802a5782a56e6b60..b7e89d07dbfa9cbc95c18262d2831f73c54d511e 100644 --- a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx +++ b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx @@ -34,22 +34,6 @@ describe('EcogestureFormSingleChoice component', () => { ) expect(container).toMatchSnapshot() }) - it('should render disabled prev button', async () => { - render( - <Provider store={store}> - <EcogestureFormSingleChoice - step={0} - viewedStep={1} - setNextStep={mockHandleNextStep} - setPreviousStep={mockHandlePreviousStep} - currentProfileEcogesture={mockProfileEcogesture} - answerType={mockEcogestureAnswer} - /> - </Provider> - ) - const [prev] = screen.getAllByRole('button') - expect(prev).toBeDisabled() - }) it('should pick a choice and go next', async () => { render( diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx index e7efcf827da8c60189afcc7377ab04eccc9af595..21401195fa52659828157655c6669b9c9e41c349 100644 --- a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx +++ b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx @@ -83,11 +83,10 @@ const EcogestureFormSingleChoice = ({ })} </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} + disablePrevButton={step === EcogestureStepForm.HEATING_TYPE} disableNextButton={answer === null} - isEcogesture={true} /> </div> ) diff --git a/src/components/EcogestureForm/EcogestureFormView.spec.tsx b/src/components/EcogestureForm/EcogestureFormView.spec.tsx index a654c4bfe1631bcb422e5ca18244d7468cb89603..501a60176665575e4f897dc6c382aaefa39b5f99 100644 --- a/src/components/EcogestureForm/EcogestureFormView.spec.tsx +++ b/src/components/EcogestureForm/EcogestureFormView.spec.tsx @@ -105,4 +105,14 @@ describe('EcogestureFormView component', () => { ) expect(mockAppDispatch).toHaveBeenCalledTimes(2) }) + + it('should not be able to click previous on the first step', () => { + render( + <Provider store={store}> + <EcogestureFormView /> + </Provider> + ) + const [prev] = screen.getAllByRole('button') + expect(prev).toBeDisabled() + }) }) diff --git a/src/components/EcogestureForm/EcogestureFormView.tsx b/src/components/EcogestureForm/EcogestureFormView.tsx index b7aabd755eb5aba0310c41969783c5bc97b6f730..dc4e57379310b77bddf7fa3b1bf3f3f6011e298a 100644 --- a/src/components/EcogestureForm/EcogestureFormView.tsx +++ b/src/components/EcogestureForm/EcogestureFormView.tsx @@ -105,7 +105,6 @@ const EcogestureFormView = () => { <> {step === EcogestureStepForm.EQUIPMENTS && ( <EcogestureFormEquipment - step={EcogestureStepForm.EQUIPMENTS} currentProfileEcogesture={currentProfileEcogesture} setNextStepEcogestureForm={setNextStep} setPreviousStep={setPreviousStep} diff --git a/src/components/Exploration/ExplorationFinished.tsx b/src/components/Exploration/ExplorationFinished.tsx index eb883e7f945416fd0d4f2feeee85bc7c80933392..3bcce5d7650c1262d28dfa7a5f41277588c4c2e3 100644 --- a/src/components/Exploration/ExplorationFinished.tsx +++ b/src/components/Exploration/ExplorationFinished.tsx @@ -3,16 +3,11 @@ import starResult from 'assets/icons/visu/quiz/starResult.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { - UsageEventType, - UserChallengeUpdateFlag, - UserExplorationState, -} from 'enums' +import { UserChallengeUpdateFlag, UserExplorationState } from 'enums' import { UserChallenge } from 'models' import React, { useCallback } from 'react' import { useNavigate } from 'react-router-dom' import ChallengeService from 'services/challenge.service' -import UsageEventService from 'services/usageEvent.service' import { updateUserChallengeList } from 'store/challenge/challenge.slice' import { toggleChallengeExplorationNotification } from 'store/global/global.slice' import { useAppDispatch } from 'store/hooks' @@ -35,12 +30,6 @@ const ExplorationFinished = ({ userChallenge }: ExplorationFinishedProps) => { userChallenge, UserChallengeUpdateFlag.EXPLORATION_DONE ) - await UsageEventService.addEvent(client, { - type: UsageEventType.EXPLORATION_END_EVENT, - target: userChallenge.exploration.id, - context: userChallenge.id, - startDate: userChallenge.exploration.date, - }) dispatch(toggleChallengeExplorationNotification(false)) dispatch(updateUserChallengeList(updatedChallenge)) } diff --git a/src/components/Exploration/ExplorationOngoing.tsx b/src/components/Exploration/ExplorationOngoing.tsx index 380a389a114df1e89b947313fb8fc2db7b1207c5..850f4aabd717e9c86057be61e586670c49080ad6 100644 --- a/src/components/Exploration/ExplorationOngoing.tsx +++ b/src/components/Exploration/ExplorationOngoing.tsx @@ -5,7 +5,6 @@ import StarsContainer from 'components/CommonKit/StarsContainer/StarsContainer' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { - UsageEventType, UserChallengeUpdateFlag, UserExplorationState, UserExplorationType, @@ -14,7 +13,6 @@ import { UserChallenge } from 'models' import React from 'react' import { useNavigate } from 'react-router-dom' import ChallengeService from 'services/challenge.service' -import UsageEventService from 'services/usageEvent.service' import { updateUserChallengeList } from 'store/challenge/challenge.slice' import { useAppDispatch } from 'store/hooks' import './explorationOngoing.scss' @@ -46,12 +44,6 @@ const ExplorationOngoing = ({ userChallenge }: ExplorationOngoingProps) => { userChallenge, UserChallengeUpdateFlag.EXPLORATION_DONE ) - await UsageEventService.addEvent(client, { - type: UsageEventType.EXPLORATION_END_EVENT, - target: userChallenge.exploration.id, - context: userChallenge.id, - startDate: userChallenge.exploration.date, - }) dispatch(updateUserChallengeList(updatedChallenge)) navigate('/challenges') } diff --git a/src/components/FluidChart/FluidChart.tsx b/src/components/FluidChart/FluidChart.tsx index 908daec4451c91d102c11f5c2f0e3ac6a9f0aa9f..943c8f1558f6e5496527d093f50d92cabb68fb45 100644 --- a/src/components/FluidChart/FluidChart.tsx +++ b/src/components/FluidChart/FluidChart.tsx @@ -5,12 +5,12 @@ import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch' import useExploration from 'components/Hooks/useExploration' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidType, TimeStep, UsageEventType, UserExplorationID } from 'enums' +import { FluidType, TimeStep, UserExplorationID } from 'enums' +import { DateTime } from 'luxon' import React, { useCallback, useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import ConsumptionService from 'services/consumption.service' import DateChartService from 'services/dateChart.service' -import UsageEventService from 'services/usageEvent.service' import { setCurrentIndex, setSelectedDate, @@ -21,7 +21,8 @@ import { useAppDispatch, useAppSelector } from 'store/hooks' import { openConnectionModal } from 'store/modal/modal.slice' import { getFluidName, getKonnectorSlug, isKonnectorActive } from 'utils/utils' import FluidChartSwipe from './FluidChartSwipe' -import HalfHourNoData from './HalfHourNoData/HalfHourNoData' +import HalfHourNoDataFailure from './HalfHourNoDataFailure/HalfHourNoDataFailure' +import HalfHourUpcoming from './HalfHourUpcoming/HalfHourUpcoming' import TimeStepSelector from './TimeStepSelector/TimeStepSelector' import './fluidChart.scss' @@ -50,13 +51,6 @@ const FluidChart = ({ fluidType, setActive }: FluidChartProps) => { const lowercaseFluidType = getFluidName(fluidType) const handleChangeSwitch = async () => { - if (!showCompare) { - await UsageEventService.addEvent(client, { - type: UsageEventType.CONSUMPTION_COMPARE_EVENT, - target: TimeStep[currentTimeStep].toLowerCase(), - context: lowercaseFluidType, - }) - } dispatch(setShowCompare(!showCompare)) } @@ -89,7 +83,7 @@ const FluidChart = ({ fluidType, setActive }: FluidChartProps) => { } }, [containsHalfHourData, currentTimeStep, setValidExploration]) - const DisplayLegend = useCallback( + const compareLegend = useCallback( () => ( <div className="compareLegend"> <div> @@ -155,23 +149,38 @@ const FluidChart = ({ fluidType, setActive }: FluidChartProps) => { </div> ) + const isKonnectorUpdatedWithinLastThreeDays = + DateTime.fromISO( + currentFluidStatus?.connection?.trigger?.cozyMetadata?.createdAt || '' + ) >= DateTime.local().minus({ days: 3 }) + + /** Display no half hour components or FluidChart otherwise */ + const chartContent = () => { + if (currentTimeStep === TimeStep.HALF_AN_HOUR && !containsHalfHourData) { + return isKonnectorUpdatedWithinLastThreeDays ? ( + <HalfHourUpcoming /> + ) : ( + <HalfHourNoDataFailure /> + ) + } + return ( + <> + <div className="fluidchart-content"> + <FluidChartSwipe fluidType={fluidType} setActive={setActive} /> + </div> + {showCompare && currentTimeStep !== TimeStep.YEAR && ( + <Slide direction="right" in={showCompare}> + {compareLegend()} + </Slide> + )} + </> + ) + } + return ( <div className="fluidchart-root"> {!isFluidConnected && LastDataValid} - {currentTimeStep === TimeStep.HALF_AN_HOUR && !containsHalfHourData ? ( - <HalfHourNoData /> - ) : ( - <> - <div className="fluidchart-content"> - <FluidChartSwipe fluidType={fluidType} setActive={setActive} /> - </div> - {showCompare && currentTimeStep !== TimeStep.YEAR && ( - <Slide direction="right" in={showCompare}> - {DisplayLegend()} - </Slide> - )} - </> - )} + {chartContent()} <TimeStepSelector fluidType={fluidType} /> {currentTimeStep !== TimeStep.YEAR && ( <div className="fluidchart-footer"> diff --git a/src/components/FluidChart/HalfHourNoData/HalfHourNoData.spec.tsx b/src/components/FluidChart/HalfHourNoData/HalfHourNoData.spec.tsx deleted file mode 100644 index 1537a11b753767682c686bbb366a335502d47520..0000000000000000000000000000000000000000 --- a/src/components/FluidChart/HalfHourNoData/HalfHourNoData.spec.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { render } from '@testing-library/react' -import React from 'react' -import HalfHourNoData from './HalfHourNoData' - -describe('HalfHourNoData component', () => { - it('should render correctly HalfHourNoData', () => { - const { container } = render(<HalfHourNoData />) - expect(container).toMatchSnapshot() - }) -}) diff --git a/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.spec.tsx b/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..dc46692ede36bd2f7e9f5672915b259417f4f72c --- /dev/null +++ b/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react' +import React from 'react' +import HalfHourNoDataFailure from './HalfHourNoDataFailure' + +describe('HalfHourNoDataFailure component', () => { + it('should render correctly HalfHourNoDataFailure', () => { + const { container } = render(<HalfHourNoDataFailure />) + expect(container).toMatchSnapshot() + }) +}) diff --git a/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx b/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx new file mode 100644 index 0000000000000000000000000000000000000000..116c1929971e8942dd38f039343bd255218df7fd --- /dev/null +++ b/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx @@ -0,0 +1,20 @@ +import failureIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import React from 'react' +import '../HalfHourUpcoming/HalfHourUpcoming.scss' + +const HalfHourNoDataFailure = () => { + const { t } = useI18n() + + return ( + <div className="halfHour"> + <Icon className="imgResult" icon={failureIcon} size={180} /> + <h2 className="text-20-bold halfHourFailure"> + {t('timestep.half_an_hour.gather_data_failure')} + </h2> + </div> + ) +} + +export default HalfHourNoDataFailure diff --git a/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap b/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..aeeb024a2da8612aa4ee029c46c778c387c4e867 --- /dev/null +++ b/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap @@ -0,0 +1,24 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`HalfHourNoDataFailure component should render correctly HalfHourNoDataFailure 1`] = ` +<div> + <div + class="halfHour" + > + <svg + class="imgResult styles__icon___23x3R" + height="180" + width="180" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + <h2 + class="text-20-bold halfHourFailure" + > + timestep.half_an_hour.gather_data_failure + </h2> + </div> +</div> +`; diff --git a/src/components/FluidChart/HalfHourNoData/halfHourNoData.scss b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.scss similarity index 84% rename from src/components/FluidChart/HalfHourNoData/halfHourNoData.scss rename to src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.scss index 2691c324d3d3ee41a7d1075eb27ee0a7bbe8f57a..bb465b93241b3578b2bdb02fc6410b6adbf32092 100644 --- a/src/components/FluidChart/HalfHourNoData/halfHourNoData.scss +++ b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.scss @@ -17,6 +17,10 @@ h2 { color: $elec-color; margin-bottom: 3rem; + &.halfHourFailure { + color: $white; + margin-bottom: 0; + } } p { diff --git a/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.spec.tsx b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d1d43df102ca2571c0c2b6ca5dfd2b6dbc1e3262 --- /dev/null +++ b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react' +import React from 'react' +import HalfHourUpcoming from './HalfHourUpcoming' + +describe('HalfHourUpcoming component', () => { + it('should render correctly HalfHourUpcoming', () => { + const { container } = render(<HalfHourUpcoming />) + expect(container).toMatchSnapshot() + }) +}) diff --git a/src/components/FluidChart/HalfHourNoData/HalfHourNoData.tsx b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx similarity index 75% rename from src/components/FluidChart/HalfHourNoData/HalfHourNoData.tsx rename to src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx index 9b88e93c8be5701cc0f803d608d9f5d0fe006258..e0e8b853ee5a34c3c3ec134670daddba92c05b10 100644 --- a/src/components/FluidChart/HalfHourNoData/HalfHourNoData.tsx +++ b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx @@ -1,8 +1,8 @@ import { useI18n } from 'cozy-ui/transpiled/react/I18n' import React from 'react' -import './halfHourNoData.scss' +import './HalfHourUpcoming.scss' -const HalfHourNoData = () => { +const HalfHourUpcoming = () => { const { t } = useI18n() return ( <div className="halfHour"> @@ -12,4 +12,4 @@ const HalfHourNoData = () => { ) } -export default HalfHourNoData +export default HalfHourUpcoming diff --git a/src/components/FluidChart/HalfHourNoData/__snapshots__/HalfHourNoData.spec.tsx.snap b/src/components/FluidChart/HalfHourUpcoming/__snapshots__/HalfHourUpcoming.spec.tsx.snap similarity index 73% rename from src/components/FluidChart/HalfHourNoData/__snapshots__/HalfHourNoData.spec.tsx.snap rename to src/components/FluidChart/HalfHourUpcoming/__snapshots__/HalfHourUpcoming.spec.tsx.snap index af114a46a58eb8a87647400a2fbfe1ee201f4751..8e2f91004314c5d361da49061726b846b1bcbc7d 100644 --- a/src/components/FluidChart/HalfHourNoData/__snapshots__/HalfHourNoData.spec.tsx.snap +++ b/src/components/FluidChart/HalfHourUpcoming/__snapshots__/HalfHourUpcoming.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`HalfHourNoData component should render correctly HalfHourNoData 1`] = ` +exports[`HalfHourUpcoming component should render correctly HalfHourUpcoming 1`] = ` <div> <div class="halfHour" diff --git a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx index 896eee1c8698f2898e3314f4b9ba822b9216035f..60ddf0fedc7ea42905fcea16dbdd6798484559ad 100644 --- a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx +++ b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx @@ -5,14 +5,9 @@ import { FluidType, TimeStep } from 'enums' import { DateTime } from 'luxon' import React from 'react' import { Provider } from 'react-redux' -import UsageEventService from 'services/usageEvent.service' import * as chartActions from 'store/chart/chart.slice' import { createMockEcolyoStore } from 'tests/__mocks__/store' -jest.mock('services/usageEvent.service') -const mockAddEvent = jest.fn() -UsageEventService.addEvent = mockAddEvent - const setCurrentTimeStepSpy = jest.spyOn(chartActions, 'setCurrentTimeStep') const setCurrentIndexSpy = jest.spyOn(chartActions, 'setCurrentIndex') const setSelectedDateSpy = jest.spyOn(chartActions, 'setSelectedDate') diff --git a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx index d5d59d5340e20443334a3691e49a9c30efc6b04c..d05db4af3cd184efe03f575eb577e96ecbe7a532 100644 --- a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx +++ b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx @@ -1,18 +1,15 @@ import { Button } from '@material-ui/core' -import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidType, TimeStep, UsageEventType } from 'enums' +import { FluidType, TimeStep } from 'enums' import { DateTime } from 'luxon' import React from 'react' import DateChartService from 'services/dateChart.service' -import UsageEventService from 'services/usageEvent.service' import { setCurrentIndex, setCurrentTimeStep, setSelectedDate, } from 'store/chart/chart.slice' import { useAppDispatch, useAppSelector } from 'store/hooks' -import { getFluidName } from 'utils/utils' import './timeStepSelector.scss' const TimeStepSelector = ({ fluidType }: { fluidType: FluidType }) => { @@ -22,8 +19,6 @@ const TimeStepSelector = ({ fluidType }: { fluidType: FluidType }) => { state => state.ecolyo.chart ) const dateChartService = new DateChartService() - const client = useClient() - const timeStepMultiArray: TimeStep[] = [ TimeStep.WEEK, TimeStep.DAY, @@ -41,11 +36,6 @@ const TimeStepSelector = ({ fluidType }: { fluidType: FluidType }) => { keepLocalTime: true, }) .startOf('day') - UsageEventService.addEvent(client, { - type: UsageEventType.CONSUMPTION_CHANGE_TIMESTEP_EVENT, - target: TimeStep[TimeStep.WEEK].toLowerCase(), - context: getFluidName(fluidType), - }) dispatch(setCurrentIndex(0)) dispatch(setSelectedDate(today)) dispatch(setCurrentTimeStep(TimeStep.WEEK)) @@ -55,11 +45,6 @@ const TimeStepSelector = ({ fluidType }: { fluidType: FluidType }) => { targetTimestep, selectedDate ) - UsageEventService.addEvent(client, { - type: UsageEventType.CONSUMPTION_CHANGE_TIMESTEP_EVENT, - target: TimeStep[currentTimeStep].toLowerCase(), - context: getFluidName(fluidType), - }) dispatch(setCurrentTimeStep(targetTimestep)) dispatch(setCurrentIndex(index)) } diff --git a/src/components/Hooks/useExploration.spec.tsx b/src/components/Hooks/useExploration.spec.tsx index 4e70b76a814779aaebcdfdcffc5739226cf4d91d..7b3184ff05f90ab1c147809c4d2f4970683bd762 100644 --- a/src/components/Hooks/useExploration.spec.tsx +++ b/src/components/Hooks/useExploration.spec.tsx @@ -1,10 +1,10 @@ -import { act, renderHook } from '@testing-library/react-hooks' -import useExploration from 'components/Hooks/useExploration' +import { act, renderHook } from '@testing-library/react' import { UserExplorationID } from 'enums' import React from 'react' import { Provider } from 'react-redux' import { createMockEcolyoStore } from 'tests/__mocks__/store' import { userChallengeExplo1OnGoing } from 'tests/__mocks__/userChallengeData.mock' +import useExploration from './useExploration' describe('useExploration Hooks', () => { it('should return "EXPLORATION001"', () => { @@ -15,7 +15,10 @@ describe('useExploration Hooks', () => { const wrapper = ({ children }: { children: JSX.Element }) => ( <Provider store={store}>{children}</Provider> ) - const { result } = renderHook(() => useExploration(), { wrapper }) + + const { result } = renderHook(() => useExploration(), { + wrapper, + }) act(() => { result.current[1](UserExplorationID.EXPLORATION001) diff --git a/src/components/Hooks/useKonnectorAuth.tsx b/src/components/Hooks/useKonnectorAuth.tsx index 1750eff2df85a7848c8bfad5ac0dca5bf0be7bd8..ce50e44044a4cc66403a78fd400233bdb32adcd4 100644 --- a/src/components/Hooks/useKonnectorAuth.tsx +++ b/src/components/Hooks/useKonnectorAuth.tsx @@ -1,17 +1,11 @@ import * as Sentry from '@sentry/react' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { FluidSlugType, FluidType, UsageEventType } from 'enums' -import { - AccountAuthData, - AccountSgeData, - FluidConnection, - UsageEvent, -} from 'models' +import { FluidSlugType, FluidType } from 'enums' +import { AccountAuthData, AccountSgeData, FluidConnection } from 'models' import { useState } from 'react' import AccountService from 'services/account.service' import ConnectionService from 'services/connection.service' -import UsageEventService from 'services/usageEvent.service' import { setLoading } from 'store/chart/chart.slice' import { updateFluidConnection } from 'store/global/global.slice' import { useAppDispatch, useAppSelector } from 'store/hooks' @@ -31,29 +25,15 @@ const useKonnectorAuth = ( const currentFluidStatus = fluidStatus[fluidType] const konnectorSlug: FluidSlugType = currentFluidStatus.connection.konnectorConfig.slug - const [connectError, setError] = useState<string>('') - - const sendUsageEventError = async (slug: string): Promise<UsageEvent> => { - return UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: slug, - result: 'error', - }) - } + const [connectError, setConnectError] = useState<string>('') const connect = async () => { const connectionService = new ConnectionService(client) try { - // If first connexion, send the usage event - await UsageEventService.addEvent(client, { - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: konnectorSlug, - result: 'error', - }) const { account: _account, trigger: _trigger } = konnectorSlug === FluidSlugType.WATER ? await connectionService.connectNewUser(konnectorSlug, { - login: login ? login : '', + login: login ?? '', password: password, }) : await connectionService.connectNewUser( @@ -62,8 +42,7 @@ const useKonnectorAuth = ( sgeConnect ) if (!_trigger || !_account) { - setError(t('konnector_form.error_account_creation')) - sendUsageEventError(konnectorSlug) + setConnectError(t('konnector_form.error_account_creation')) return null } const updatedConnection: FluidConnection = { @@ -81,7 +60,6 @@ const useKonnectorAuth = ( ) } catch (error) { setLoading(false) - sendUsageEventError(konnectorSlug) logApp.error(error) Sentry.captureException(error) } diff --git a/src/components/Konnector/ConnectionResult/ConnectionResult.tsx b/src/components/Konnector/ConnectionResult/ConnectionResult.tsx index 68df71f6e59980537ba63f42bdaa26726ad1159f..746c5878a3e628c2fc31626c46272bbf1605f4fd 100644 --- a/src/components/Konnector/ConnectionResult/ConnectionResult.tsx +++ b/src/components/Konnector/ConnectionResult/ConnectionResult.tsx @@ -262,7 +262,7 @@ const ConnectionResult = ({ <div className="inline-buttons"> {!consentError && ( <Button - aria-label={t('konnector_form.accessibility.button_delete')} + aria-label={t('konnector_form.accessibility.button_disconnect')} onClick={ fluidType === FluidType.GAS ? toggleGRDFDeletionModal @@ -273,7 +273,7 @@ const ConnectionResult = ({ > {deleting ? t('konnector_form.loading') - : t('konnector_form.button_delete')} + : t('konnector_form.button_disconnect')} </Button> )} <Button diff --git a/src/components/Konnector/KonnectorModalFooter.spec.tsx b/src/components/Konnector/KonnectorModalFooter.spec.tsx index 6812381cb58d828a5f1feba671e84ffa0998a615..60d45605aa18477f48d48b7f5171550cfcb8ea8d 100644 --- a/src/components/Konnector/KonnectorModalFooter.spec.tsx +++ b/src/components/Konnector/KonnectorModalFooter.spec.tsx @@ -86,8 +86,10 @@ describe('KonnectorModalFooter component', () => { /> </Provider> ) - expect(screen.getByText('Plus tard')).toBeInTheDocument() - expect(screen.getByText('Vérifier les infos')).toBeInTheDocument() + expect(screen.getByText('konnector_modal.button_later')).toBeInTheDocument() + expect( + screen.getByText('konnector_modal.button_check_info') + ).toBeInTheDocument() }) it('should close the modal', async () => { diff --git a/src/components/Konnector/KonnectorModalFooter.tsx b/src/components/Konnector/KonnectorModalFooter.tsx index 64fbdb88ee1dcb59740fd8c92071280679adc496..836fb3397949bcd4205e765464ad7d135143402e 100644 --- a/src/components/Konnector/KonnectorModalFooter.tsx +++ b/src/components/Konnector/KonnectorModalFooter.tsx @@ -89,7 +89,7 @@ const KonnectorModalFooter = ({ onClick={() => handleCloseClick(state === SUCCESS_EVENT)} className="btnSecondary" > - <div>Plus tard</div> + <div>{t('konnector_modal.button_later')}</div> </Button> <Button aria-label={t('konnector_modal.accessibility.button_close')} @@ -98,7 +98,11 @@ const KonnectorModalFooter = ({ } className="btnPrimary" > - <div>{!isUpdating ? 'Vérifier les infos' : 'Jy vais'}</div> + <div> + {!isUpdating + ? t('konnector_modal.button_check_info') + : t('konnector_modal.button_go')} + </div> </Button> </div> ) diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index a4e3b2d97bd8bd8c344dcbcbd410577c649e1519..ab157f8f05c9a190057025fdc323782e78679efe 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -30,7 +30,6 @@ import { FluidState, FluidType, KonnectorError, - UsageEventType, UserChallengeState, UserDuelState, } from 'enums' @@ -43,7 +42,6 @@ import { Konnector, PartnersInfo, Trigger, - UsageEvent, } from 'models' import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' @@ -52,7 +50,6 @@ import ChallengeService from 'services/challenge.service' import DateChartService from 'services/dateChart.service' import FluidService from 'services/fluid.service' import PartnersInfoService from 'services/partnersInfo.service' -import UsageEventService from 'services/usageEvent.service' import { setChallengeConsumption } from 'store/challenge/challenge.slice' import { setSelectedDate, setShowOfflineData } from 'store/chart/chart.slice' import { @@ -225,14 +222,6 @@ const KonnectorViewerCard = ({ dispatch(setLastEpglLogin(lastEpglLogin)) } } else { - if (isSuccess && currentFluidStatus.lastDataDate === null) { - // UPDATE THE DACC EVENT STATUS TO SUCCESS - await UsageEventService.updateConnectionAttemptEvent( - client, - fluidSlug - ) - } - // const partnersInfo = await partnersInfoService.getPartnersInfo() const updatedFluidStatus = await fluidService.getFluidStatus(partnersInfo) dispatch(setFluidStatus(updatedFluidStatus)) @@ -260,38 +249,6 @@ const KonnectorViewerCard = ({ ] ) - const sendUsageEventSuccess = useCallback( - async ( - konnectorSlug: string, - isConnexion: boolean - ): Promise<UsageEvent> => { - return UsageEventService.addEvent(client, { - type: isConnexion - ? UsageEventType.KONNECTOR_CONNECT_EVENT - : UsageEventType.KONNECTOR_REFRESH_EVENT, - target: konnectorSlug, - result: 'success', - }) - }, - [client] - ) - - const sendUsageEventError = useCallback( - async ( - konnectorSlug: string, - isConnexion: boolean - ): Promise<UsageEvent> => { - return UsageEventService.addEvent(client, { - type: isConnexion - ? UsageEventType.KONNECTOR_CONNECT_EVENT - : UsageEventType.KONNECTOR_REFRESH_EVENT, - target: konnectorSlug, - result: 'error', - }) - }, - [client] - ) - const toggleModalConnection = useCallback(() => { switch (fluidType) { case FluidType.ELECTRICITY: @@ -502,25 +459,13 @@ const KonnectorViewerCard = ({ const connectionFlow = new ConnectionFlow(client, trigger, konnector) await connectionFlow.launch() connectionFlow.jobWatcher.on(ERROR_EVENT, () => { - sendUsageEventError( - fluidSlug, - currentFluidStatus.lastDataDate === null - ) setKonnectorErrorDescription(connectionFlow.jobWatcher.on()._error) callbackResponse(ERROR_EVENT) }) connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => { setIsLogging(false) - sendUsageEventSuccess( - fluidSlug, - currentFluidStatus.lastDataDate === null - ) }) connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => { - sendUsageEventSuccess( - fluidSlug, - currentFluidStatus.lastDataDate === null - ) callbackResponse(SUCCESS_EVENT) }) } @@ -546,8 +491,6 @@ const KonnectorViewerCard = ({ fluidSlug, fluidType, konnector, - sendUsageEventError, - sendUsageEventSuccess, shouldRefreshConsent, trigger, ]) @@ -604,9 +547,7 @@ const KonnectorViewerCard = ({ </AccordionDetails> </Accordion> ) : ( - <> - <AccordionDetails>{getConnectionCard()}</AccordionDetails> - </> + <AccordionDetails>{getConnectionCard()}</AccordionDetails> )} <KonnectorModal open={openModal} diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx index aadb0016f83be044278a7ef2fd14277b7c7445f1..7fbb1d66fdf1829e508d2cc578d2837c6cefbedc 100644 --- a/src/components/Navbar/Navbar.tsx +++ b/src/components/Navbar/Navbar.tsx @@ -11,12 +11,9 @@ import ParameterIconOff from 'assets/icons/tabbar/parametre/parametre-off.svg' import ParameterIconOn from 'assets/icons/tabbar/parametre/parametre-on.svg' import logos from 'assets/png/logos_partenaires.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { UsageEventType } from 'enums' -import React, { useCallback } from 'react' +import React from 'react' import { NavLink, useLocation } from 'react-router-dom' -import UsageEventService from 'services/usageEvent.service' import { useAppSelector } from 'store/hooks' import './navBar.scss' @@ -30,17 +27,6 @@ const Navbar = () => { } = useAppSelector(state => state.ecolyo.global) const { pathname } = useLocation() - const client = useClient() - const emitNavEvent = useCallback( - async (targetPage: string) => { - await UsageEventService.addEvent(client, { - type: UsageEventType.NAVIGATION_EVENT, - target: targetPage, - }) - }, - [client] - ) - /** Return class "is-active" if pathname includes matcher */ const isActive = (matcher: string) => { return pathname.includes(matcher) ? 'is-active' : '' @@ -55,7 +41,6 @@ const Navbar = () => { component={NavLink} to="/consumption" className={`c-nav-link ${isActive('/consumption')}`} - onClick={() => emitNavEvent('consumption')} > <StyledIcon className="c-nav-icon off" icon={ConsoIconOff} /> <StyledIcon className="c-nav-icon on" icon={ConsoIconOn} /> @@ -67,7 +52,6 @@ const Navbar = () => { component={NavLink} to="/challenges" className={`c-nav-link ${isActive('/challenges')}`} - onClick={() => emitNavEvent('challenges')} > {(challengeExplorationNotification || challengeActionNotification || @@ -82,7 +66,6 @@ const Navbar = () => { component={NavLink} to="/ecogestures" className={`c-nav-link ${isActive('/ecogesture')}`} - onClick={() => emitNavEvent('ecogestures')} > <StyledIcon className="c-nav-icon off" icon={BulbIconOff} /> <StyledIcon className="c-nav-icon on" icon={BulbIconOn} /> @@ -94,7 +77,6 @@ const Navbar = () => { component={NavLink} to="/analysis" className={`c-nav-link ${isActive('/analysis')}`} - onClick={() => emitNavEvent('analysis')} > {analysisNotification && <div className="nb-notif">1</div>} <StyledIcon className="c-nav-icon off" icon={AnalysisIconOff} /> @@ -107,7 +89,6 @@ const Navbar = () => { component={NavLink} to="/options" className={`c-nav-link ${isActive('/options')}`} - onClick={() => emitNavEvent('options')} > <StyledIcon className="c-nav-icon off" icon={ParameterIconOff} /> <StyledIcon className="c-nav-icon on" icon={ParameterIconOn} /> diff --git a/src/components/Options/ExportData/Modals/exportLoadingModal.tsx b/src/components/Options/ExportData/Modals/exportLoadingModal.tsx index 35772077fc0e3b9c28fa0aed3dcff189fb839bc6..f6058bed9c22a9a093ed02e7d276bbccecadb78e 100644 --- a/src/components/Options/ExportData/Modals/exportLoadingModal.tsx +++ b/src/components/Options/ExportData/Modals/exportLoadingModal.tsx @@ -12,6 +12,7 @@ import { Datachart, Dataload, TimePeriod } from 'models' import React, { useCallback, useEffect } from 'react' import ConsumptionDataManager from 'services/consumption.service' import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service' +import { formatTwoDigits } from 'utils/utils' import * as XLSX from 'xlsx' import './exportLoadingModal.scss' @@ -64,9 +65,7 @@ const ExportLoadingModal = ({ fluidType: FluidType ): Promise<ExportDataRow> => { const dataRow: ExportDataRow = {} - dataRow[t('export.month')] = dataload.date.month - .toString() - .padStart(2, '0') + dataRow[t('export.month')] = formatTwoDigits(dataload.date.month) dataRow[t('export.year')] = dataload.date.year dataRow[ `${t('export.consumption')} (${t( diff --git a/src/components/Options/ExportData/exportData.scss b/src/components/Options/ExportData/exportData.scss index 3b6852c49d53ced72d8498bba3d73558e04f0d3f..38965f5bda1dfdb3df48e6da1c58ed4bc7f6c841 100644 --- a/src/components/Options/ExportData/exportData.scss +++ b/src/components/Options/ExportData/exportData.scss @@ -1,6 +1,4 @@ @import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; -@import 'src/styles/base/mixins'; div.expansion-panel-root, div.expansion-panel-root.Mui-expanded:last-child { @@ -16,10 +14,8 @@ div.expansion-panel-root.Mui-expanded:last-child { padding: 0 1.5rem; .export-option-content { - width: 45.75rem; - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; .MuiAccordionSummary-content { margin: 0; } diff --git a/src/components/Options/GCU/gcuLink.scss b/src/components/Options/GCU/gcuLink.scss index b63f84bd5ff426139409cbbfdc23a2aac7951e3c..3a88a80d9508fa3a7c92a992ae35bcae66fdb6da 100644 --- a/src/components/Options/GCU/gcuLink.scss +++ b/src/components/Options/GCU/gcuLink.scss @@ -1,4 +1,3 @@ -@import 'src/styles/base/breakpoint'; @import 'src/styles/base/color'; .gcu-link-root { @@ -33,10 +32,8 @@ .ln-contact { color: $multi-color; } - width: 45.75rem; - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; } } @@ -48,9 +45,6 @@ flex-direction: row; margin: -0.75rem 0; width: 100%; - @media #{$large-phone} { - width: 100%; - } .gcu-link-card-content { display: flex; flex-direction: row; diff --git a/src/components/Options/HelpLink/HelpLink.scss b/src/components/Options/HelpLink/HelpLink.scss index dc6ae18729ad0eff8cc08c02014a03073245811f..453d742a2340d847f201ad000603aa2bc2ec0c34 100644 --- a/src/components/Options/HelpLink/HelpLink.scss +++ b/src/components/Options/HelpLink/HelpLink.scss @@ -1,5 +1,4 @@ @import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; .help-root { display: flex; @@ -9,14 +8,13 @@ padding: 0 1.5rem; margin-top: 2rem; .help-content { - width: 45.75rem; + max-width: 45.75rem; + width: 100%; a { color: $white; text-decoration: none; } - @media #{$large-phone} { - width: 100%; - } + .help-header { color: $grey-bright; margin-bottom: 1rem; @@ -33,9 +31,6 @@ flex-direction: row; margin: -0.75rem 0; width: 100%; - @media #{$large-phone} { - width: 100%; - } .help-card-content { display: flex; flex-direction: row; diff --git a/src/components/Options/LegalNotice/LegalNoticeLink.tsx b/src/components/Options/LegalNotice/LegalNoticeLink.tsx index 5786982a77f766c14451781f04c19d17806bb0a6..e158282f8124c1fa85b8f6c266666369297426fc 100644 --- a/src/components/Options/LegalNotice/LegalNoticeLink.tsx +++ b/src/components/Options/LegalNotice/LegalNoticeLink.tsx @@ -1,23 +1,14 @@ import Link from '@material-ui/core/Link' import LegalNoticeIcon from 'assets/icons/ico/legal-notice.svg' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { UsageEventType } from 'enums' -import React, { useCallback } from 'react' +import React from 'react' import { Link as RouterLink } from 'react-router-dom' -import UsageEventService from 'services/usageEvent.service' import './legalNoticeLink.scss' const LegalNoticeLink = () => { const { t } = useI18n() - const client = useClient() - const emitNavEvent = useCallback(async () => { - await UsageEventService.addEvent(client, { - type: UsageEventType.NAVIGATION_EVENT, - target: 'legalNotice', - }) - }, [client]) + return ( <div className="legal-notice-root"> <div className="legal-notice-content"> @@ -28,7 +19,6 @@ const LegalNoticeLink = () => { className="legal-notice-card-link" component={RouterLink} to="/options/legalnotice" - onClick={emitNavEvent} > <div className="card"> <div className="legal-notice-card"> diff --git a/src/components/Options/MatomoOptOut/matomoOptOut.scss b/src/components/Options/MatomoOptOut/matomoOptOut.scss index 830a9fb804007b926142b5da14febf8facf8cca5..0c4754fbe8456e6802f8c6232b27c586ee52ef17 100644 --- a/src/components/Options/MatomoOptOut/matomoOptOut.scss +++ b/src/components/Options/MatomoOptOut/matomoOptOut.scss @@ -1,5 +1,4 @@ @import 'src/styles/base/color'; -@import 'src/styles/base/breakpoint'; @import 'src/styles/base/typo-variables'; .matomo-opt-out-container { @@ -12,10 +11,8 @@ .matomo-opt-out { margin: 0 auto; + max-width: 45.75rem; width: 100%; - @media (min-width: $width-large-phone) { - width: 45.75rem; - } .opt-out-header { color: $grey-bright; } diff --git a/src/components/Options/ProfileTypeOptions/profileTypeOptions.scss b/src/components/Options/ProfileTypeOptions/profileTypeOptions.scss index bf2af832185968d3d81c9d6ceec7b75458b39a90..daf6c7bd9e57767796e21deb07041f380b80db2c 100644 --- a/src/components/Options/ProfileTypeOptions/profileTypeOptions.scss +++ b/src/components/Options/ProfileTypeOptions/profileTypeOptions.scss @@ -6,10 +6,8 @@ padding: 0 1.5rem; .profile-type-content { margin: 0 auto; + max-width: 45.75rem; width: 100%; - @media (min-width: $width-large-phone) { - width: 45.75rem; - } .MuiButtonBase-root { height: 40px; margin: 0; diff --git a/src/components/Options/ReportOptions/ReportOptions.spec.tsx b/src/components/Options/ReportOptions/ReportOptions.spec.tsx index 711a1ce72e0bf177c4aef9ff76a583cb510c2a4f..008e755404fc612cda3a1c5c722377e7d0185da5 100644 --- a/src/components/Options/ReportOptions/ReportOptions.spec.tsx +++ b/src/components/Options/ReportOptions/ReportOptions.spec.tsx @@ -32,7 +32,7 @@ describe('ReportOptions component', () => { <ReportOptions /> </Provider> ) - expect(screen.getByText('profile.report.deactivate')).toBeInTheDocument() + expect(screen.getAllByRole('checkbox')[0]).toBeChecked() }) it('should update the profile with sendAnalysisNotification to false', async () => { @@ -41,7 +41,7 @@ describe('ReportOptions component', () => { <ReportOptions /> </Provider> ) - await userEvent.click(screen.getAllByRole('button')[0]) + await userEvent.click(screen.getAllByRole('checkbox')[0]) expect(updateProfileSpy).toHaveBeenCalledTimes(1) expect(updateProfileSpy).toHaveBeenCalledWith({ sendAnalysisNotification: false, @@ -57,7 +57,7 @@ describe('ReportOptions component', () => { <ReportOptions /> </Provider> ) - await userEvent.click(screen.getAllByRole('button')[0]) + await userEvent.click(screen.getAllByRole('checkbox')[0]) expect(updateProfileSpy).toHaveBeenCalledTimes(1) expect(updateProfileSpy).toHaveBeenCalledWith({ sendAnalysisNotification: true, @@ -75,8 +75,8 @@ describe('ReportOptions component', () => { <ReportOptions /> </Provider> ) - expect(screen.getByRole('checkbox')).not.toBeChecked() - await userEvent.click(screen.getByRole('checkbox')) + expect(screen.getAllByRole('checkbox')[1]).not.toBeChecked() + await userEvent.click(screen.getAllByRole('checkbox')[1]) expect(updateProfileSpy).toHaveBeenCalledTimes(1) expect(updateProfileSpy).toHaveBeenCalledWith({ sendConsumptionAlert: true, diff --git a/src/components/Options/ReportOptions/ReportOptions.tsx b/src/components/Options/ReportOptions/ReportOptions.tsx index 7a2578a8c44f9da552fb06b88a034a8969727ef9..30dc6917cfcdb8abfe8516f5a3bf89101ffebb90 100644 --- a/src/components/Options/ReportOptions/ReportOptions.tsx +++ b/src/components/Options/ReportOptions/ReportOptions.tsx @@ -1,4 +1,3 @@ -import { Button } from '@material-ui/core' import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' @@ -95,84 +94,71 @@ const ReportOptions = () => { return ( <div className="report-option-root"> <div className="report-option-content"> - <div className="head text-16-normal-uppercase"> - {t('profile.report.title_bilan')} - </div> {/* Monthly Report activation */} - <div className="switch-container-bilan"> - <span className="switch-label text-16-normal"> + <div className="reportCard"> + <div className="row"> + <StyledSwitch + onClick={toggleAnalysisNotification} + checked={profile.sendAnalysisNotification} + /> + <span className="text-16-normal-uppercase"> + {t('profile.report.title_bilan')} + </span> + </div> + <span className="text-16-normal"> {t('profile.report.switch_label_bilan')} </span> - <div className="button-container"> - <Button - aria-label={t('unsubscribe.button_accessibility')} - onClick={() => toggleAnalysisNotification()} - variant="contained" - classes={{ - root: 'btnPrimary', - label: 'text-18-bold', - }} - > - {profile.sendAnalysisNotification - ? t('profile.report.deactivate') - : t('profile.report.activate')} - </Button> - </div> </div> {/* Consumption Alert activation */} {isWaterConnected && ( - <> - <div className="head text-16-normal-uppercase"> - {t('profile.report.title_alert')} - </div> - <div className="waterAlert"> - <div className="switch-container-alert"> - <StyledSwitch - checked={profile.sendConsumptionAlert} - onChange={handleAlertChange} - inputProps={{ - 'aria-label': t( - 'profile.accessibility.button_toggle_consumption_alert' - ), - }} - /> - <span className="text-16-normal"> - {t('profile.report.switch_label_alert')} - </span> + <div className="reportCard"> + <div className="row"> + <StyledSwitch + checked={profile.sendConsumptionAlert} + onChange={handleAlertChange} + /> + + <div className="text-16-normal-uppercase"> + {t('profile.report.title_alert')} </div> - {profile.sendConsumptionAlert && ( - <> - <div className="text-16-normal"> - {t('profile.report.input_label_alert')} - </div> - <div className="switch-container-alert"> - <input - className="inputNumber text-18" - type="number" - defaultValue={ - profile.waterDailyConsumptionLimit === 0 - ? '' - : profile.waterDailyConsumptionLimit - } - onBlur={setWaterLimit} - aria-label={t( - 'profile.accessibility.input_water_alert_report' - )} - inputMode="numeric" - /> - <span className="switch-label text-16-normal">L</span> - </div> - {maxDayData && ( - <div className="alert-input-subtext text-14"> - {t('profile.report.input_label_subtext_alert')} - {Math.round(maxDayData.value)} - {' L'} - </div> - )} - </> - )} </div> - </> + + <span className="text-16-normal"> + {t('profile.report.switch_label_alert')} + </span> + + {profile.sendConsumptionAlert && ( + <> + <div className="text-16-normal"> + {t('profile.report.input_label_alert')} + </div> + <div className="switch-container-alert"> + <input + className="inputNumber text-18" + type="number" + defaultValue={ + profile.waterDailyConsumptionLimit === 0 + ? '' + : profile.waterDailyConsumptionLimit + } + onBlur={setWaterLimit} + aria-label={t( + 'profile.accessibility.input_water_alert_report' + )} + inputMode="numeric" + /> + <span className="switch-label text-16-normal">L</span> + </div> + {maxDayData && ( + <div className="alert-input-subtext text-14"> + {t('profile.report.input_label_subtext_alert')} + {Math.round(maxDayData.value)} + {' L'} + </div> + )} + </> + )} + </div> )} </div> </div> diff --git a/src/components/Options/ReportOptions/reportOptions.scss b/src/components/Options/ReportOptions/reportOptions.scss index e6da9654a6abbfea2078b034b6eb2c741d893118..58ab12b6b0aaa790e6c71101041272ca86361267 100644 --- a/src/components/Options/ReportOptions/reportOptions.scss +++ b/src/components/Options/ReportOptions/reportOptions.scss @@ -1,5 +1,6 @@ @import 'src/styles/base/color'; @import 'src/styles/base/breakpoint'; + .report-option-root { display: flex; flex-direction: column; @@ -8,48 +9,40 @@ padding: 0 1.5rem; margin-top: 2rem; .report-option-content { - width: 45.75rem; - @media #{$large-phone} { - width: 100%; - } + max-width: 45.75rem; + width: 100%; + display: flex; + flex-direction: column; + gap: 2rem; } .head { color: $grey-bright; margin-bottom: 1rem; } - .switch-container-bilan { - display: flex; - flex-direction: column; - color: $grey-bright; - margin-bottom: 2rem; - .switch-label { - margin-left: 0.2rem; - padding-right: 0.8rem; - } - .button-container { - max-width: 200px; - button { - width: 125px; - margin-top: 0.75rem; - } - } - } - .waterAlert { + .reportCard { + border: 1px solid #383941; + border-radius: 4px; + padding: 12px 16px; display: flex; flex-direction: column; - gap: 1rem; + gap: 10px; color: $grey-bright; - - .switch-container-alert { - color: $grey-bright; + .row { display: flex; + flex-direction: row; align-items: center; - gap: 0.5rem; } + } - .alert-input-subtext { - color: $soft-grey; - } + .switch-container-alert { + color: $grey-bright; + display: flex; + align-items: center; + gap: 0.5rem; + } + + .alert-input-subtext { + color: $soft-grey; } } diff --git a/src/components/Options/Unsubscribe/UnSubscribeView.spec.tsx b/src/components/Options/Unsubscribe/UnSubscribeView.spec.tsx deleted file mode 100644 index 790c171bbc6401b1f9b6ef760c972b1b40e4f55c..0000000000000000000000000000000000000000 --- a/src/components/Options/Unsubscribe/UnSubscribeView.spec.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { render, screen } from '@testing-library/react' -import userEvent from '@testing-library/user-event' -import React from 'react' -import { Provider } from 'react-redux' -import * as profileActions from 'store/profile/profile.slice' -import { createMockEcolyoStore } from 'tests/__mocks__/store' -import UnSubscribeView from './UnSubscribeView' - -jest.mock('components/Header/CozyBar', () => 'mock-cozybar') -jest.mock('components/Header/Header', () => 'mock-header') -jest.mock('components/Content/Content', () => 'mock-content') - -const mockUpdateProfile = jest.fn() -jest.mock('services/profile.service', () => { - return jest.fn(() => ({ - updateProfile: mockUpdateProfile, - })) -}) -const updateProfileSpy = jest.spyOn(profileActions, 'updateProfile') -const mockedNavigate = jest.fn() -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useNavigate: () => mockedNavigate, -})) - -describe('UnSubscribe component', () => { - const store = createMockEcolyoStore() - beforeEach(() => { - jest.clearAllMocks() - }) - - it('should be rendered correctly', () => { - const { container } = render( - <Provider store={store}> - <UnSubscribeView /> - </Provider> - ) - expect(container).toMatchSnapshot() - }) - - it('should click on button and deactivate report', async () => { - render( - <Provider store={store}> - <UnSubscribeView /> - </Provider> - ) - await userEvent.click(screen.getByRole('button')) - expect(updateProfileSpy).toHaveBeenCalledWith({ - sendAnalysisNotification: false, - }) - }) -}) diff --git a/src/components/Options/Unsubscribe/UnSubscribeView.tsx b/src/components/Options/Unsubscribe/UnSubscribeView.tsx deleted file mode 100644 index f67dbdc7d0a92bff0faa7169dbefc07dfd120981..0000000000000000000000000000000000000000 --- a/src/components/Options/Unsubscribe/UnSubscribeView.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { Button } from '@material-ui/core' -import BearIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg' -import StyledIcon from 'components/CommonKit/Icon/StyledIcon' -import Content from 'components/Content/Content' -import CozyBar from 'components/Header/CozyBar' -import Header from 'components/Header/Header' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import React, { useState } from 'react' -import { useNavigate } from 'react-router-dom' -import { useAppDispatch } from 'store/hooks' -import { updateProfile } from 'store/profile/profile.slice' -import './unSubscribeView.scss' - -const UnSubscribeView = () => { - const { t } = useI18n() - const navigate = useNavigate() - const dispatch = useAppDispatch() - const [headerHeight, setHeaderHeight] = useState<number>(0) - const unSubscribe = async () => { - dispatch(updateProfile({ sendAnalysisNotification: false })) - navigate('/consumption') - } - - return ( - <> - <CozyBar titleKey="common.title_analysis" /> - <Header - setHeaderHeight={setHeaderHeight} - desktopTitleKey="common.title_analysis" - /> - <Content heightOffset={headerHeight}> - <div className="unsubscribe-container"> - <StyledIcon className="profile-icon" icon={BearIcon} size={250} /> - - <div className="text-20-bold head">{t('unsubscribe.title')}</div> - <div className="text-16-normal question"> - {t('unsubscribe.content')} - </div> - <Button - aria-label={t('unsubscribe.button_accessibility')} - onClick={() => unSubscribe()} - variant="contained" - classes={{ - root: 'btnPrimary', - label: 'text-18-bold', - }} - > - {t('unsubscribe.button_text')} - </Button> - </div> - </Content> - </> - ) -} - -export default UnSubscribeView diff --git a/src/components/Options/Unsubscribe/Unsubscribe.spec.tsx b/src/components/Options/Unsubscribe/Unsubscribe.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a014ff8cb0b1b83f6483b2673a042a1391bf78be --- /dev/null +++ b/src/components/Options/Unsubscribe/Unsubscribe.spec.tsx @@ -0,0 +1,31 @@ +import { render, screen, waitFor } from '@testing-library/react' +import { userEvent } from '@testing-library/user-event' +import React from 'react' +import Unsubscribe from './Unsubscribe' + +const mockUpdateProfile = jest.fn().mockResolvedValue('') +jest.mock('services/profile.service', () => { + return jest.fn(() => ({ + updateProfile: mockUpdateProfile, + })) +}) + +describe('Unsubscribe component', () => { + it('should be rendered correctly', async () => { + const { container } = render(<Unsubscribe />) + await waitFor(() => null, { container }) + expect(container).toMatchSnapshot() + }) + + it('should click the subscribe button', async () => { + const { container } = render(<Unsubscribe />) + await waitFor(() => null, { container }) + const [subscribeBtn] = screen.getAllByRole('button') + await userEvent.click(subscribeBtn) + expect(mockUpdateProfile).toHaveBeenCalled() + + // then should only display one button + const buttons = screen.getAllByRole('button') + expect(buttons.length).toBe(1) + }) +}) diff --git a/src/components/Options/Unsubscribe/Unsubscribe.tsx b/src/components/Options/Unsubscribe/Unsubscribe.tsx new file mode 100644 index 0000000000000000000000000000000000000000..07efaeaf987b1428dcdbccb14ca1502f6bc382f6 --- /dev/null +++ b/src/components/Options/Unsubscribe/Unsubscribe.tsx @@ -0,0 +1,80 @@ +import { Button } from '@material-ui/core' +import * as Sentry from '@sentry/react' +import EcolyoGlowIcon from 'assets/icons/ico/ecolyo-glow.svg' +import StyledIcon from 'components/CommonKit/Icon/StyledIcon' +import Loader from 'components/Loader/Loader' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import React, { useCallback, useEffect, useMemo, useState } from 'react' +import ProfileService from 'services/profile.service' +import './unsubscribe.scss' + +const Unsubscribe = () => { + const { t } = useI18n() + const client = useClient() + + const [isLoading, setIsLoading] = useState(true) + const [status, setStatus] = useState< + 'subscribed' | 'error' | 'unsubscribed' + >() + + const profileService = useMemo(() => new ProfileService(client), [client]) + + const updateSubscription = useCallback( + (value: boolean) => { + setIsLoading(true) + + profileService + .updateProfile({ sendAnalysisNotification: value }) + .then(() => { + setStatus(value ? 'subscribed' : 'unsubscribed') + }) + .catch(err => { + setStatus('error') + console.error(err) + Sentry.captureException('Failed to unsubscribe') + }) + .finally(() => { + setIsLoading(false) + }) + }, + [profileService] + ) + + useEffect(() => { + updateSubscription(false) + }, [updateSubscription]) + + return ( + <div className="unsubscribe-container"> + {isLoading && <Loader />} + {!isLoading && ( + <> + <StyledIcon icon={EcolyoGlowIcon} size={180} /> + <div className="text-20-bold head">{t(`unsubscribe.${status}`)}</div> + {status === 'unsubscribed' && ( + <div className="text-16-normal question"> + {t('unsubscribe.content')} + </div> + )} + {status !== 'subscribed' && status !== 'error' && ( + <Button + className="btnPrimary" + onClick={() => updateSubscription(true)} + > + {t('unsubscribe.button_subscribe')} + </Button> + )} + <Button + className="btnText" + onClick={() => window.location.replace('/')} + > + {t('unsubscribe.button_home')} + </Button> + </> + )} + </div> + ) +} + +export default Unsubscribe diff --git a/src/components/Options/Unsubscribe/__snapshots__/UnSubscribeView.spec.tsx.snap b/src/components/Options/Unsubscribe/__snapshots__/UnSubscribeView.spec.tsx.snap deleted file mode 100644 index 85efc0cad5e2d2420047f871af41b2bef8bb7a84..0000000000000000000000000000000000000000 --- a/src/components/Options/Unsubscribe/__snapshots__/UnSubscribeView.spec.tsx.snap +++ /dev/null @@ -1,55 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`UnSubscribe component should be rendered correctly 1`] = ` -<div> - <mock-cozybar - titlekey="common.title_analysis" - /> - <mock-header - desktoptitlekey="common.title_analysis" - /> - <mock-content - heightoffset="0" - > - <div - class="unsubscribe-container" - > - <svg - aria-hidden="true" - class="profile-icon styles__icon___23x3R" - height="250" - width="250" - > - <use - xlink:href="#test-file-stub" - /> - </svg> - <div - class="text-20-bold head" - > - unsubscribe.title - </div> - <div - class="text-16-normal question" - > - unsubscribe.content - </div> - <button - aria-label="unsubscribe.button_accessibility" - class="MuiButtonBase-root MuiButton-root btnPrimary MuiButton-contained" - tabindex="0" - type="button" - > - <span - class="MuiButton-label text-18-bold" - > - unsubscribe.button_text - </span> - <span - class="MuiTouchRipple-root" - /> - </button> - </div> - </mock-content> -</div> -`; diff --git a/src/components/Options/Unsubscribe/__snapshots__/Unsubscribe.spec.tsx.snap b/src/components/Options/Unsubscribe/__snapshots__/Unsubscribe.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..f05911f7f85d0f67f8d3ae7fb2f9931fac5f6d7e --- /dev/null +++ b/src/components/Options/Unsubscribe/__snapshots__/Unsubscribe.spec.tsx.snap @@ -0,0 +1,52 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Unsubscribe component should be rendered correctly 1`] = ` +<div> + <div + class="unsubscribe-container" + > + <svg + aria-hidden="true" + class="styles__icon___23x3R" + height="180" + width="180" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + <div + class="text-20-bold head" + > + unsubscribe.unsubscribed + </div> + <div + class="text-16-normal question" + > + unsubscribe.content + </div> + <button + class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary" + tabindex="0" + type="button" + > + <span + class="MuiButton-label" + > + unsubscribe.button_subscribe + </span> + </button> + <button + class="MuiButtonBase-root MuiButton-root MuiButton-text btnText" + tabindex="0" + type="button" + > + <span + class="MuiButton-label" + > + unsubscribe.button_home + </span> + </button> + </div> +</div> +`; diff --git a/src/components/Options/Unsubscribe/unSubscribeView.scss b/src/components/Options/Unsubscribe/unsubscribe.scss similarity index 81% rename from src/components/Options/Unsubscribe/unSubscribeView.scss rename to src/components/Options/Unsubscribe/unsubscribe.scss index 1efa15a6f93c3a3683cd52f45acf0c9321dfe44c..7f89e37992815ce5af8c86d5738b7d9e2a8bbbef 100644 --- a/src/components/Options/Unsubscribe/unSubscribeView.scss +++ b/src/components/Options/Unsubscribe/unsubscribe.scss @@ -7,7 +7,7 @@ gap: 1rem; max-width: 450px; margin: auto; - padding: 2rem; + padding: 4rem 2rem; text-align: center; .head { color: $gold-shadow; @@ -15,4 +15,7 @@ .question { color: $white; } + .btnText { + color: $grey-bright; + } } diff --git a/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap b/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap index f4e64582fee87f31407a828cb43e6fc24141d170..eee51c9ad1383e8c55bd7bbb53ab0d99fe3e5af1 100644 --- a/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap +++ b/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap @@ -159,37 +159,50 @@ exports[`OptionsView component should be rendered correctly 1`] = ` class="report-option-content" > <div - class="head text-16-normal-uppercase" - > - profile.report.title_bilan - </div> - <div - class="switch-container-bilan" + class="reportCard" > - <span - class="switch-label text-16-normal" - > - profile.report.switch_label_bilan - </span> <div - class="button-container" + class="row" > - <button - aria-label="unsubscribe.button_accessibility" - class="MuiButtonBase-root MuiButton-root btnPrimary MuiButton-contained" - tabindex="0" - type="button" + <span + class="MuiSwitch-root WithStyles(ForwardRef(Switch))-root-3" > <span - class="MuiButton-label text-18-bold" + aria-disabled="false" + class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-7 MuiSwitch-switchBase WithStyles(ForwardRef(Switch))-switchBase-4 MuiSwitch-colorSecondary PrivateSwitchBase-checked-8 Mui-checked WithStyles(ForwardRef(Switch))-checked-5" > - profile.report.deactivate + <span + class="MuiIconButton-label" + > + <input + checked="" + class="PrivateSwitchBase-input-10 MuiSwitch-input" + type="checkbox" + value="" + /> + <span + class="MuiSwitch-thumb" + /> + </span> + <span + class="MuiTouchRipple-root" + /> </span> <span - class="MuiTouchRipple-root" + class="MuiSwitch-track WithStyles(ForwardRef(Switch))-track-6" /> - </button> + </span> + <span + class="text-16-normal-uppercase" + > + profile.report.title_bilan + </span> </div> + <span + class="text-16-normal" + > + profile.report.switch_label_bilan + </span> </div> </div> </div> diff --git a/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx b/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx index cad6e9cd5bf3bbbc8667035c66386b49a4ecf5b4..c1e63fc33d4b952ce125fdb309376e1066800503 100644 --- a/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx +++ b/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx @@ -1,13 +1,12 @@ import { MenuItem, Select } from '@material-ui/core' import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation' -import FormProgress from 'components/CommonKit/FormProgress/FormProgress' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { ProfileTypeStepForm } from 'enums' import { DateTime } from 'luxon' import { ProfileType, ProfileTypeAnswer, ProfileTypeValues } from 'models' import React, { useCallback, useState } from 'react' -import { getMonthFullName } from 'utils/utils' +import { formatTwoDigits, getMonthFullName } from 'utils/utils' interface ProfileTypeFormDateSelectionProps { step: ProfileTypeStepForm @@ -33,7 +32,7 @@ const ProfileTypeFormDateSelection = ({ const [selectedYear, setSelectedYear] = useState<number>(DateTime.now().year) const [selectedMonth, setSelectedMonth] = useState<SelectionMonth>({ label: DateTime.now().toLocaleString({ month: 'long' }), - value: DateTime.now().month.toString().padStart(2, '0'), // Date.getMonth starts at 0 + value: formatTwoDigits(DateTime.now().month), // Date.getMonth starts at 0 }) const buildISODate = (year: string, month: string) => DateTime.fromISO(`${year}-${month}-01`) @@ -131,7 +130,6 @@ const ProfileTypeFormDateSelection = ({ return ( <> <div className="profile-form-container"> - <FormProgress step={step} formType="profile" /> <div className="profile-question-label"> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` @@ -177,10 +175,10 @@ const ProfileTypeFormDateSelection = ({ )} </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} disableNextButton={answer === ''} + isLastStep={true} /> </> ) diff --git a/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx b/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx index 6a58102c477facedfdd91c2b89d8c7469af56e59..2a3c9cfac0a6275e6c409c307dad16ed9ec734ad 100644 --- a/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx +++ b/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx @@ -1,6 +1,5 @@ import classNames from 'classnames' import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation' -import FormProgress from 'components/CommonKit/FormProgress/FormProgress' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { ProfileTypeStepForm } from 'enums' @@ -74,7 +73,6 @@ const ProfileTypeFormMultiChoice = ({ return ( <> <div className="profile-form-container"> - <FormProgress step={step} formType="profile" /> <div className="profile-question-label"> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` @@ -110,7 +108,6 @@ const ProfileTypeFormMultiChoice = ({ })} </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} disableNextButton={answer.length < 1} diff --git a/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx b/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx index 918be75c334d086c3efd1485cd588e02c399133d..e4d1bf390873b9d92424d7b165886f722980295e 100644 --- a/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx +++ b/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx @@ -1,6 +1,5 @@ /* eslint-disable jsx-a11y/no-autofocus */ import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation' -import FormProgress from 'components/CommonKit/FormProgress/FormProgress' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { ProfileTypeStepForm } from 'enums' @@ -48,7 +47,6 @@ const ProfileTypeFormNumber = ({ return ( <> <div className="profile-form-container"> - <FormProgress step={step} formType="profile" /> <div className="profile-question-label"> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` @@ -70,7 +68,6 @@ const ProfileTypeFormNumber = ({ )} </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} disableNextButton={answer === ''} diff --git a/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx b/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx index 10c5ca18bc0dcebac352cca988340ea10846c788..be39d086fade19dd51fb266d8d5f3d33838ead41 100644 --- a/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx +++ b/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx @@ -1,6 +1,5 @@ import { Button } from '@material-ui/core' import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation' -import FormProgress from 'components/CommonKit/FormProgress/FormProgress' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { ProfileTypeStepForm } from 'enums' @@ -66,7 +65,6 @@ const ProfileTypeFormNumberSelection = ({ return ( <> <div className="profile-form-container"> - <FormProgress step={step} formType="profile" /> <div className="profile-question-label"> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` @@ -105,7 +103,6 @@ const ProfileTypeFormNumberSelection = ({ )} </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} disableNextButton={answer === ''} diff --git a/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx b/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx index 52f88be87c5fa774acbf08f7e881bc76a9b88ec6..2fc81aa25bc284c25999e7b688f108426f99bf75 100644 --- a/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx +++ b/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx @@ -1,6 +1,5 @@ import classNames from 'classnames' import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation' -import FormProgress from 'components/CommonKit/FormProgress/FormProgress' import 'components/ProfileType/profileTypeForm.scss' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { ProfileTypeStepForm } from 'enums' @@ -70,7 +69,6 @@ const ProfileTypeFormSingleChoice = ({ return ( <> <div className="profile-form-container"> - <FormProgress step={step} formType="profile" /> <div className="profile-question-label"> {t( `profile_type.${ProfileTypeStepForm[step].toLowerCase()}.question` @@ -105,9 +103,9 @@ const ProfileTypeFormSingleChoice = ({ })} </div> <FormNavigation - step={step} handlePrevious={handlePrevious} handleNext={handleNext} + disablePrevButton={step === ProfileTypeStepForm.HOUSING_TYPE} disableNextButton={answer === '' || answer === undefined} /> </> diff --git a/src/components/ProfileType/ProfileTypeView.spec.tsx b/src/components/ProfileType/ProfileTypeView.spec.tsx index c9bc054f90caf1450ffe2f3b6d9bdea50cd6be8a..77e2baebe8ea29e3184babe0745fed2a83d520ec 100644 --- a/src/components/ProfileType/ProfileTypeView.spec.tsx +++ b/src/components/ProfileType/ProfileTypeView.spec.tsx @@ -1,4 +1,4 @@ -import { render } from '@testing-library/react' +import { render, screen } from '@testing-library/react' import ProfileTypeView from 'components/ProfileType/ProfileTypeView' import React from 'react' import { Provider } from 'react-redux' @@ -28,4 +28,14 @@ describe('ProfileTypeView component', () => { container.getElementsByClassName('profile-type-container')[0] ).toBeInTheDocument() }) + + it('should not be able to click previous on the first step', () => { + render( + <Provider store={store}> + <ProfileTypeView /> + </Provider> + ) + const [prev] = screen.getAllByRole('button') + expect(prev).toBeDisabled() + }) }) diff --git a/src/components/ProfileType/ProfileTypeView.tsx b/src/components/ProfileType/ProfileTypeView.tsx index 6f619beb1e9c8c1372a0ad4602cb87174dffce58..2436c5bd0203f363949993fd39c456cb4f2e632a 100644 --- a/src/components/ProfileType/ProfileTypeView.tsx +++ b/src/components/ProfileType/ProfileTypeView.tsx @@ -1,3 +1,4 @@ +import FormProgress from 'components/CommonKit/FormProgress/FormProgress' import Content from 'components/Content/Content' import EcogestureFormEquipment from 'components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment' import CozyBar from 'components/Header/CozyBar' @@ -212,7 +213,6 @@ const ProfileTypeView = () => { } else if (answerType.type === ProfileTypeFormType.EQUIPMENT_SELECTION) { return ( <EcogestureFormEquipment - step={step} currentProfileType={currentProfileType} setNextStepProfileForm={setNextStep} setPreviousStep={setPreviousStep} @@ -230,16 +230,28 @@ const ProfileTypeView = () => { displayBackArrow={true} /> <Content heightOffset={headerHeight}> - <div className="profile-type-container"> - {isLoading && <Loader />} - {!isLoading && ( - <> - {step !== ProfileTypeStepForm.END && selectForm()} - {step === ProfileTypeStepForm.END && ( - <ProfileTypeFinished profileType={currentProfileType} /> - )} - </> - )} + <div className="profileType-view"> + <div className="progressContainer"> + <FormProgress + currentStep={step} + totalSteps={Object.keys(ProfileTypeStepForm).length / 2} + /> + </div> + <div className="profile-type-container"> + {isLoading && ( + <div className="loaderContainer"> + <Loader /> + </div> + )} + {!isLoading && ( + <> + {step !== ProfileTypeStepForm.END && selectForm()} + {step === ProfileTypeStepForm.END && ( + <ProfileTypeFinished profileType={currentProfileType} /> + )} + </> + )} + </div> </div> </Content> </> diff --git a/src/components/ProfileType/profileTypeForm.scss b/src/components/ProfileType/profileTypeForm.scss index 49f36d4ec7d6cc9e8897c9ee2f3e759f7470045d..9ebe653558a6026ed81aa611f69570526f0457c6 100644 --- a/src/components/ProfileType/profileTypeForm.scss +++ b/src/components/ProfileType/profileTypeForm.scss @@ -4,7 +4,7 @@ .profile-form-container { color: $white; - margin: 1rem 1rem 3.5rem; + margin: 0 1rem 1rem; max-width: 53rem; .text { font-size: 1.25rem; diff --git a/src/components/ProfileType/profileTypeView.scss b/src/components/ProfileType/profileTypeView.scss index 0a07966b1977394dd46fd3530552a55babc9d6bf..e8cd7e8470d27434c43af811ba609018503fa51a 100644 --- a/src/components/ProfileType/profileTypeView.scss +++ b/src/components/ProfileType/profileTypeView.scss @@ -1,11 +1,21 @@ -.profile-type-container { - position: relative; - min-height: inherit; +.profileType-view { display: flex; - flex: 1; flex-direction: column; - justify-content: space-between; - label { - cursor: pointer; + flex: 1; + padding-top: 1rem; + .progressContainer { + margin-inline: 1rem; + } + + .profile-type-container { + position: relative; + min-height: inherit; + display: flex; + flex: 1; + flex-direction: column; + justify-content: space-between; + label { + cursor: pointer; + } } } diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx index 62b571998ea0bbd8885641513bb09b8996ca701e..12809ef896773c3bc99e5b90f74c05926316ed62 100644 --- a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx +++ b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx @@ -32,7 +32,7 @@ jest.mock('services/challenge.service', () => { describe('QuizCustomQuestionContent component', () => { const store = createMockEcolyoStore() it('should be rendered correctly', async () => { - const { container } = render( + render( <Provider store={store}> <QuizQuestionContentCustom userChallenge={userChallengeData[0]} @@ -63,7 +63,7 @@ describe('QuizCustomQuestionContent component', () => { ).toBeInTheDocument() }) it('should display QuizExplanationModal when click on Button', async () => { - const { container } = render( + render( <Provider store={store}> <QuizQuestionContentCustom userChallenge={userChallengeData[0]} diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx index 92e94e5df2676f65b5b376f3c09e84d1b9b5d00b..72cf01ba2719b26e4da2132d41193389d67eaf70 100644 --- a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx +++ b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx @@ -5,12 +5,11 @@ import Loader from 'components/Loader/Loader' import QuizExplanationModal from 'components/Quiz/QuizExplanationModal/QuizExplanationModal' import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { UsageEventType, UserChallengeUpdateFlag } from 'enums' +import { UserChallengeUpdateFlag } from 'enums' import { Answer, QuestionEntity, UserChallenge, UserQuiz } from 'models' import React, { useState } from 'react' import ChallengeService from 'services/challenge.service' import QuizService from 'services/quiz.service' -import UsageEventService from 'services/usageEvent.service' import { updateUserChallengeList } from 'store/challenge/challenge.slice' import { useAppDispatch } from 'store/hooks' import './quizQuestion.scss' @@ -74,13 +73,6 @@ const QuizQuestionContentCustom = ({ userChallenge, UserChallengeUpdateFlag.QUIZ_DONE ) - await UsageEventService.addEvent(client, { - type: UsageEventType.QUIZ_END_EVENT, - startDate: userChallenge.quiz.startDate, - target: userChallenge.quiz.id, - result: userChallenge.quiz.result.toString(), - context: userChallenge.id, - }) dispatch(updateUserChallengeList(userChallengeUpdated)) } diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx index 259830e52e4c14771f18f5d2f047accdab59ebad..89d3a0590b6262642918b54382c2851aa3bf5fa6 100644 --- a/src/components/Routes/Routes.tsx +++ b/src/components/Routes/Routes.tsx @@ -6,7 +6,6 @@ import EcogestureFormView from 'components/EcogestureForm/EcogestureFormView' import EcogestureSelectionView from 'components/EcogestureSelection/EcogestureSelectionView' import ExplorationView from 'components/Exploration/ExplorationView' import Loader from 'components/Loader/Loader' -import UnSubscribeView from 'components/Options/Unsubscribe/UnSubscribeView' import QuizView from 'components/Quiz/QuizView' import TermsView from 'components/Terms/TermsView' import { FluidType } from 'enums' @@ -92,7 +91,6 @@ const AppRoutes = ({ termsStatus }: { termsStatus: TermsStatus }) => { <Route path="/options" element={<OptionsView />} /> <Route path="/analysis" element={<AnalysisView />} /> <Route path="/profiletype" element={<ProfileTypeView />} /> - <Route path="/unsubscribe" element={<UnSubscribeView />} /> <Route path="*" element={<Navigate replace to="/consumption" />} /> </> )} diff --git a/src/components/Splash/SplashRoot.spec.tsx b/src/components/Splash/SplashRoot.spec.tsx index 0f27dbc19a450c5a76d97d1045eb8d92d61ab574..a948480c9363206ed0cf6e0b31d2d78cade0a02e 100644 --- a/src/components/Splash/SplashRoot.spec.tsx +++ b/src/components/Splash/SplashRoot.spec.tsx @@ -1,4 +1,5 @@ -import { render } from '@testing-library/react' +import { render, screen, waitFor } from '@testing-library/react' +import { userEvent } from '@testing-library/user-event' import React from 'react' import { Provider } from 'react-redux' import { createMockEcolyoStore } from 'tests/__mocks__/store' @@ -11,14 +12,24 @@ jest.mock('@sentry/react', () => ({ })) describe('SplashRoot component', () => { + const store = createMockEcolyoStore() it('should be rendered correctly', async () => { - const store = createMockEcolyoStore() const { container } = render( <Provider store={store}> <SplashRoot>children</SplashRoot> </Provider> ) + expect(container).toMatchSnapshot() + }) + it('should render the error screen and click on the reload button', async () => { + const { container } = render( + <Provider store={store}> + <SplashRoot>children</SplashRoot> + </Provider> + ) + await waitFor(() => null, { container }) expect(container).toMatchSnapshot() + await userEvent.click(screen.getByRole('button')) }) }) diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx index 5084ce80f6fe7c35724b079f97dee58d16cefd8e..068f256c176eb0af7d04ddf2f29bcedbb352df2f 100644 --- a/src/components/Splash/SplashRoot.tsx +++ b/src/components/Splash/SplashRoot.tsx @@ -3,7 +3,6 @@ import classNames from 'classnames' import useExploration from 'components/Hooks/useExploration' import { useClient } from 'cozy-client' import { - UsageEventType, UserActionState, UserChallengeState, UserDuelState, @@ -30,7 +29,6 @@ import FluidService from 'services/fluid.service' import InitializationService from 'services/initialization.service' import PartnersInfoService from 'services/partnersInfo.service' import ProfileTypeEntityService from 'services/profileTypeEntity.service' -import UsageEventService from 'services/usageEvent.service' import { setAnalysisMonth } from 'store/analysis/analysis.slice' import { setChallengeConsumption, @@ -326,18 +324,6 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { } } } - if (profile) { - await UsageEventService.addEvent(client, { - type: UsageEventType.CONNECTION_EVENT, - result: profile.isFirstConnection ? 'firstConnection' : undefined, - context: - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) - ? 'mobile' - : 'desktop', - }) - } /** * Load custom popup and partners info synchronously so these treatments don't block the loading diff --git a/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap index b0bdc3fbd8f3fbb61a55b0fb16254858ed550f59..4addaf3b692b89fdff97bc23f1eeef967277c2c7 100644 --- a/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap +++ b/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap @@ -49,3 +49,60 @@ exports[`SplashRoot component should be rendered correctly 1`] = ` </div> </div> `; + +exports[`SplashRoot component should render the error screen and click on the reload button 1`] = ` +<div> + <div + class="splash-root" + style="transition-duration: 1s;" + > + <div + class="splash-content" + > + <div + class="splash-loader" + > + <svg + aria-hidden="true" + class="error styles__icon___23x3R" + height="130" + width="130" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + <span> + Ecolyo + </span> + <div + class="splash-error-text text-20-bold" + > + splashscreen.error_loading + </div> + <div + class="splash-error-text text-18-normal" + > + splashscreen.consent_error + </div> + </div> + </div> + <div + class="splash-footer" + > + <button + aria-label="splashscreen.accessibility.button_reload" + class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary splash-footer-button" + tabindex="0" + type="button" + > + <span + class="MuiButton-label" + > + splashscreen.button_reload + </span> + </button> + </div> + </div> +</div> +`; diff --git a/src/components/theme.ts b/src/components/theme.ts index e23010af8bab6529a2e279be850241191d9559f1..e1b9d32f0f4fe8779ed4cb7dde38eb4b572efb35 100644 --- a/src/components/theme.ts +++ b/src/components/theme.ts @@ -19,5 +19,15 @@ export const theme = createTheme({ height: 40, }, }, + MuiLinearProgress: { + determinate: { + height: 6, + borderRadius: 5, + backgroundColor: 'transparent', + }, + barColorPrimary: { + backgroundColor: '#e3b82a', + }, + }, }, }) diff --git a/src/doctypes/io-cozy-permissions.ts b/src/doctypes/io-cozy-permissions.ts new file mode 100644 index 0000000000000000000000000000000000000000..0dfde431fc863a8f5aa539d7099a636fe44f566a --- /dev/null +++ b/src/doctypes/io-cozy-permissions.ts @@ -0,0 +1 @@ +export const PERMISSIONS_DOCTYPE = 'io.cozy.permissions' diff --git a/src/doctypes/remote/org.ecolyo.dju.ts b/src/doctypes/remote/org.ecolyo.dju.ts index ccc8e113b55304436422772de428c90ed6165094..8661a442abc1464c35024a307a9464c99fd80d5c 100644 --- a/src/doctypes/remote/org.ecolyo.dju.ts +++ b/src/doctypes/remote/org.ecolyo.dju.ts @@ -1 +1 @@ -export const REMOTE_ORG_ECOLYO_DJU = '/remote/org.ecolyo.dju_v2' +export const REMOTE_ORG_ECOLYO_DJU = '/remote/org.ecolyo.dju_v3' diff --git a/src/enums/dacc.enum.ts b/src/enums/dacc.enum.ts deleted file mode 100644 index 707054fda7dc96682b4dd4cf4f1dd07e02dfde20..0000000000000000000000000000000000000000 --- a/src/enums/dacc.enum.ts +++ /dev/null @@ -1,18 +0,0 @@ -export enum DaccEvent { - CONNECTION_COUNT_DAILY = 'connection-count-daily', - KONNECTOR_EVENT_DAILY = 'konnector-event-daily', - KONNECTOR_CONNECTED_PER_DAY = 'konnector-connected-daily', - NAVIGATION_COUNT_DAILY = 'navigation-count-daily', - CHALLENGE_LAUNCH_EVENT_DAILY = 'challenge-launch-daily', - CONSUMPTION_VARIATION_MONTHLY = 'consumption-variation-monthly', - SESSION_DURATION = 'session-duration', - NAVIGATION_ACTION_DAILY = 'navigation-action-daily', - EVENT_DURATION = 'event-duration', - QUIZ_STARS = 'quiz-stars', - SUMMARY_SUBSCRIPTION_MONTHLY = 'summary-subscription-monthly', - FLUID_DATA_GRANULARITY = 'fluid-data-granularity-monthly', - PARTNER_SUCCESS_MONTHLY = 'konnector-attempts-before-success', - UNINITIALIZED_KONNECTOR_ATTEMPTS_MONTHLY = 'uninitialized-konnector-attempts-monthly', - CONNECTION_COUNT_MONTHLY = 'connection-count-monthly', - PROFILE_COUNT_MONTHLY = 'profile-count', -} diff --git a/src/enums/index.ts b/src/enums/index.ts index 921ed6776e0b3113c1163fc3dd8437b8032bf144..17dc988521c2ada45d2f3bb958be03f4ddb74e80 100644 --- a/src/enums/index.ts +++ b/src/enums/index.ts @@ -1,4 +1,3 @@ -export * from './dacc.enum' export * from './dataload.enum' export * from './ecogesture.enum' export * from './ecogestureForm.enum' diff --git a/src/enums/usageEvent.enum.ts b/src/enums/usageEvent.enum.ts index 93cbd57f7a14a209f3735247d7c67a06d7096663..f8cd6f836f7ef46eccb0d1c089856f5a59df9226 100644 --- a/src/enums/usageEvent.enum.ts +++ b/src/enums/usageEvent.enum.ts @@ -1,19 +1,4 @@ export enum UsageEventType { - CONNECTION_EVENT = 'ConnectionEvent', - KONNECTOR_CONNECT_EVENT = 'KonnectorConnectEvent', - KONNECTOR_ATTEMPT_EVENT = 'KonnectorAttemptEvent', - KONNECTOR_REFRESH_EVENT = 'KonnectorRefreshEvent', - NAVIGATION_EVENT = 'NavigationEvent', - CONSUMPTION_COMPARE_EVENT = 'ConsumptionCompareEvent', - CONSUMPTION_CHANGE_TIMESTEP_EVENT = 'ConsumptionChangeTimeStepEvent', - CHALLENGE_LAUNCH_EVENT = 'ChallengeLaunchEvent', - CHALLENGE_END_EVENT = 'ChallengeEndEvent', - DUEL_LAUNCH_EVENT = 'DuelLaunchEvent', - DUEL_END_EVENT = 'DuelEndEvent', - QUIZ_END_EVENT = 'QuizEndEvent', - EXPLORATION_END_EVENT = 'ExplorationEndEvent', - ACTION_CHANGE_EVENT = 'ActionChangeEvent', - ACTION_END_EVENT = 'ActionEndEvent', PROFILE_SET_EVENT = 'ProfileSetEvent', REPORT_FROM_EMAIL = 'ReportFromEvent', } diff --git a/src/locales/fr.json b/src/locales/fr.json index fd5c627babc9088e355f1b224b7088bb951fb0b0..76f03a79a7decd59d0d64236ea70a7df2a51a76f 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -132,6 +132,7 @@ "percentage": "Part dans la facture", "price": "Soit", "maxPower": "Puissance maximum atteinte", + "offPeakHour": "Consommation en heures creuses", "showModal": "Plus d'infos" }, "elec_info_modal": { @@ -140,12 +141,14 @@ "button_close": "close-modal" }, "title1": "Qu’est-ce que la consommation minimum\u00a0?", + "text1-1": "Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.", + "text1-2": "Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).", "title2": "Qu’est-ce que la puissance maximum\u00a0?", - "text1": "Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.", - "text2": "Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).", - "text3": "C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.", - "text4": "Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. ", - "text5": "Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage." + "text2-1": "C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.", + "text2-2": "Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. ", + "text2-3": "Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.", + "title3": "Sur quelle base est calculé mon ratio Heures Pleines / Heures Creuses\u00a0?", + "text3-1": "D'après Enedis, vos plages d'heures creuses sont les suivantes : %{offPeakHours}. Nous avons donc simplement calculé, à l'aide vos consommations à la demi-heure, quelle part de votre consommation est réalisée sur vos heures creuses." }, "auth": { "enedissgegrandlyon": { @@ -160,31 +163,29 @@ "lastName": "Nom", "pdlTitle": "Numéro de votre compteur électrique (PDL)", "pdlLabel": "N° (14 chiffres)", - "pdlHint": "Où trouver le n° de PDL\u00a0?", "pdlModal": { - "txt1": "Où trouver le n° de PDL ou PRM\u00a0?", - "txt2": "Le numéro de PDL ou PRM se compose de 14 chiffres.", + "title": "Qu'est-ce qu'un PDL\u00a0?", + "title_accessibility": "Modale qu'est ce qu'un PDL\u00a0?", + "txt1": "Votre numéro de point de livraison (PDL) peut aussi s’appeler PRM si vous possédez un compteur Linky.", + "txt2": "Ce numéro est composé de 14 chiffres.", "txt3": "Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.", - "txt4": "Si vous avez un compteur Linky, appuyez sur le bouton “+†et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :" + "txt4": "Si vous avez un compteur Linky, appuyez sur le bouton “+†et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :", + "button": "J'ai compris", + "button_accessibility": "Bouton valider", + "prm_accessibility": "Écran d'un compteur Linky présentant le numéro PRM" }, "addressTitle": "Adresse du titulaire", "address": "Numéro et voie", "zipCode": "Code postal", "city": "Ville", - "headConsent": "Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.", + "headConsent": "En acceptant de partager vos données, celles-ci seront directement transférées à Ecolyo à l’intérieur de votre cloud personnel, sans que la Métropole n’y accède ni ne les visualise.", "textConsent": "Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes\u00a0: ", "consentLi1": "L'historique et le relevé de vos consommations quotidiennes en kWh", "consentLi2": "L'historique et le relevé de vos consommations au pas de temps 30 minutes", "consentLi3": "Les puissances maximales atteintes quotidiennement", "consentLi4": "Les données contractuelles (début de contrat et puissance souscrite)", "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un\u00a0an</span>", - "consentCheck2": "J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente", - "modalHint": { - "accessibility": "Titre de la modale", - "title": "Où trouver le n° de PDL\u00a0?", - "button": "J'ai compris", - "button-accessibility": "Bouton valider" - } + "consentCheck2": "J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente" }, "grdfgrandlyon": { "bill": "Munissez-vous d’une <span>facture de gaz</span> pour valider la connexion", @@ -358,9 +359,9 @@ "part1": "Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. ", "part2": "Tarifs moyens retenus :", "list1": " : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)", - "list2": " : 1 kWh = %{gasPrice} €TTC (tarif réglementé de vente au %{gasPriceStartDate} pour un consommateur soutirant moins de 6 MWh par an)", + "list2": " : 1 kWh = %{gasPrice} €TTC (Prix repère de vente de gaz publié par la Commission de Régulation de l'Energie au %{gasPriceStartDate} pour un consommateur \"Cuisson/Eau Chaude\")", "list3": " : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)", - "part3": "Le coût de votre abonnement n'est pas pris en compte dans Ecolyo." + "part3": "Le coût de votre abonnement n'est pas pris en compte dans Ecolyo pour l'électricité et le gaz." }, "release_notes_modal": { "title": "Du nouveau sur Ecolyo !", @@ -641,7 +642,7 @@ "title1": "Bienvenue !", "title1Update": "Ecolyo évolue !", "title2Update": "Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.", - "part1": "Pour le bon fonctionnement du service, nous avons besoin de l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon.", + "part1": "Nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon, ci-après nommé cloud personnel.", "part2": "Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.", "part3": "La Métropole de Lyon utilisera cet email afin de vous tenir informé·e\u00a0:", "item1": "En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.", @@ -691,21 +692,21 @@ "part3_2": "Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.", "part3_3": "Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.", "part3_4": "Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.", - "title4": "Ecolyo se trouve dans un cloud personnel Grand Lyon, qu’est-ce que cela signifie\u00a0?", - "part4_1": "Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cloud Personnel Grand Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.", + "title4": "Ecolyo se trouve dans un cloud personnel Métropole de Lyon, qu’est-ce que cela signifie\u00a0?", + "part4_1": "Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.", "part4_2": "Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">ici</a>.", "title5": "Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès\u00a0?", "part5_1": "Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là , pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement\u00a0? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.", "part5_2": "Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.", "part5_3": "Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : ", "part5_3_list1": "Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).", - "part5_3_list2": "Pour supprimer l’ensemble de vos données ainsi que votre espace personnel Grand Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.", + "part5_3_list2": "Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.", "part5_4": "Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.", "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.", "title6": "Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment\u00a0?", - "part6_1": "Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Grand Lyon.", + "part6_1": "Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon", "part6_2": "Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.", - "part6_3": "La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon. Elle utilise cet email afin de vous tenir informé·e :", + "part6_3": "La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Métropole de Lyon. Elle utilise cet email afin de vous tenir informé·e :", "part6_3_list1": "En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. ", "part6_3_list2": "En cas de problème majeur avec la gestion de votre compte.", "part6_3_list3": "De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.", @@ -715,7 +716,7 @@ "part8_1": "N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.", "part8_2": "Dernière option, contactez-nous directement à <a href=\"mailto:ecolyo@grandlyon.com\">ecolyo(at)grandlyon.com</a>.", "title9": "LEXIQUE", - "part9_1_title": "Cloud personnel Grand Lyon : ", + "part9_1_title": "Cloud personnel Métropole de Lyon : ", "part9_1_content": "Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.", "part9_2_title": "Connecteur : ", "part9_2_content": "Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau Publique du Grand Lyon.", @@ -748,7 +749,7 @@ "button_update": "Mettre à jour", "loading": "Chargement...", "wait_end_issue": "Attendre la fin de la maintenance avant de mettre à jour.", - "button_delete": "Supprimer", + "button_disconnect": "Déconnecter", "issue": "Le problème semble venir de ", "resolve": "Une mise à jour peut résoudre ce problème.", "login_failed": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", @@ -770,7 +771,7 @@ "accessibility": { "button_install": "Installer le connecteur", "button_update": "Mettre à jour votre connexion", - "button_delete": "Supprimer votre connexion" + "button_disconnect": "Déconnecter votre connecteur" } }, "konnector_options": { @@ -833,6 +834,9 @@ "button_validate": "Ok", "button_understood": "J'ai compris", "button_try_again": "Réessayer", + "button_check_info": "Vérifier les infos", + "button_go": "J'y vais", + "button_later": "Plus tard", "show_common_error": "Voir les erreurs récurrentes", "show_common_error_list": "<span>Le problème peut provenir des cas suivants :</span><ul><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span class=\"gold\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret\u00a0? Tentez sans le tiret.</li><li>Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li>Avez-vous bien entré le <span class=\"gold\">numéro de votre compteur</span> (PDL)\u00a0? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p>Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div class=\"center\">Avez-vous pensez à vérifier ces informations\u00a0?</div>", "accessibility": { @@ -963,14 +967,12 @@ }, "profile": { "report": { + "title_bilan": "Inscription à la lettre mensuelle", + "switch_label_bilan": "Recevoir mon bilan de consommation et des conseils", "title_alert": "Alerte Consommation Excessive d'Eau", - "title_bilan": "Notification par mail", - "switch_label_bilan": "Je reçois la lettre mensuelle contenant un bilan et des conseils sur ma consommation.", "switch_label_alert": "Être prévenu d’un dépassement anormal de ma consommation d’eau", "input_label_alert": "Si ma consommation d’eau quotidienne dépasse :", - "input_label_subtext_alert": "Votre consommation quotidienne maximum sur les 6 derniers mois\u00a0: ", - "activate": "Activer", - "deactivate": "Désactiver" + "input_label_subtext_alert": "Votre consommation quotidienne maximum sur les 6 derniers mois\u00a0: " }, "accessibility": { "button_toggle_mail_report": "Recevoir mon bilan mensuel par mail", @@ -1276,6 +1278,7 @@ "current": "jour actuel", "last": "jour précédent", "gather_data_subtitle": "Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\nÀ demain !", + "gather_data_failure": "Il semblerait que votre compteur ne nous permette pas d'accéder à des données de consommation plus fines.", "analysis_waiting_data": "Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A\u00a0bientôt\u00a0!" }, "accessibility": { @@ -1284,9 +1287,12 @@ } }, "unsubscribe": { - "title": "Êtes-vous sûr de ne plus vouloir recevoir notre email mensuel\u00a0?", - "content": "Dans ce cas, vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.", - "button_text": "Oui, je me désabonne", + "error": "Une erreur est survenue lors de votre désinscription, merci de ré-essayer plus tard.", + "unsubscribed": "Vous êtes désormais désabonné de la newsletter Ecolyo", + "subscribed": "Vous êtes désormais à nouveau abonné à la newsletter Ecolyo", + "content": "Vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.", + "button_subscribe": "Me ré-abonner", + "button_home": "Me connecter à Ecolyo", "button_accessibility": "Bouton de désinscription" }, "welcome_modal": { diff --git a/src/models/account.model.ts b/src/models/account.model.ts index 87b5d1ee8aed46020552ccfd97c48c2207f8517d..329d7a37703d855da6c15ecc76bfff6a508020ba 100644 --- a/src/models/account.model.ts +++ b/src/models/account.model.ts @@ -6,9 +6,10 @@ export interface Account extends AccountAttributes { _type?: string cozyMetadata?: Record<string, any> } -export interface SgeConsentData { +export interface SgeAccountData { consentId: number expirationDate: string + offPeakHours?: string } export interface AccountAttributes { @@ -18,7 +19,7 @@ export interface AccountAttributes { identifier?: string state?: string | null name?: string - data?: SgeConsentData + data?: SgeAccountData oauth_callback_results?: Record<string, any> } diff --git a/src/models/customPopup.model.ts b/src/models/customPopup.model.ts index be4016d18ddf56b0b5b0700482ee14e15edbc8c9..26243c1a9de768ee27cf79b632edaf86bc5e59a0 100644 --- a/src/models/customPopup.model.ts +++ b/src/models/customPopup.model.ts @@ -2,5 +2,6 @@ export interface CustomPopup { popupEnabled: boolean description: string title: string + image: string endDate: string } diff --git a/src/models/dju.model.ts b/src/models/dju.model.ts index b1cb16e082fa339458cd799a061f9f5e0ef40e1f..f5f43d6484755320aa4ed6411aee6cf434626dc6 100644 --- a/src/models/dju.model.ts +++ b/src/models/dju.model.ts @@ -7,8 +7,7 @@ export interface DjuResult { } interface DjuMeasure { - horodate: string - measurement: number - observation: string - unit: string + month: string + average_measurement: number + identifiant: string } diff --git a/src/models/enedisMonthlyAnalysis.ts b/src/models/enedisMonthlyAnalysis.ts index 7c0547ce604b7d60bd2963b79773ed34d3906eb0..b8d00dfb7449172178746399b9bc6fffd19fca36 100644 --- a/src/models/enedisMonthlyAnalysis.ts +++ b/src/models/enedisMonthlyAnalysis.ts @@ -7,6 +7,7 @@ export interface EnedisMonthlyAnalysisData { year: number minimumLoad: number | null maxPower: number | null + offPeakHoursRatio: number | null } export interface AggregatedEnedisMonthlyDataloads { week: Dataload[] diff --git a/src/notifications/monthlyReport.hbs b/src/notifications/monthlyReport.hbs index 29dfae79d423a3cefff2d65ce5342e5b49ae12d8..bce1313b6182d34ed9da8b18b1962314be2458ec 100644 --- a/src/notifications/monthlyReport.hbs +++ b/src/notifications/monthlyReport.hbs @@ -28,19 +28,17 @@ Bonjour {{username}}, </mj-text> {{#if comparisonExist }} - <mj-text color="white" font-weight="700" font-size="18px">Votre bilan {{currentMonth}} {{currentYear}} est prêt. Voilà l’évolution de vos consommations :</mj-text> + <mj-text color="white" font-weight="700" font-size="18px">Votre bilan {{currentMonth}} {{currentYear}} est prêt. Voilà l’évolution de vos consommations :</mj-text> {{#if yearComparisonExist }} <mj-text color="white" font-weight="400" font-size="18px"> Par rapport au mois - <span class="bold gold">{{currentMonth}} {{previousYear}}</span> - , vous avez consommé :{{{yearComparisonText}}} + <span class="bold gold">{{currentMonth}} {{previousYear}}</span>, vous avez consommé :{{{yearComparisonText}}} </mj-text> {{/if}} {{#if monthComparisonExist }} <mj-text color="white" font-weight="400" font-size="18px"> Par rapport au mois - <span class="bold gold">{{previousMonth}} {{currentYear}}</span> - , vous avez consommé :{{{monthComparisonText}}} + <span class="bold gold">{{previousMonth}} {{previousMonthYear}}</span>, vous avez consommé :{{{monthComparisonText}}} </mj-text> {{/if}} {{/if}} diff --git a/src/services/customPopup.service.ts b/src/services/customPopup.service.ts index 89f0f787dd669b7229634936dec267916dc5e1e0..32a2b0a5a9c4548dc22ea242d2fce4cb3e94f4f3 100644 --- a/src/services/customPopup.service.ts +++ b/src/services/customPopup.service.ts @@ -32,7 +32,6 @@ export default class CustomPopupService { const result: CustomPopup = await this._client .getStackClient() .fetchJSON('GET', remoteUrl) - result.description = result.description.replace(/{cozyUrl}/g, './#/') return result } catch (error) { diff --git a/src/services/enedisMonthlyAnalysisData.service.spec.ts b/src/services/enedisMonthlyAnalysisData.service.spec.ts index fd72985c39bc3781c9645494dfe27fb7d44840d8..5cad8bbbde48da15bdb1cf13135fc71817780c7c 100644 --- a/src/services/enedisMonthlyAnalysisData.service.spec.ts +++ b/src/services/enedisMonthlyAnalysisData.service.spec.ts @@ -13,17 +13,6 @@ import EnedisMonthlyAnalysisDataService from './enedisMonthlyAnalysisData.servic describe('Enedis Monthly Analysis service', () => { const emas = new EnedisMonthlyAnalysisDataService(mockClient) - it('should return all Enedis Monthly Analysis', async () => { - const mockQueryResult: QueryResult<EnedisMonthlyAnalysisData[]> = { - data: mockEnedisMonthlyAnalysisArray, - bookmark: '', - next: false, - skip: 0, - } - mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await emas.getAllEnedisMonthlyAnalysisData() - expect(result).toEqual(mockEnedisMonthlyAnalysisArray) - }) it('should return no enedis analysis', async () => { const mockQueryResult: QueryResult<EnedisMonthlyAnalysisData[]> = { data: [], diff --git a/src/services/enedisMonthlyAnalysisData.service.ts b/src/services/enedisMonthlyAnalysisData.service.ts index dcbcb3a2bc2a19b96cc38fd3cf44cad6ead1d09f..ef34a3e33c3aba8fdebc6a301bd6104864f6b34b 100644 --- a/src/services/enedisMonthlyAnalysisData.service.ts +++ b/src/services/enedisMonthlyAnalysisData.service.ts @@ -3,16 +3,27 @@ import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client' import logger from 'cozy-logger' import { ENEDIS_MAXPOWER_DOCTYPE, + ENEDIS_MINUTE_DOCTYPE, ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE, + ENEDIS_MONTH_DOCTYPE, } from 'doctypes' -import { DataloadState } from 'enums' +import { DataloadState, FluidType } from 'enums' import { DateTime } from 'luxon' -import { Dataload, MaxPowerEntity } from 'models' +import { Dataload, DataloadEntity, MaxPowerEntity } from 'models' import { AggregatedEnedisMonthlyDataloads, EnedisMonthlyAnalysisData, } from 'models/enedisMonthlyAnalysis' import logApp from 'utils/logger' +import { + OffPeakHours, + formatOffPeakHours, + parseOffPeakHours, + roundOffPeakHours, + splitOffPeakHours, +} from 'utils/utils' +import AccountService from './account.service' +import ConfigService from './fluidConfig.service' const logStack = logger.namespace('enedisMonthlyAnalysisDataService') export default class EnedisMonthlyAnalysisDataService { @@ -22,20 +33,6 @@ export default class EnedisMonthlyAnalysisDataService { this._client = _client } - /** - * Retrieve all exploration entities from db - */ - public async getAllEnedisMonthlyAnalysisData(): Promise< - EnedisMonthlyAnalysisData[] - > { - const query: QueryDefinition = Q(ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE) - const { - data: enedisMonthlyAnalysisData, - }: QueryResult<EnedisMonthlyAnalysisData[]> = - await this._client.query(query) - return enedisMonthlyAnalysisData - } - /** * getLastEnedisMonthlyAnalysis */ @@ -154,4 +151,107 @@ export default class EnedisMonthlyAnalysisDataService { return data.data } + + public async getOffPeakHours(): Promise<OffPeakHours[] | null> { + const accountService = new AccountService(this._client) + const fluidConfig = new ConfigService().getFluidConfig() + const account = await accountService.getAccountByType( + fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug + ) + if (!account?.data?.offPeakHours) return null + return parseOffPeakHours(account.data.offPeakHours) + } + + public async getOffPeakHoursRatio( + year: number, + month: number, + offPeakHours: OffPeakHours[] + ): Promise<number> { + const roundedOffPeakHours = roundOffPeakHours(offPeakHours) + const splittedOffPeakHours = splitOffPeakHours(roundedOffPeakHours) + const formattedOffPeakHours = splittedOffPeakHours + .map(split => formatOffPeakHours(split)) + .join(';') + logStack( + 'debug', + `Fetching half-hour consumption for the ranges : ${formattedOffPeakHours}` + ) + + const offPeakHoursConsumption = await this.getOffPeakHourConsumption( + splittedOffPeakHours, + year, + month + ) + + const monthQuery: QueryDefinition = Q(ENEDIS_MONTH_DOCTYPE) + .where({ year: year, month: month }) + .indexFields(['year', 'month']) + .limitBy(1) + const { data: monthDocs } = await this._client.query(monthQuery) + return offPeakHoursConsumption / monthDocs[0].load + } + + private async getOffPeakHourConsumption( + offPeakHours: OffPeakHours[], + year: number, + month: number + ) { + let minuteDocs: DataloadEntity[] = [] + + for (const range of offPeakHours) { + const { start, end } = range + const minuteQuery: QueryDefinition = Q(ENEDIS_MINUTE_DOCTYPE) + .where({ + year: year, + month: month, + $and: [ + { + $or: [ + { hour: { $gt: start.hour } }, + { + $and: [ + { hour: start.hour }, + { minute: { $gt: start.minute } }, + ], + }, + ], + }, + { + $or: [ + { hour: { $lt: end.hour } }, + { + $and: [{ hour: end.hour }, { minute: { $lte: end.minute } }], + }, + ], + }, + ], + }) + .limitBy(500) + const { data: docs }: QueryResult<DataloadEntity[]> = + await this._client.query(minuteQuery) + + minuteDocs = [...minuteDocs, ...docs] + + // if the half-hour 23H30-0H00 is required, add the 0H00-0H30 consumption because the data is shifted in DB + if (end.hour === 23 && end.minute === 59) { + const firstHalfHourQuery: QueryDefinition = Q( + ENEDIS_MINUTE_DOCTYPE + ).where({ + year: year, + month: month, + hour: 0, + minute: 0, + }) + const { data: docs }: QueryResult<DataloadEntity[]> = + await this._client.query(firstHalfHourQuery) + + minuteDocs = [...minuteDocs, ...docs] + } + } + logStack('debug', `Found ${minuteDocs.length} documents`) + const offPeakHoursConsumption = minuteDocs.reduce((sum: number, doc) => { + return sum + doc.load + }, 0) + return offPeakHoursConsumption + } } diff --git a/src/services/fluidsPrices.service.spec.ts b/src/services/fluidsPrices.service.spec.ts index a25157e4ca9c2d55fa9a3eefc442c15418e9dc30..bd7361028194e3421771feb24cb87867daaa8849 100644 --- a/src/services/fluidsPrices.service.spec.ts +++ b/src/services/fluidsPrices.service.spec.ts @@ -75,8 +75,6 @@ describe('FluidPrices service', () => { } mockClient.query.mockResolvedValueOnce(mockQueryResult) const prices = await fluidPricesService.getAllLastPrices() - console.log('Prix reçus :', prices) - console.log('Prix attendus :', allLastFluidPrices) expect(prices).toStrictEqual(allLastFluidPrices) expect(mockClient.query).toHaveBeenCalled() }) diff --git a/src/services/permissions.service.ts b/src/services/permissions.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a16f3f371e597a7a496c27ae0cc7adf1b863662c --- /dev/null +++ b/src/services/permissions.service.ts @@ -0,0 +1,55 @@ +import * as Sentry from '@sentry/react' +import { Client, QueryResult } from 'cozy-client' +import logger from 'cozy-logger' +import { PERMISSIONS_DOCTYPE } from 'doctypes/io-cozy-permissions' + +const logStack = logger.namespace('challengeService') + +type PermissionsResponse = { + attributes: { + type: string + source_id: string + codes: { + code: string + } + shortcodes: { + code: string + } + cozyMetadata: Record<string, unknown> + } +} + +export class PermissionsService { + private readonly client: Client + + constructor(client: Client) { + this.client = client + } + + public async getShareCode(): Promise<unknown> { + try { + const TTL = '15D' + const { data }: QueryResult<PermissionsResponse> = await this.client.save( + { + _type: PERMISSIONS_DOCTYPE, + permissions: { + images: { + type: 'com.grandlyon.ecolyo.profile', + verbs: ['PUT', 'GET'], + }, + }, + ttl: TTL, + } + ) + + return data.attributes.codes.code + } catch (error) { + const errorMessage = `Failed to create shareCode: ${JSON.stringify( + error + )}` + logStack('error', errorMessage) + Sentry.captureException(error) + throw error + } + } +} diff --git a/src/services/profileType.service.spec.ts b/src/services/profileType.service.spec.ts index 73909c5b355fc60f7ae44c7503bf1aae16345228..3c52e9a655addf1f419ac934f4a33e1436802060 100644 --- a/src/services/profileType.service.spec.ts +++ b/src/services/profileType.service.spec.ts @@ -1,3 +1,5 @@ +/* eslint-disable camelcase */ +import heatingData from 'constants/consumptionConstants/heating.json' import { Floor, HotWaterEquipment, @@ -9,6 +11,7 @@ import { WarmingType, } from 'enums' import { DateTime } from 'luxon' +import { DjuResult } from 'models' import { ProfileType } from 'models/profileType.model' import mockClient from 'tests/__mocks__/client.mock' import { @@ -68,147 +71,158 @@ describe('ProfileType service', () => { const monthConsumption = await profileTypeService.calculateWarmingMonthConsumption( mockCorrectedConsumption, + 2023, 3 ) expect(monthConsumption).toEqual(mockMonthConsumption) }) + }) + + describe('getMonthHeating', () => { it('should get the heating consumption', async () => { - const monthConsumption = await profileTypeService.getMonthHeating(3) + const monthConsumption = await profileTypeService.getMonthHeating(2023, 3) expect(monthConsumption).toEqual(mockMonthConsumption) }) - }) - describe('should get the heating consumption for a flat with collective heating', () => { - const _profileTypeService = new ProfileTypeService( - mockProfileType1, - mockClient, - DateTime.now().year - ) - it('should get the heating consumption', async () => { - const monthConsumption = await _profileTypeService.getMonthHeating(2) + it('should get the heating consumption for a flat with collective heating', async () => { + const profileTypeService1 = new ProfileTypeService( + mockProfileType1, + mockClient, + DateTime.now().year + ) + const monthConsumption = await profileTypeService1.getMonthHeating( + 2023, + 2 + ) expect(monthConsumption).toEqual(mockMonthConsumption1) }) - }) - describe('should get the heating consumption for a house with individual heating, facilities, installation and individual work', () => { - const _profileTypeService = new ProfileTypeService( - mockProfileType2, - mockClient, - DateTime.now().year - ) - it('should get the heating consumption', async () => { - const monthConsumption = await _profileTypeService.getMonthHeating(1) + it('should get the heating consumption for a house with individual heating, facilities, installation and individual work', async () => { + const profileTypeService2 = new ProfileTypeService( + mockProfileType2, + mockClient, + DateTime.now().year + ) + const monthConsumption = await profileTypeService2.getMonthHeating( + 2023, + 1 + ) expect(monthConsumption).toEqual(mockMonthConsumption2) }) }) + describe('calculateMonthWaterRawNeeds', () => { it('should calculate the water raw needs consumption by month', () => { - const waterRawNeeds = profileTypeService.calculateMonthWaterRawNeeds( - mockProfileType, - 1 - ) + const waterRawNeeds = profileTypeService.calculateMonthWaterRawNeeds(1) expect(waterRawNeeds).toEqual(mockWaterRawNeeds) }) + }) + describe('calculateSpreadNeeds', () => { it('should calculate the water spread needs Consumption', () => { - const waterSpreadNeeds = profileTypeService.calculateSpreadNeeds( - mockProfileType, - 1 - ) + const waterSpreadNeeds = profileTypeService.calculateSpreadNeeds(1) expect(waterSpreadNeeds).toEqual(mockWaterSpreadNeeds) }) + }) + + describe('calculateTotalConsumption', () => { it('should calculate the total ecs consumption by month if profileType.hotWaterEquipment === "solar"', () => { - const monthEcsConsumption = profileTypeService.calculateTotalConsumption( - mockWaterSpreadNeeds, + const profileTypeService1 = new ProfileTypeService( mockProfileType1, + mockClient, + DateTime.now().year + ) + const monthEcsConsumption = profileTypeService1.calculateTotalConsumption( + mockWaterSpreadNeeds, 1 ) expect(monthEcsConsumption).toEqual(mockMonthEcsConsumption1Solar) }) it('should calculate the total ecs consumption by month if profileType.hotWaterEquipment === "other"', () => { - const mockProfileTypeWithOther = { ...mockProfileType } - mockProfileTypeWithOther.hotWaterEquipment = HotWaterEquipment.OTHER - const monthEcsConsumption = profileTypeService.calculateTotalConsumption( - mockWaterSpreadNeeds, + const mockProfileTypeWithOther: ProfileType = { + ...mockProfileType, + hotWaterEquipment: HotWaterEquipment.OTHER, + } + const profileTypeServiceOther = new ProfileTypeService( mockProfileTypeWithOther, - 1 + mockClient, + DateTime.now().year ) + const monthEcsConsumption = + profileTypeServiceOther.calculateTotalConsumption( + mockWaterSpreadNeeds, + 1 + ) expect(monthEcsConsumption).toEqual(mockMonthEcsConsumptionOther) }) + }) + + describe('getMonthEcs', () => { it('should get the ECS consumption if profileType.hotWaterEquipment === "thermodynamic"', () => { - const mockProfileTypeWithOther = { ...mockProfileType } - mockProfileTypeWithOther.hotWaterEquipment = - HotWaterEquipment.THERMODYNAMIC const monthConsumption = profileTypeService.getMonthEcs(1) expect(monthConsumption).toEqual(mockMonthEcsConsumptionThermo) }) + }) - describe('should get the month cooking consumption', () => { - it('should get the month cooking consumption', () => { - const _profileTypeService = new ProfileTypeService( - mockProfileType, - mockClient, - DateTime.now().year - ) - - const monthCookingConsumption = - _profileTypeService.getMonthCookingConsumption(1) - expect(monthCookingConsumption).toEqual(mockMonthCookingConsumption) - }) + describe('getMonthCookingConsumption', () => { + it('should get the month cooking consumption', () => { + const monthCookingConsumption = + profileTypeService.getMonthCookingConsumption(1) + expect(monthCookingConsumption).toEqual(mockMonthCookingConsumption) }) - describe('should get the month electric specific consumption', () => { - it('should get the electric specific consumption', () => { - const _profileTypeService = new ProfileTypeService( - mockProfileType, - mockClient, - DateTime.now().year - ) + }) - const monthElectricSpecificConsumption = - _profileTypeService.getMonthElectricSpecificConsumption(1) - expect(monthElectricSpecificConsumption).toEqual( - mockMonthElectricSpecificConsumption - ) - }) + describe('getMonthElectricSpecificConsumption', () => { + it('should get the electric specific consumption', () => { + const monthElectricSpecificConsumption = + profileTypeService.getMonthElectricSpecificConsumption(1) + expect(monthElectricSpecificConsumption).toEqual( + mockMonthElectricSpecificConsumption + ) }) - describe('should get the month cold water consumption', () => { - it('should get the cold water consumption', () => { - const _profileTypeService = new ProfileTypeService( - mockProfileType, - mockClient, - DateTime.now().year - ) - const monthColdWaterConsumption = - _profileTypeService.getMonthColdWaterConsumption(1) - expect(monthColdWaterConsumption).toEqual(mockMonthColdWaterConsumption) - }) + }) + + describe('getMonthColdWaterConsumption', () => { + it('should get the cold water consumption', () => { + const monthColdWaterConsumption = + profileTypeService.getMonthColdWaterConsumption(1) + expect(monthColdWaterConsumption).toEqual(mockMonthColdWaterConsumption) }) }) - describe('should get the monthly Forecast', () => { - // For month of January - const profileTypeService1 = new ProfileTypeService( - mockTestProfile1, - mockClient, - DateTime.now().year - ) + + describe('getMonthlyForecast for January', () => { it('should get the monthly forecast for test profile 1', async () => { - const monthlyForecast = await profileTypeService1.getMonthlyForecast(1) + const profileTypeService1 = new ProfileTypeService( + mockTestProfile1, + mockClient, + DateTime.now().year + ) + const monthlyForecast = await profileTypeService1.getMonthlyForecast( + 2023, + 1 + ) expect(monthlyForecast).toEqual(mockMonthlyForecastJanuaryTestProfile1) }) - const profileTypeService2 = new ProfileTypeService( - mockTestProfile2, - mockClient, - DateTime.now().year - ) it('should get the monthly forecast for test profile 2', async () => { - const monthlyForecast = await profileTypeService2.getMonthlyForecast(1) + const profileTypeService2 = new ProfileTypeService( + mockTestProfile2, + mockClient, + DateTime.now().year + ) + const monthlyForecast = await profileTypeService2.getMonthlyForecast( + 2023, + 1 + ) expect(monthlyForecast).toEqual(mockMonthlyForecastJanuaryTestProfile2) }) - const profileTypeService3 = new ProfileTypeService( - mockTestProfile3, - mockClient, - DateTime.now().year - ) it('should get the monthly forecast for test profile 3', async () => { - const monthlyForecast = await profileTypeService3.getMonthlyForecast(1) + const profileTypeService3 = new ProfileTypeService( + mockTestProfile3, + mockClient, + DateTime.now().year + ) + const monthlyForecast = await profileTypeService3.getMonthlyForecast( + 2023, + 1 + ) expect(monthlyForecast).toEqual(mockMonthlyForecastJanuaryTestProfile3) }) it('should get the monthly forecast for test profile 1 with wall and roof and window insulation', async () => { @@ -222,12 +236,15 @@ describe('ProfileType service', () => { hasInstalledVentilation: ThreeChoicesAnswer.YES, hasReplacedHeater: ThreeChoicesAnswer.YES, } - const _profileTypeService = new ProfileTypeService( + const serviceThreeInsulation = new ProfileTypeService( mockProfileWithThreeInsulation, mockClient, DateTime.now().year ) - const monthlyForecast = await _profileTypeService.getMonthlyForecast(1) + const monthlyForecast = await serviceThreeInsulation.getMonthlyForecast( + 2023, + 1 + ) expect(monthlyForecast).toEqual( mockMonthlyForecastJanuaryTest1WithFullArrays ) @@ -239,7 +256,10 @@ describe('ProfileType service', () => { mockClient, DateTime.now().year ) - const monthlyForecast = await profileTypeService2.getMonthlyForecast(1) + const monthlyForecast = await profileTypeService2.getMonthlyForecast( + 2023, + 1 + ) expect( monthlyForecast.fluidForecast[0].detailsMonthlyForecast .heatingConsumption @@ -254,6 +274,7 @@ describe('ProfileType service', () => { ).toEqual(null) }) }) + describe('getNextFormStep', () => { it('should get the next step in function of the current step', () => { let nextStep = profileTypeFormService.getNextFormStep( @@ -346,6 +367,7 @@ describe('ProfileType service', () => { expect(nextStep).toEqual(ProfileTypeStepForm.HOUSING_TYPE) }) }) + describe('getPreviousFormStep', () => { it('should get the previous step in function of the current step', () => { let previousStep = profileTypeFormService.getPreviousFormStep( @@ -409,6 +431,7 @@ describe('ProfileType service', () => { expect(previousStep).toEqual(ProfileTypeStepForm.HOUSING_TYPE) }) }) + describe('getAnswerForStep', () => { it('should get the good answers in function of the current step', () => { let answers = ProfileTypeFormService.getAnswerForStep( @@ -479,6 +502,7 @@ describe('ProfileType service', () => { expect(answers).toEqual(mockProfileTypeAnswers[16]) }) }) + describe('checkConsistency', () => { it('should return consistent profile for individual house', () => { const mockProfile = { @@ -521,10 +545,44 @@ describe('ProfileType service', () => { expect(result).toEqual(expectedResult) }) }) - describe('getDjU', () => { - it('should return default dju', async () => { - const result = await profileTypeService.fetchDJU(2) - expect(result).toEqual(363) + + describe('fetchDJU', () => { + it('should return dju from remote doctype if it returns a value', async () => { + const mockDjuResult: DjuResult = { + fields: [], + layer_name: '', + nb_result: 1, + table_href: '', + values: [ + { + month: '2024-01', + average_measurement: 10.5, + identifiant: '69029001', + }, + ], + } + mockClient.getStackClient().fetchJSON.mockResolvedValueOnce(mockDjuResult) + const result = await profileTypeService.fetchDJU(2023, 2) + expect(result).toEqual(mockDjuResult.values[0].average_measurement) + }) + it('should return default dju if remote doctype returns no value', async () => { + const mockDjuResult: DjuResult = { + fields: [], + layer_name: '', + nb_result: 0, + table_href: '', + values: [], + } + mockClient.getStackClient().fetchJSON.mockResolvedValueOnce(mockDjuResult) + const result = await profileTypeService.fetchDJU(2023, 2) + expect(result).toEqual(heatingData.dju_average_by_month[1]) + }) + it('should return default dju if remote doctype returns an error', async () => { + mockClient + .getStackClient() + .fetchJSON.mockRejectedValueOnce('Error during fetching DJU') + const result = await profileTypeService.fetchDJU(2023, 2) + expect(result).toEqual(heatingData.dju_average_by_month[1]) }) }) }) diff --git a/src/services/profileType.service.ts b/src/services/profileType.service.ts index 4f75e33ae964e472df96119dd8d920dc84bc78cc..814a340ed146f2527c8dad96544b56c2742961f0 100644 --- a/src/services/profileType.service.ts +++ b/src/services/profileType.service.ts @@ -15,7 +15,6 @@ import { HousingType, IndividualInsulationWork, IndividualOrCollective, - OutsideFacingWalls, ThreeChoicesAnswer, } from 'enums' import { DateTime } from 'luxon' @@ -27,6 +26,7 @@ import { ProfileType, } from 'models' import logApp from 'utils/logger' +import { formatTwoDigits } from 'utils/utils' import ConverterService from './converter.service' const logStack = logger.namespace('profileTypeService') @@ -49,18 +49,15 @@ export default class ProfileTypeService { } /** - * calculateWarmingEstimatedConsumption * @returns {number} Estimated consumption */ public calculateWarmingEstimatedConsumption(): number { const ratiosHeating = heatingData.heating_ratio - const housingType: HousingType = this.profileType.housingType - const constructionYear: ConstructionYear = this.profileType.constructionYear + const { area, constructionYear, housingType } = this.profileType const ratiosHeatingByHousingType = ratiosHeating[housingType] - const currentRatio: number = ratiosHeatingByHousingType[constructionYear] - const estimatedConsumption: number = - parseInt(this.profileType.area) * currentRatio + const currentRatio = ratiosHeatingByHousingType[constructionYear] + const estimatedConsumption = parseInt(area) * currentRatio return estimatedConsumption } @@ -71,31 +68,26 @@ export default class ProfileTypeService { public calculateWarmingCorrectedConsumption( estimatedConsumption: number ): number { - const outsideFacingWalls: OutsideFacingWalls = - this.profileType.outsideFacingWalls - const housingType: HousingType = this.profileType.housingType - const floor: Floor = this.profileType.floor - const constructionYear: ConstructionYear = this.profileType.constructionYear - const individualInsulationWork: IndividualInsulationWork[] = - this.profileType.individualInsulationWork - const hasInstalledVentilation: ThreeChoicesAnswer = - this.profileType.hasInstalledVentilation - const hasReplacedHeater: ThreeChoicesAnswer = - this.profileType.hasReplacedHeater - const heating = this.profileType.heating + const { + constructionYear, + floor, + hasInstalledVentilation, + hasReplacedHeater, + heating, + housingType, + individualInsulationWork, + outsideFacingWalls, + } = this.profileType - // Apply corrections + let correctionInsulation: number + let correctionFacilities: number const correctionsNbWalls = heatingData.adjustment_outside_facing_walls[housingType] const correctionWalls: number = correctionsNbWalls[outsideFacingWalls] - - let correctionFloor: number - let correctionInsulation: number - let correctionFacilities: number - - if (this.profileType.housingType === HousingType.APARTMENT) { - correctionFloor = heatingData.adjustment_floor.apartment[floor] - } else correctionFloor = 0 + const correctionFloor = + housingType === HousingType.APARTMENT + ? heatingData.adjustment_floor.apartment[floor] + : 0 if ( !individualInsulationWork.includes(IndividualInsulationWork.NONE) && @@ -181,29 +173,30 @@ export default class ProfileTypeService { } /** - * calculateWarmingMonthConsumption - @returns {number} monthConsumption + * @returns {number} monthConsumption */ public async calculateWarmingMonthConsumption( correctedConsumption: number, + year: number, month: number ): Promise<number> { - const djuCurrentMonth = await this.fetchDJU(month) + const djuCurrentMonth = await this.fetchDJU(year, month) const monthConsumption = (correctedConsumption / heatingData.dju_annual) * djuCurrentMonth return Math.round(monthConsumption) } + /** - * getMonthHeating * @returns {number} Month heating consumption in kw/h */ - public async getMonthHeating(month: number): Promise<number> { + public async getMonthHeating(year: number, month: number): Promise<number> { const estimatedConsumption = this.calculateWarmingEstimatedConsumption() const correctedConsumption = this.calculateWarmingCorrectedConsumption(estimatedConsumption) const monthConsumption = await this.calculateWarmingMonthConsumption( correctedConsumption, + year, month ) return monthConsumption @@ -213,31 +206,28 @@ export default class ProfileTypeService { * Calculate water raw needs by month * @returns {number} rawConsumption */ - public calculateMonthWaterRawNeeds( - profileType: ProfileType, - month: number - ): number { - const waterNeedsIndex: number = EcsData.ecs_ratio.findIndex( - ratio => ratio.occupants_number === profileType.occupantsNumber + public calculateMonthWaterRawNeeds(month: number): number { + const waterNeedsIndex = EcsData.ecs_ratio.findIndex( + ratio => ratio.occupants_number === this.profileType.occupantsNumber ) - const waterNeeds: number = + const waterNeeds = EcsData.ecs_ratio[waterNeedsIndex].warm_water_need_in_liter - const nbDaysInMonth: number = DateTime.fromObject({ + const nbDaysInMonth = DateTime.fromObject({ month: month, }).setZone('utc', { keepLocalTime: true, }).daysInMonth - const rawConsumption: number = waterNeeds * nbDaysInMonth + const rawConsumption = waterNeeds * nbDaysInMonth return rawConsumption } /** * Calculate spread water needs by month * @returns {number} spreadConsumption */ - public calculateSpreadNeeds(profileType: ProfileType, month: number): number { + public calculateSpreadNeeds(month: number): number { const rawNeeds: number[] = [] for (let index = 1; index < 13; index++) { - rawNeeds.push(this.calculateMonthWaterRawNeeds(profileType, index)) + rawNeeds.push(this.calculateMonthWaterRawNeeds(index)) } const calculateTotalNeeds = ( accumulator: number, @@ -254,24 +244,21 @@ export default class ProfileTypeService { */ public calculateTotalConsumption( spreadConsumption: number, - profileType: ProfileType, month: number ): number { - const coldWaterTemperature: number = - EcsData.cold_water_temperature[month - 1] - const efficiencyProduction: number = - EcsData.efficiency_production_distribution[profileType.housingType] - const solarCoverage: number = EcsData.solar_coverage[month - 1] - const ecsConsumption: number = + const { housingType, hotWaterEquipment } = this.profileType + const coldWaterTemperature = EcsData.cold_water_temperature[month - 1] + const efficiencyProduction = + EcsData.efficiency_production_distribution[housingType] + const solarCoverage = EcsData.solar_coverage[month - 1] + const ecsConsumption = (((EcsData.coefficient_ecs_consumption * spreadConsumption) / 1000) * (EcsData.hot_water_temperature - coldWaterTemperature)) / efficiencyProduction let monthEcsConsumption: number - if (profileType.hotWaterEquipment === HotWaterEquipment.SOLAR) { + if (hotWaterEquipment === HotWaterEquipment.SOLAR) { monthEcsConsumption = ecsConsumption * (1 - solarCoverage) - } else if ( - profileType.hotWaterEquipment === HotWaterEquipment.THERMODYNAMIC - ) { + } else if (hotWaterEquipment === HotWaterEquipment.THERMODYNAMIC) { monthEcsConsumption = ecsConsumption / EcsData.coefficient_thermodynamic } else { monthEcsConsumption = ecsConsumption @@ -283,13 +270,9 @@ export default class ProfileTypeService { * @returns {number} monthEcsConsumption */ public getMonthEcs(month: number) { - const spreadConsumption: number = this.calculateSpreadNeeds( - this.profileType, - month - ) - const monthEcsConsumption: number = this.calculateTotalConsumption( + const spreadConsumption = this.calculateSpreadNeeds(month) + const monthEcsConsumption = this.calculateTotalConsumption( spreadConsumption, - this.profileType, month ) return monthEcsConsumption @@ -302,12 +285,12 @@ export default class ProfileTypeService { const annualCookingConsumption: number = this.profileType.occupantsNumber * cookingData.ratio_kw_per_person_per_year - const nbDaysInMonth: number = DateTime.fromObject({ + const nbDaysInMonth = DateTime.fromObject({ month: month, }).setZone('utc', { keepLocalTime: true, }).daysInMonth - const monthCookingConsumption: number = + const monthCookingConsumption = (annualCookingConsumption / 365) * nbDaysInMonth return Math.round(monthCookingConsumption) } @@ -320,12 +303,12 @@ export default class ProfileTypeService { elecSpeData[this.profileType.housingType][ this.profileType.constructionYear ] - const nbDaysInMonth: number = DateTime.fromObject({ + const nbDaysInMonth = DateTime.fromObject({ month: month, }).setZone('utc', { keepLocalTime: true, }).daysInMonth - const monthElectricSpecificConsumption: number = + const monthElectricSpecificConsumption = (annualElectricSpecificConsumption / 365) * nbDaysInMonth return Math.round(monthElectricSpecificConsumption) } @@ -340,12 +323,12 @@ export default class ProfileTypeService { ) const coldWaterNeeds: number = coldWaterData[occupantsNumberIndex].consumption_in_liter_per_day - const nbDaysInMonth: number = DateTime.fromObject({ + const nbDaysInMonth = DateTime.fromObject({ month: month, }).setZone('utc', { keepLocalTime: true, }).daysInMonth - const monthColdWaterConsumption: number = nbDaysInMonth * coldWaterNeeds + const monthColdWaterConsumption = nbDaysInMonth * coldWaterNeeds return Math.round(monthColdWaterConsumption) } /** @@ -354,11 +337,10 @@ export default class ProfileTypeService { */ public async getDetailsMonthlyForecast( fluidType: FluidType, + year: number, month: number ): Promise<DetailsMonthlyForecast> { - const warmingFluid = this.profileType.warmingFluid - const hotWaterFluid = this.profileType.hotWaterFluid - const cookingFluid = this.profileType.cookingFluid + const { cookingFluid, hotWaterFluid, warmingFluid } = this.profileType const detailsMonthlyForecast: DetailsMonthlyForecast = { heatingConsumption: null, @@ -373,8 +355,10 @@ export default class ProfileTypeService { warmingFluid !== null && (fluidType as number) === (warmingFluid as number) ) { - detailsMonthlyForecast.heatingConsumption = - await this.getMonthHeating(month) + detailsMonthlyForecast.heatingConsumption = await this.getMonthHeating( + year, + month + ) } if ( hotWaterFluid !== null && @@ -401,10 +385,14 @@ export default class ProfileTypeService { public async getFluidForecast( fluidType: FluidType, + year: number, month: number ): Promise<FluidForecast> { - const detailsMonthlyForecast: DetailsMonthlyForecast = - await this.getDetailsMonthlyForecast(fluidType, month) + const detailsMonthlyForecast = await this.getDetailsMonthlyForecast( + fluidType, + year, + month + ) let fluidLoad = 0 Object.values(detailsMonthlyForecast).forEach(load => { @@ -429,19 +417,21 @@ export default class ProfileTypeService { * getMonthlyForecast * @returns {Promise<MonthlyForecast>} MonthlyForecast */ - public async getMonthlyForecast(month: number): Promise<MonthlyForecast> { - const elecForecast: FluidForecast = await this.getFluidForecast( + public async getMonthlyForecast( + year: number, + month: number + ): Promise<MonthlyForecast> { + const elecForecast = await this.getFluidForecast( FluidType.ELECTRICITY, + year, month ) - const waterForecast: FluidForecast = await this.getFluidForecast( + const waterForecast = await this.getFluidForecast( FluidType.WATER, + year, month ) - const gasForecast: FluidForecast = await this.getFluidForecast( - FluidType.GAS, - month - ) + const gasForecast = await this.getFluidForecast(FluidType.GAS, year, month) const monthlyForecast = { month: month, @@ -455,44 +445,16 @@ export default class ProfileTypeService { * Try to fetch dju from remote doctype, if no data or error, return default data * @returns {Promise<number>} monthDju */ - public fetchDJU = async (month: number): Promise<number> => { - const startDate: string = DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .set({ year: this.year }) - .set({ month: month }) - .startOf('month') - .toISO() - const endDate: string = DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .set({ year: this.year }) - .set({ month: month }) - .endOf('month') - .toISO() + public fetchDJU = async (year: number, month: number): Promise<number> => { + const djuDate = `${year}-${formatTwoDigits(month)}` try { const result: DjuResult = await this._client .getStackClient() - .fetchJSON( - 'GET', - `${REMOTE_ORG_ECOLYO_DJU}?startDate=${startDate}&endDate=${endDate}` - ) - let monthDju = 0 - - if (result) { - const degreeDayObservations = result.values.filter( - value => value.observation === 'degreeDay' - ) - for (const observation of degreeDayObservations) { - monthDju += observation.measurement - } - } - if (monthDju === 0) { - return heatingData.dju_average_by_month[month - 1] + .fetchJSON('GET', `${REMOTE_ORG_ECOLYO_DJU}?month=${djuDate}`) + if (result && result.nb_result !== 0) { + return result.values[0].average_measurement } else { - return monthDju + return heatingData.dju_average_by_month[month - 1] } } catch (error) { const errorMessage = `fetchDju error : ${JSON.stringify(error)}` diff --git a/src/services/usageEvent.service.spec.ts b/src/services/usageEvent.service.spec.ts index 237f7c74dff74ee0799075260c8df7008e61ee81..6eb49c7b2c8699c807f927a0c05464f025c3fa27 100644 --- a/src/services/usageEvent.service.spec.ts +++ b/src/services/usageEvent.service.spec.ts @@ -6,10 +6,8 @@ import mockClient from 'tests/__mocks__/client.mock' import { getError } from 'tests/__mocks__/testUtils' import { allUsageEventsData, - connectionAttemptEGLError, - connectionAttemptEGLSuccess, - connectionEventEntitiesData, - connectionUsageEventsData, + profileSetEventEntitiesData, + profileSetUsageEventsData, usageEventData, usageEventEntityData, } from 'tests/__mocks__/usageEventsData.mock' @@ -74,24 +72,24 @@ describe('UsageEvent service', () => { }) }) describe('getEvents method', () => { - it('should return all Connection events', async () => { + it('should return all ProfileSet events', async () => { const mockQueryResult: QueryResult<UsageEventEntity[]> = { - data: connectionEventEntitiesData, + data: profileSetEventEntitiesData, bookmark: '', next: false, skip: 0, } mockClient.query.mockResolvedValueOnce(mockQueryResult) const result = await UsageEventService.getEvents(mockClient, { - type: UsageEventType.CONNECTION_EVENT, + type: UsageEventType.PROFILE_SET_EVENT, }) - expect(result).toEqual(connectionUsageEventsData) + expect(result).toEqual(profileSetUsageEventsData) }) }) describe('addEventIfDoesntExist method', () => { it('should not add event', async () => { const mockQueryResult: QueryResult<UsageEventEntity[]> = { - data: connectionEventEntitiesData, + data: profileSetEventEntitiesData, bookmark: '', next: false, skip: 0, @@ -99,7 +97,7 @@ describe('UsageEvent service', () => { mockClient.query.mockResolvedValueOnce(mockQueryResult) const result = await UsageEventService.addEventIfDoesntExist( mockClient, - { type: UsageEventType.CONNECTION_EVENT }, + { type: UsageEventType.PROFILE_SET_EVENT }, { id: { $gt: 0 } } ) expect(result).toEqual(null) @@ -121,61 +119,10 @@ describe('UsageEvent service', () => { mockClient.create.mockResolvedValueOnce(mockQueryResult2) const result = await UsageEventService.addEventIfDoesntExist( mockClient, - { type: UsageEventType.CONNECTION_EVENT }, + { type: UsageEventType.PROFILE_SET_EVENT }, { id: { $gt: 0 } } ) expect(result).toEqual(usageEventData) }) }) - describe('updateConnectionAttemptEvent method', () => { - it('should update the last attempt to true', async () => { - const mockQueryResult: QueryResult<UsageEventEntity[]> = { - data: [connectionAttemptEGLError], - bookmark: '', - next: false, - skip: 0, - } - const mockQueryResult2: QueryResult<UsageEventEntity> = { - data: connectionAttemptEGLSuccess, - bookmark: '', - next: false, - skip: 0, - } - mockClient.query.mockResolvedValueOnce(mockQueryResult) - mockClient.save.mockResolvedValueOnce(mockQueryResult2) - const result = await UsageEventService.updateConnectionAttemptEvent( - mockClient, - 'eglgrandlyon' - ) - expect(result).toEqual(connectionAttemptEGLSuccess) - }) - it('should fail to update the attempts', async () => { - const mockQueryResult: QueryResult<UsageEventEntity[] | undefined> = { - data: undefined, - bookmark: '', - next: false, - skip: 0, - } - mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await UsageEventService.updateConnectionAttemptEvent( - mockClient, - 'eglgrandlyon' - ) - expect(result).toEqual(undefined) - }) - it('should find no attempt', async () => { - const mockQueryResult: QueryResult<UsageEventEntity[] | undefined> = { - data: [], - bookmark: '', - next: false, - skip: 0, - } - mockClient.query.mockResolvedValueOnce(mockQueryResult) - const result = await UsageEventService.updateConnectionAttemptEvent( - mockClient, - 'eglgrandlyon' - ) - expect(result).toEqual(undefined) - }) - }) }) diff --git a/src/services/usageEvent.service.ts b/src/services/usageEvent.service.ts index cc362ee26dbc8fdde3df3ed4e5abd36dffae94dc..5f971c83c9f93048118d01adc3ce1370fdd084a6 100644 --- a/src/services/usageEvent.service.ts +++ b/src/services/usageEvent.service.ts @@ -8,7 +8,6 @@ import { } from 'cozy-client' import logger from 'cozy-logger' import { USAGEEVENT_DOCTYPE } from 'doctypes' -import { UsageEventType } from 'enums' import { DateTime } from 'luxon' import { AddEventParams, @@ -60,44 +59,6 @@ export default class UsageEventService { return null } - static async updateConnectionAttemptEvent( - client: Client, - konnectorSlug: string - ): Promise<UsageEventEntity | undefined> { - try { - // Get last Connection attempt Event - const query: QueryDefinition = Q(USAGEEVENT_DOCTYPE) - .where({ - target: konnectorSlug, - }) - .partialIndex({ - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - result: 'error', - }) - .indexFields(['eventDate', 'type']) - .sortBy([{ eventDate: 'desc' }]) - .limitBy(1) - const { - data: [usageEventEntity], - }: QueryResult<UsageEventEntity[]> = await client.query(query) - if (usageEventEntity) { - const updatedEvent: UsageEventEntity = { - ...usageEventEntity, - result: 'success', - } - const { data: savedEvent } = await client.save(updatedEvent) - return savedEvent - } - } catch (error) { - const errorMessage = `UsageEvent service error on updateConnectionAttemptEvent: ${JSON.stringify( - error - )}` - logStack('error', errorMessage) - logApp.error(errorMessage) - Sentry.captureException(error) - } - } - /** * @returns {Promise<boolean>} return true if all events are updated */ diff --git a/src/store/modal/modal.slice.ts b/src/store/modal/modal.slice.ts index c65edeeca335afd67272d43e1cc2fa14b99caa76..7efe8c5a3c5d0e1e97b42f384428149ddf2664d2 100644 --- a/src/store/modal/modal.slice.ts +++ b/src/store/modal/modal.slice.ts @@ -5,6 +5,7 @@ const initialState: ModalState = { customPopupModal: { popupEnabled: false, title: '', + image: '', description: '', endDate: '', }, diff --git a/src/targets/browser/index.tsx b/src/targets/browser/index.tsx index 353a7bffaa17059c25cf619ee6edfb78747d4ad6..9e9cde5363be93509e43daa58fc5576d2d344c6a 100644 --- a/src/targets/browser/index.tsx +++ b/src/targets/browser/index.tsx @@ -13,10 +13,10 @@ import { handleOAuthResponse } from 'cozy-harvest-lib/dist/helpers/oauth' import { WebviewIntentProvider } from 'cozy-intent' import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n' import schema from 'doctypes' -import { History, createHashHistory } from 'history' +import { createHashHistory } from 'history' import { memoize } from 'lodash' import React from 'react' -import { render } from 'react-dom' +import { createRoot } from 'react-dom/client' import { Provider } from 'react-redux' import { HashRouter } from 'react-router-dom' import EnvironmentService from 'services/environment.service' @@ -28,17 +28,14 @@ import manifest from '../../../manifest.webapp' import '../../styles/index.scss' const setupApp = memoize(() => { - const history: History = createHashHistory() - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const root: any = document.querySelector('[role=application]') - const data = JSON.parse(root.dataset.cozy) + const history = createHashHistory() + const container: any = document.querySelector('[role=application]') + const data = JSON.parse(container.dataset.cozy) const protocol = window.location.protocol const cozyUrl = `${protocol}//${data.domain}` const locale = 'fr' - const polyglot: any = initTranslation(locale, lang => - require(`locales/${lang}`) - ) + const polyglot = initTranslation(locale, lang => require(`locales/${lang}`)) const client: Client = new CozyClient({ uri: cozyUrl, @@ -95,15 +92,18 @@ const setupApp = memoize(() => { // cast because init is somehow missing dsn property } as Sentry.BrowserOptions) - return { root, store, client, locale, polyglot, history, tracker } + return { container, store, client, locale, polyglot, history, tracker } }) const init = () => { - const { root, store, client, locale, polyglot, history, tracker } = setupApp() + const { container, store, client, locale, polyglot, history, tracker } = + setupApp() + const root = createRoot(container) if (handleOAuthResponse()) return const App = require('components/App').default - render( + + root.render( <WebviewIntentProvider setBarContext={cozyBar.setWebviewContext}> <Provider store={store}> <CozyProvider client={client}> @@ -114,8 +114,7 @@ const init = () => { </I18n> </CozyProvider> </Provider> - </WebviewIntentProvider>, - root + </WebviewIntentProvider> ) } diff --git a/src/targets/public/index.ejs b/src/targets/public/index.ejs new file mode 100644 index 0000000000000000000000000000000000000000..6a02d8eded146705720414f370c649dc892cb194 --- /dev/null +++ b/src/targets/public/index.ejs @@ -0,0 +1,45 @@ +<!DOCTYPE html> +<html lang="{{.Locale}}"> + <head> + <meta charset="utf-8"> + <title><%= htmlWebpackPlugin.options.title %> | Désabonnement</title> + <link rel="icon" type="image/png" href="public/favicon-32x32.png" sizes="32x32"> + <link rel="icon" type="image/png" href="public/favicon-16x16.png" sizes="16x16"> + <!-- PWA Manifest --> + <link rel="mask-icon" href="public/safari-pinned-tab.svg" color="#297EF2"> + <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, viewport-fit=cover"> + <!-- PWA iOS --> + <link rel="apple-touch-icon" sizes="180x180" href="public/apple-touch-icon.png"> + <link rel="apple-touch-startup-image" href="public/apple-touch-icon.png"> + <meta name="apple-mobile-web-app-title" content="Ecolyo"> + <meta name="apple-mobile-web-app-capable" content="yes"> + <meta name="apple-mobile-web-app-status-bar-style" content="black"> + <!-- PWA Colors --> + <meta name="theme-color" content="#343641" /> + <meta name="background-color" content="#121212" /> + + <% _.forEach(htmlWebpackPlugin.files.css, function(file) { %> + <link rel="stylesheet" href="<%- file %>"> + <% }); %> + {{.ThemeCSS}} + + <% if (__TARGET__ === 'mobile') { %> + <meta name="format-detection" content="telephone=no"> + <script src="cordova.js" defer></script> + <% } else if (__STACK_ASSETS__) { %> + {{.CozyBar}} + <% } %> + <script src="//{{.Domain}}/assets/js/piwik.js"></script> + + </head> + <body> + <div + role="application" + class="application" + data-cozy="{{.CozyData}}" + > + <% _.forEach(htmlWebpackPlugin.files.js, function(file) { %> + <script src="<%- file %>"></script> + <% }); %> + </body> +</html> \ No newline at end of file diff --git a/src/targets/public/index.tsx b/src/targets/public/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..294a37fb174f66b2c2747e92b9ef5c22ec51a1f2 --- /dev/null +++ b/src/targets/public/index.tsx @@ -0,0 +1,119 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-var-requires */ +declare let __SENTRY_DSN__: string + +import * as Sentry from '@sentry/react' +import { BrowserTracing } from '@sentry/tracing' +import Unsubscribe from 'components/Options/Unsubscribe/Unsubscribe' +import CozyClient, { Client, CozyProvider } from 'cozy-client' +import { isFlagshipApp } from 'cozy-device-helper' +import { WebviewIntentProvider } from 'cozy-intent' +import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n' +import schema from 'doctypes' +import { memoize } from 'lodash' +import React from 'react' +import { createRoot } from 'react-dom/client' +import EnvironmentService from 'services/environment.service' +import cozyBar from 'utils/cozyBar' +import logApp from 'utils/logger' +import manifest from '../../../manifest.webapp' +import '../../styles/index.scss' + +const getToken = (): string => { + const search = new URLSearchParams(window.location.search) + return search.get('token') || '' +} + +const setupApp = memoize(() => { + const publicToken = getToken() + const container: any = document.querySelector('[role=application]') + const data = JSON.parse(container.dataset.cozy) + const protocol = window.location.protocol + const cozyUrl = `${protocol}//${data.domain}` + + const locale = 'fr' + const polyglot = initTranslation(locale, lang => require(`locales/${lang}`)) + + const client: Client = new CozyClient({ + uri: cozyUrl, + token: publicToken, + appMetadata: { + slug: manifest.name, + version: manifest.version, + }, + schema, + }) + + const envService = new EnvironmentService() + const isLocal = envService.isLocal() + const development = envService.isDev() + + cozyBar.init({ + appName: data.app.name, + appEditor: data.app.editor, + cozyClient: client, + iconPath: data.app.icon, + lang: data.locale, + replaceTitleOnMobile: false, + appSlug: data.app.slug, + appNamePrefix: data.app.prefix, + isInvertedTheme: isFlagshipApp(), + }) + + !isLocal && + Sentry.init({ + dsn: __SENTRY_DSN__, + integrations: [new BrowserTracing()], + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for performance monitoring. + // We recommend adjusting this value in production + // Set to 0 for local development + tracesSampleRate: 1.0, + + // Custom settings below + release: client.appMetadata.version, + environment: development ? 'development' : 'production', + // cast because init is somehow missing dsn property + } as Sentry.BrowserOptions) + + return { container, client, locale, polyglot } +}) + +const init = () => { + const { container, client, locale, polyglot } = setupApp() + const root = createRoot(container) + + root.render( + <WebviewIntentProvider setBarContext={cozyBar.setWebviewContext}> + <CozyProvider client={client}> + <I18n lang={locale} polyglot={polyglot}> + <Unsubscribe /> + </I18n> + </CozyProvider> + </WebviewIntentProvider> + ) +} + +// initial rendering of the application +document.addEventListener('DOMContentLoaded', () => init()) +// excludes Chrome, Edge, and all Android browsers that include the Safari name in their user agent +const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent) +if (!isSafari && 'serviceWorker' in navigator) { + window.addEventListener('load', function () { + navigator.serviceWorker + .register('/serviceWorker.js') + .then(reg => console.log('service worker registered', reg.scope)) + .catch(error => { + const errorMessage = `service worker not registered: ${JSON.stringify( + error + )}` + logApp.error(errorMessage) + Sentry.captureException(errorMessage) + }) + }) +} + +if (module.hot) { + init() + module.hot.accept() +} diff --git a/src/targets/services/aggregatorUsageEvents.ts b/src/targets/services/aggregatorUsageEvents.ts index 09ef985fc44fd8dd98d997f2656cc30783bbb1cb..f54542bdd4b6ab97fbc94bc198e6fcafc696c819 100644 --- a/src/targets/services/aggregatorUsageEvents.ts +++ b/src/targets/services/aggregatorUsageEvents.ts @@ -2,21 +2,16 @@ import * as Sentry from '@sentry/react' import { Client } from 'cozy-client' import logger from 'cozy-logger' import { - DaccEvent, - FluidSlugType, FluidState, FluidType, HotWaterFluid, TimeStep, - UsageEventProperties, UsageEventType, - UserChallengeState, WarmingType, } from 'enums' -import { toNumber, uniq } from 'lodash' +import { uniq } from 'lodash' import { DateTime } from 'luxon' import { FluidStatus, PerformanceIndicator, UsageEvent } from 'models' -import ChallengeService from 'services/challenge.service' import ConsumptionService from 'services/consumption.service' import EnvironmentService from 'services/environment.service' import FluidService from 'services/fluid.service' @@ -29,6 +24,14 @@ import { runService } from './service' const logStack = logger.namespace('aggregatorUsageEvents') +enum DaccIndicator { + CONSUMPTION_VARIATION_MONTHLY = 'consumption-variation-monthly', + FLUID_DATA_GRANULARITY = 'fluid-data-granularity-monthly', + KONNECTOR_CONNECTED_PER_DAY = 'konnector-connected-daily', + PROFILE_COUNT_MONTHLY = 'profile-count', + SUMMARY_SUBSCRIPTION_MONTHLY = 'summary-subscription-monthly', +} + interface AggregatorUsageEventsProps { client: Client } @@ -90,234 +93,6 @@ const sendIndicator = async ( } } -const reduceEvents = ( - events: UsageEvent[] -): { [key: string]: UsageEvent[] } => { - return events.reduce(function ( - acc: { - [key: string]: UsageEvent[] - }, - event: UsageEvent - ) { - const key = `${event.eventDate.startOf('day').toString()}|${event.target}|${ - event.result - }|${event.context}` - if (!acc[key]) { - acc[key] = [] - } - acc[key].push(event) - readUsageEvents.push(event) - return acc - }, {}) -} - -const sendAggregatedEventByDay = async ( - events: UsageEvent[], - eventType: DaccEvent, - client: Client, - groupsKeys: { group1: string; group2?: string; group3?: string }, - groupsIndexes: number[], - customValues?: (string | null)[] -) => { - const reducedEvents = reduceEvents(events) - for (const item of Object.keys(reducedEvents)) { - const splittedKey = item.split('|') - let group1 = {} - let group2 = {} - let group3 = {} - if (groupsKeys.group1 && (groupsIndexes[0] !== 0 || customValues?.[0])) { - group1 = { - [groupsKeys.group1]: customValues?.[0] - ? customValues[0] - : splittedKey[groupsIndexes[0]], - } - } - if (groupsKeys.group2 && (groupsIndexes[1] !== 0 || customValues?.[1])) { - group2 = { - [groupsKeys.group2]: customValues?.[1] - ? customValues[1] - : splittedKey[groupsIndexes[1]], - } - } - if (groupsKeys.group3 && (groupsIndexes[2] !== 0 || customValues?.[2])) { - group3 = { - [groupsKeys.group3]: customValues?.[2] - ? customValues[2] - : splittedKey[groupsIndexes[2]], - } - } - const indicator: Indicator = { - createdBy: 'ecolyo', - measureName: eventType, - startDate: DateTime.fromISO(splittedKey[0]).toISODate(), - value: reducedEvents[item].length, - group1: group1, - ...(Object.keys(group2).length > 0 && { group2: group2 }), - ...(Object.keys(group3).length > 0 && { group3: group3 }), - } - const result = await sendIndicator(indicator, client) - if (result) { - readUsageEvents.push(...reducedEvents[item]) - } - } -} - -const handleQuizStars = async (events: UsageEvent[], client: Client) => { - events.forEach(async event => { - const indicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.QUIZ_STARS, - startDate: event.startDate ? event.startDate.toISODate() : '', - value: parseInt(event.result ? event.result : '0'), - // eslint-disable-next-line camelcase - group1: { challenge_id: event.context ? event.context : '' }, - // eslint-disable-next-line camelcase - group2: { quiz_id: event.target ? event.target : '' }, - } - const result = await sendIndicator(indicator, client) - if (result) { - readUsageEvents.push(event) - } - }) -} - -const calculSessionTime = async (events: UsageEvent[], client: Client) => { - let startSessionDate: DateTime | null = null - let isFirstConnection = false - let navigationCount = 0 - for (const [index, event] of events.entries()) { - if (event.type === UsageEventType.CONNECTION_EVENT) { - if ( - startSessionDate && - index > 0 && - events[index - 1].type !== UsageEventType.CONNECTION_EVENT - ) { - const endDate = events[index - 1].eventDate - const duration = endDate - .diff(startSessionDate, ['seconds']) - .toObject().seconds - const sessionIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.SESSION_DURATION, - startDate: startSessionDate.toISODate(), - value: duration === undefined ? 0 : duration, - // eslint-disable-next-line camelcase - group1: { number_pages: navigationCount.toString() }, - // eslint-disable-next-line camelcase - group2: { session_type: isFirstConnection ? 'first' : 'any' }, - } - await sendIndicator(sessionIndicator, client) - navigationCount = 0 - } - startSessionDate = event.eventDate - isFirstConnection = - event.result && event.result === 'firstConnection' ? true : false - } else if (event.type === UsageEventType.NAVIGATION_EVENT) { - if (startSessionDate) { - navigationCount += 1 - } - } else if (index === events.length - 1) { - if (startSessionDate) { - const endDate = event.eventDate - const duration = endDate - .diff(startSessionDate, ['seconds']) - .toObject().seconds - const sessionIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.SESSION_DURATION, - startDate: startSessionDate.toISODate(), - value: duration === undefined ? 0 : duration, - // eslint-disable-next-line camelcase - group1: { number_pages: navigationCount.toString() }, - // eslint-disable-next-line camelcase - group2: { session_type: isFirstConnection ? 'first' : 'any' }, - } - await sendIndicator(sessionIndicator, client) - } - } - } -} - -const calculPeriodBetweenFirstConnectionAndFirstChallenge = async ( - events: UsageEvent[], - firstConnectionEvent: UsageEvent, - client: Client -) => { - const challengeLaunchEvents: UsageEvent[] = events.filter( - (event: UsageEvent) => event.type === UsageEventType.CHALLENGE_LAUNCH_EVENT - ) - if ( - challengeLaunchEvents.length > 0 && - challengeLaunchEvents[0].target === 'CHALLENGE0001' - ) { - const periodIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: firstConnectionEvent.eventDate.toISODate(), - value: challengeLaunchEvents[0].eventDate.diff( - firstConnectionEvent.eventDate - ).seconds, - // eslint-disable-next-line camelcase - group1: { start_event: 'first_session' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'first_challenge' }, - group3: { params: '' }, - } - const result = await sendIndicator(periodIndicator, client) - if (result) { - readUsageEvents.push(challengeLaunchEvents[0]) - } - } -} - -const calculPeriodBetweenChallenge = async ( - events: UsageEvent[], - client: Client -) => { - const challengeLaunchEvents: UsageEvent[] = events.filter( - (event: UsageEvent) => event.type === UsageEventType.CHALLENGE_LAUNCH_EVENT - ) - if (challengeLaunchEvents.length > 0) { - const allEndedChallengeEvents: UsageEvent[] = - await UsageEventService.getEvents(client, { - type: UsageEventType.CHALLENGE_END_EVENT, - }) - for (const event of challengeLaunchEvents) { - if (event.target && event.target !== 'CHALLENGE0001') { - const challengeId: number = toNumber( - event.target.substr(event.target.length - 4) - ) - const prevChallengeId = `CHALLENGE${(challengeId - 1) - .toString() - .padStart(4, '0')}` - const previousEndedChallengeIndex: number = - allEndedChallengeEvents.findIndex( - (endedEvent: UsageEvent) => endedEvent.target === prevChallengeId - ) - if (previousEndedChallengeIndex > -1) { - const periodChallengeIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: - allEndedChallengeEvents[ - previousEndedChallengeIndex - ].eventDate.toISODate(), - value: event.eventDate.diff( - allEndedChallengeEvents[previousEndedChallengeIndex].eventDate - ).seconds, - // eslint-disable-next-line camelcase - group1: { start_event: 'first_session' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'first_challenge' }, - group3: { params: event.target + ':' + prevChallengeId }, - } - await sendIndicator(periodChallengeIndicator, client) - } - } - } - } -} - /** * Format a string with all konnectors in success state * @param konnectorFluidTypes FluidType[] @@ -359,7 +134,7 @@ const calculateConnectedKonnectorPerDay = async (client: Client) => { } const KonnectorConnectedPerDayIndicator: Indicator = { createdBy: 'ecolyo', - measureName: DaccEvent.KONNECTOR_CONNECTED_PER_DAY, + measureName: DaccIndicator.KONNECTOR_CONNECTED_PER_DAY, startDate: DateTime.local() .setZone('utc', { keepLocalTime: true, @@ -496,135 +271,69 @@ const calculateConsumptionVariation = async (client: Client) => { FluidType.GAS, FluidType.WATER, ]) { - if (fluidType < FluidType.MULTIFLUID.toFixed()) { - // Seniority process - const [firstConnectionEvent] = await UsageEventService.getEvents(client, { - type: UsageEventType.CONNECTION_EVENT, - result: 'firstConnection', - }) - - if (firstConnectionEvent) { - const seniority = 0 - // Seniority is set to 0, otherwise the indicator is too specific - // DateTime.local() - // .setZone('utc', { - // keepLocalTime: true, - // }) - // .diff(firstConnectionEvent.eventDate, 'month') - // .get('month') + // Seniority is set to 0, otherwise the indicator is too specific + const seniority = 0 - const consumptionVariationIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.CONSUMPTION_VARIATION_MONTHLY, - startDate: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day') - .toISODate(), - value: consumptionData[fluidType]?.percentageVariation - ? consumptionData[fluidType].percentageVariation - : 0, // in percent - // eslint-disable-next-line camelcase - group1: { fluid_type: FluidType[fluidType].toLowerCase() }, - // eslint-disable-next-line camelcase - group2: { seniority: Math.round(seniority).toString() }, - group3: { - // eslint-disable-next-line camelcase - fluid_usage: await buildProfileWithFluidType( - client, - getFluidType(FluidType[fluidType]) - ), - }, - } - - // if user wasn't connected during current month, dont send indicator - const events: UsageEvent[] = await UsageEventService.getEvents(client, { - eventDate: { - $lt: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .endOf('month') - .minus({ month: 1 }) - .toString(), - $gt: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('month') - .minus({ month: 1 }) - .toString(), - }, - }) - - if (events.length > 0 && consumptionVariationIndicator.value !== 0) { - logStack( - 'info', - `Send variation indicator : ${JSON.stringify( - consumptionVariationIndicator - )}` - ) - await sendIndicator(consumptionVariationIndicator, client) - } - } - } - } -} - -const sendConnectionCount = async (client: Client) => { - logStack('info', `sendConnectionCount`) - // Get daily connexion - const events: UsageEvent[] = await UsageEventService.getEvents(client, { - type: UsageEventType.CONNECTION_EVENT, - eventDate: { - $lt: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .endOf('month') - .minus({ month: 1 }) - .toString(), - $gt: DateTime.local() + const consumptionVariationIndicator: Indicator = { + createdBy: 'ecolyo', + measureName: DaccIndicator.CONSUMPTION_VARIATION_MONTHLY, + startDate: DateTime.local() .setZone('utc', { keepLocalTime: true, }) - .startOf('month') - .minus({ month: 1 }) - .toString(), - }, - }) + .startOf('day') + .toISODate(), + value: consumptionData[fluidType]?.percentageVariation + ? consumptionData[fluidType].percentageVariation + : 0, // in percent + // eslint-disable-next-line camelcase + group1: { fluid_type: FluidType[fluidType].toLowerCase() }, + group2: { seniority: Math.round(seniority).toString() }, + group3: { + // eslint-disable-next-line camelcase + fluid_usage: await buildProfileWithFluidType( + client, + getFluidType(FluidType[fluidType]) + ), + }, + } - let uniqueDates = 0 - // If there is at least one connection, filter each unique connection in order to send it - if (events.length > 0) { - uniqueDates = events - .map(s => s.eventDate.day) - .filter((s, i, a) => a.indexOf(s) == i).length - } + // if user wasn't connected during current month, dont send indicator + const events = await UsageEventService.getEvents(client, { + eventDate: { + $lt: DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .endOf('month') + .minus({ month: 1 }) + .toString(), + $gt: DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .startOf('month') + .minus({ month: 1 }) + .toString(), + }, + }) - const connectionMonthly: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.CONNECTION_COUNT_MONTHLY, - startDate: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day') - .toISODate(), - value: uniqueDates, + if (events.length > 0 && consumptionVariationIndicator.value !== 0) { + logStack( + 'info', + `Send variation indicator : ${JSON.stringify( + consumptionVariationIndicator + )}` + ) + await sendIndicator(consumptionVariationIndicator, client) + } } - logStack( - 'info', - `Send connectionMonthly indicator : ${JSON.stringify(connectionMonthly)}` - ) - await sendIndicator(connectionMonthly, client) } const sendProfileCount = async (client: Client) => { logStack('info', `sendProfileCount`) // Get profile setEvents - const events: UsageEvent[] = await UsageEventService.getEvents(client, { + const events = await UsageEventService.getEvents(client, { type: UsageEventType.PROFILE_SET_EVENT, }) @@ -632,7 +341,7 @@ const sendProfileCount = async (client: Client) => { if (events.length > 0) { const profileSet: Indicator = { createdBy: 'ecolyo', - measureName: DaccEvent.PROFILE_COUNT_MONTHLY, + measureName: DaccIndicator.PROFILE_COUNT_MONTHLY, startDate: DateTime.local() .setZone('utc', { keepLocalTime: true, @@ -645,27 +354,67 @@ const sendProfileCount = async (client: Client) => { } } -const sendEmailSubscription = async (client: Client) => { - logStack('info', `sendEmailSubscription`) - const profile = await new ProfileService(client).getProfile() - if (profile?.sendAnalysisNotification) { - const cameBackFromEmail: Indicator = { +/** Send if user has came back to Ecolyo using the button in the newsletter */ +const sendNewsletterComeBack = async (client: Client) => { + logStack('info', `sendNewsletterComeBack`) + const events = await UsageEventService.getEvents(client, { + type: UsageEventType.REPORT_FROM_EMAIL, + eventDate: { + $lt: DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .minus({ days: 1 }) + .endOf('day') + .toString(), + $gt: DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .minus({ days: 1 }) + .startOf('day') + .toString(), + }, + }) + if (events.length) { + const cameBackFromNewsletter: Indicator = { createdBy: 'ecolyo', - measureName: DaccEvent.SUMMARY_SUBSCRIPTION_MONTHLY, + measureName: DaccIndicator.SUMMARY_SUBSCRIPTION_MONTHLY, startDate: DateTime.local() .setZone('utc', { keepLocalTime: true, }) + .minus({ days: 1 }) .startOf('day') .toISODate(), - value: profile.sendAnalysisNotification ? 1 : 0, + value: 1, // eslint-disable-next-line camelcase - group1: { event_type: 'subscribed' }, + group1: { event_type: 'email' }, } - await sendIndicator(cameBackFromEmail, client) + await sendIndicator(cameBackFromNewsletter, client) } } +const sendNewsletterSubscription = async (client: Client) => { + logStack('info', `sendEmailSubscription`) + const profile = await new ProfileService(client).getProfile() + if (!profile) return + const isSubscribed: Indicator = { + createdBy: 'ecolyo', + measureName: DaccIndicator.SUMMARY_SUBSCRIPTION_MONTHLY, + startDate: DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .startOf('day') + .toISODate(), + value: profile.sendAnalysisNotification ? 1 : 0, + // eslint-disable-next-line camelcase + group1: { event_type: 'subscribed' }, + } + await sendIndicator(isSubscribed, client) +} + /** * Send indicator to dacc, if user has half-hour data. * @param client CozyClient @@ -681,10 +430,9 @@ const sendHalfHourConsumption = async (client: Client) => { const halfHourConsumption: Indicator = { createdBy: 'ecolyo', - measureName: DaccEvent.FLUID_DATA_GRANULARITY, + measureName: DaccIndicator.FLUID_DATA_GRANULARITY, // eslint-disable-next-line camelcase group1: { fluid_type: 'electricity' }, - // eslint-disable-next-line camelcase group2: { granularity: 'half_hour' }, startDate: DateTime.local() .setZone('utc', { @@ -697,457 +445,6 @@ const sendHalfHourConsumption = async (client: Client) => { await sendIndicator(halfHourConsumption, client) } -/** - * Send indicator to dacc, each month send if user has succeeded to configure a connector with the number of try. - * @param client CozyClient - */ -const sendKonnectorEvents = async (client: Client) => { - logStack('info', `sendKonnectorEvents`) - const slugs = Object.values(FluidSlugType) - const today = DateTime.local().setZone('utc', { - keepLocalTime: true, - }) - slugs.forEach(async slug => { - let successEvents: UsageEvent[] = await UsageEventService.getEvents( - client, - { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: slug, - result: 'success', - eventDate: { - $lte: today.endOf('month').minus({ month: 1 }).toString(), - $gte: today.startOf('month').minus({ month: 1 }).toString(), - }, - }, - true - ) - - // If there is no success in month, send nothing - if (successEvents && successEvents.length > 0) { - // Get all success events - successEvents = await UsageEventService.getEvents( - client, - { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: slug, - result: 'success', - }, - true - ) - // Remove success from other month, they should have been already processed - // successEvents.length = successEventsOfCurrentMonth - - for (let index = 0; index < successEvents.length; index++) { - const successEvent = successEvents[index] - let query = null - - // If there is a previous value take it as reference for the query - // Else get all previous because it's the first one - if (index + 1 < successEvents.length) { - query = { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: slug, - result: 'error', - eventDate: { - $lte: successEvent.eventDate, - $gte: successEvents[index + 1].eventDate, - }, - } - } else { - query = { - type: UsageEventType.KONNECTOR_CONNECT_EVENT, - target: slug, - result: 'error', - eventDate: { - $lte: successEvent.eventDate, - }, - } - } - - const allConnectionEvents: UsageEvent[] = - await UsageEventService.getEvents(client, query, true) - - const konnectorSuccess: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.PARTNER_SUCCESS_MONTHLY, - // eslint-disable-next-line camelcase - group1: { fluid_type: slug }, - startDate: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day') - .toISODate(), - value: allConnectionEvents.length + 1, // +1 in order to count the success - } - // Send indicator if it's in current month - if (successEvent.eventDate.month === today.minus({ month: 1 }).month) { - await sendIndicator(konnectorSuccess, client) - } - } - } - }) -} - -/** - * Send the total number of partner connection attempts and the number of success - * @param client CozyClient - */ -const sendKonnectorAttemptsMonthly = async (client: Client) => { - logStack('info', `sendkonnectorAttemptsMonthly`) - const slugs = Object.values(FluidSlugType) - const today = DateTime.local().setZone('utc', { - keepLocalTime: true, - }) - // Count the number of connection and refresh events - slugs.forEach(async slug => { - const konnectorEvents: UsageEvent[] = await UsageEventService.getEvents( - client, - { - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: slug, - eventDate: { - $lte: today.endOf('month').minus({ month: 1 }).toString(), - $gte: today.startOf('month').minus({ month: 1 }).toString(), - }, - }, - true - ) - logStack('info', ` : ${JSON.stringify(konnectorEvents)}`) - - // Check if there is a success (will be false or true since the event is triggered only for the first connexion) - const success: boolean = - konnectorEvents.filter(event => event.result == 'success').length > 0 - - const konnectorAttempts: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.UNINITIALIZED_KONNECTOR_ATTEMPTS_MONTHLY, - // eslint-disable-next-line camelcase - group1: { slug: slug }, - group2: { success: success }, - startDate: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day') - .toISODate(), - value: konnectorEvents.length, - } - // Send indicator if there is connection events - if (konnectorEvents.length > 0) { - await sendIndicator(konnectorAttempts, client) - } - }) -} - -const aggregateEvents = async ( - events: UsageEvent[], - eventType: UsageEventType, - firstConnectionEvent: UsageEvent, - client: Client -) => { - let reducedEvents = null // Used to store reducedEvents during calculation - switch (eventType) { - case UsageEventType.CONNECTION_EVENT: - await sendAggregatedEventByDay( - events, - DaccEvent.CONNECTION_COUNT_DAILY, - client, - { group1: 'device' }, - [UsageEventProperties.CONTEXT] - ) - break - case UsageEventType.KONNECTOR_CONNECT_EVENT: - await sendAggregatedEventByDay( - events, - DaccEvent.KONNECTOR_EVENT_DAILY, - client, - { group1: 'slug', group2: 'event_type', group3: 'status' }, - [UsageEventProperties.TARGET, 0, UsageEventProperties.RESULT], - [null, 'connexion', null] - ) - break - case UsageEventType.KONNECTOR_REFRESH_EVENT: - await sendAggregatedEventByDay( - events, - DaccEvent.KONNECTOR_EVENT_DAILY, - client, - { group1: 'slug', group2: 'event_type', group3: 'status' }, - [UsageEventProperties.TARGET, 0, UsageEventProperties.RESULT], - [null, 'refresh', null] - ) - break - case UsageEventType.NAVIGATION_EVENT: - await sendAggregatedEventByDay( - events, - DaccEvent.NAVIGATION_COUNT_DAILY, - client, - { group1: 'page' }, - [UsageEventProperties.TARGET] - ) - break - case UsageEventType.PROFILE_SET_EVENT: - await sendAggregatedEventByDay( - events, - DaccEvent.NAVIGATION_ACTION_DAILY, - client, - { group1: 'page', group2: 'feature', group3: 'params' }, - [0, 0, 0], - ['profile', 'profile_completed', '{}'] - ) - break - case UsageEventType.CONSUMPTION_COMPARE_EVENT: - reducedEvents = reduceEvents(events) - for (const item of Object.keys(reducedEvents)) { - const splitedKey = item.split('|') - const indicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.NAVIGATION_ACTION_DAILY, - startDate: DateTime.fromISO(splitedKey[0]).toISODate(), - value: reducedEvents[item].length, - group1: { - page: 'consumption', - }, - group2: { - feature: 'compare', - }, - group3: { - params: - splitedKey[UsageEventProperties.CONTEXT] + - ':' + - splitedKey[UsageEventProperties.TARGET], - }, - } - const result = await sendIndicator(indicator, client) - if (result) { - readUsageEvents.push(...reducedEvents[item]) - } - } - break - case UsageEventType.CONSUMPTION_CHANGE_TIMESTEP_EVENT: - reducedEvents = reduceEvents(events) - for (const item of Object.keys(reducedEvents)) { - const splitedKey = item.split('|') - const indicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.NAVIGATION_ACTION_DAILY, - startDate: DateTime.fromISO(splitedKey[0]).toISODate(), - value: reducedEvents[item].length, - group1: { - page: 'consumption', - }, - group2: { - feature: 'changestep', - }, - group3: { - params: - splitedKey[UsageEventProperties.CONTEXT] + - ':' + - splitedKey[UsageEventProperties.TARGET], - }, - } - const result = await sendIndicator(indicator, client) - if (result) { - readUsageEvents.push(...reducedEvents[item]) - } - } - break - case UsageEventType.ACTION_CHANGE_EVENT: - reducedEvents = reduceEvents(events) - for (const item of Object.keys(reducedEvents)) { - const splitedKey = item.split('|') - const indicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.NAVIGATION_ACTION_DAILY, - startDate: DateTime.fromISO(splitedKey[0]).toISODate(), - value: reducedEvents[item].length, - group1: { - page: 'action', - }, - group2: { - feature: 'change_ecogesture', - }, - group3: { - params: - splitedKey[UsageEventProperties.TARGET] + - ':' + - splitedKey[UsageEventProperties.CONTEXT], - }, - } - const result = await sendIndicator(indicator, client) - if (result) { - readUsageEvents.push(...reducedEvents[item]) - } - } - break - case UsageEventType.CHALLENGE_END_EVENT: - for (const event of events) { - const duelLaunchIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: event.eventDate.toISODate(), - value: event.startDate - ? event.eventDate.diff(event.startDate, ['seconds']).seconds - : 0, - // eslint-disable-next-line camelcase - group1: { start_event: 'start_challenge' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'end_challenge' }, - group3: { params: event.target ? event.target : '' }, - } - const result = await sendIndicator(duelLaunchIndicator, client) - - if (result) { - readUsageEvents.push(event) - } - } - break - case UsageEventType.QUIZ_END_EVENT: - handleQuizStars(events, client) - break - case UsageEventType.EXPLORATION_END_EVENT: - for (const event of events) { - const duelLaunchIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: event.eventDate.toISODate(), - value: event.startDate - ? event.eventDate.diff(event.startDate, ['seconds']).seconds - : 0, - // eslint-disable-next-line camelcase - group1: { start_event: 'start_exploration' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'end_exploration' }, - group3: { params: event.context + ':' + event.target }, - } - const result = await sendIndicator(duelLaunchIndicator, client) - - if (result) { - readUsageEvents.push(event) - } - } - break - case UsageEventType.ACTION_END_EVENT: - for (const event of events) { - const duelLaunchIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: event.eventDate.toISODate(), - value: event.startDate - ? event.eventDate.diff(event.startDate, ['seconds']).seconds - : 0, - // eslint-disable-next-line camelcase - group1: { start_event: 'start_action' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'end_action' }, - group3: { params: event.target + ':' + event.context }, - } - const result = await sendIndicator(duelLaunchIndicator, client) - - if (result) { - readUsageEvents.push(event) - } - } - break - case UsageEventType.DUEL_END_EVENT: - for (const event of events) { - const duelLaunchIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: event.eventDate.toISODate(), - value: event.startDate - ? event.eventDate.diff(event.startDate, ['seconds']).seconds - : 0, - // eslint-disable-next-line camelcase - group1: { start_event: 'start_duel' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'end_duel' }, - group3: { - params: event.target + ':' + event.context + ':' + event.result, - }, - } - const result = await sendIndicator(duelLaunchIndicator, client) - - if (result) { - readUsageEvents.push(event) - } - } - break - case UsageEventType.DUEL_LAUNCH_EVENT: - // Get challenge ID - const challenges = await new ChallengeService( - client - ).getAllUserChallengeEntities() - const filteredCurrentChallenge = challenges.filter( - challenge => - challenge.state === UserChallengeState.ONGOING || - challenge.state === UserChallengeState.DUEL - ) - const currentChallenge = filteredCurrentChallenge[0] - ? filteredCurrentChallenge[0] - : null - - let starNumbers = 0 - if (currentChallenge?.progress) { - starNumbers = - currentChallenge.progress.actionProgress + - currentChallenge.progress.explorationProgress + - currentChallenge.progress.quizProgress - } - - for (const event of events) { - const duelLaunchIndicator: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.EVENT_DURATION, - startDate: event.eventDate.toISODate(), - value: event.startDate - ? event.eventDate.diff(event.startDate, ['seconds']).seconds - : 0, - // eslint-disable-next-line camelcase - group1: { start_event: 'start_duel' }, - // eslint-disable-next-line camelcase - group2: { end_event: 'start_duel' }, - group3: { - params: event.target + ':' + event.context + ':' + starNumbers, - }, - } - const result = await sendIndicator(duelLaunchIndicator, client) - - if (result) { - readUsageEvents.push(event) - } - } - break - case UsageEventType.CHALLENGE_LAUNCH_EVENT: - await calculPeriodBetweenFirstConnectionAndFirstChallenge( - events, - firstConnectionEvent, - client - ) - await calculPeriodBetweenChallenge(events, client) - break - case UsageEventType.REPORT_FROM_EMAIL: - for (const event of events) { - const cameBackFromEmail: Indicator = { - createdBy: 'ecolyo', - measureName: DaccEvent.SUMMARY_SUBSCRIPTION_MONTHLY, - startDate: event.eventDate.toISODate(), - value: 1, - // eslint-disable-next-line camelcase - group1: { event_type: 'email' }, - } - const result = await sendIndicator(cameBackFromEmail, client) - - if (result) { - readUsageEvents.push(event) - } - } - break - default: - break - } -} - const AggregatorUsageEvents = async ({ client, }: AggregatorUsageEventsProps) => { @@ -1159,40 +456,9 @@ const AggregatorUsageEvents = async ({ return } - const events: UsageEvent[] = await UsageEventService.getEvents(client, { - aggregated: false, - eventDate: { - $lt: DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day'), - }, - }) - const [firstConnectionEvent] = await UsageEventService.getEvents(client, { - type: UsageEventType.CONNECTION_EVENT, - result: 'firstConnection', - }) - if (events.length > 0) { - logStack('info', `Fetching Sessions`) - calculSessionTime(events, client) - for (const eventType of Object.values(UsageEventType)) { - logStack('info', `Fetching ${eventType}`) - const filteredEvents: UsageEvent[] = events.filter( - event => event.type === eventType - ) - if (filteredEvents.length > 0) { - await aggregateEvents( - filteredEvents, - eventType, - firstConnectionEvent, - client - ) - } - } - } // Daily events - calculateConnectedKonnectorPerDay(client) + await calculateConnectedKonnectorPerDay(client) + await sendNewsletterComeBack(client) // Monthly events const profile = await new ProfileService(client).getProfile() if ( @@ -1203,12 +469,9 @@ const AggregatorUsageEvents = async ({ }) .startOf('day').day === profile.monthlyAnalysisDate.day ) { - await sendKonnectorAttemptsMonthly(client) await calculateConsumptionVariation(client) - await sendEmailSubscription(client) + await sendNewsletterSubscription(client) await sendHalfHourConsumption(client) - await sendKonnectorEvents(client) - await sendConnectionCount(client) await sendProfileCount(client) } diff --git a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts index 28c355598e3583ffda5b4d9a4952763d6be3365f..84b034a1e87c1b557436d2f4195e8e1a6aeb39a8 100644 --- a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts +++ b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts @@ -65,15 +65,21 @@ const populateArrayWithTotalData = ( }) } } + /** Gets max Power value for a given month */ const getMonthMaxPower = async ( month: number, year: number, client: Client ) => { - const emas = new EnedisMonthlyAnalysisDataService(client) + const enedisMonthlyAnalysisDataService = new EnedisMonthlyAnalysisDataService( + client + ) logStack('info', `Fetching max power for month ${month} of year ${year}`) - const data = await emas.getMaxPowerByDate(year, month) + const data = await enedisMonthlyAnalysisDataService.getMaxPowerByDate( + year, + month + ) const maxPowerArray: number[] = [] if (data?.length) { for (const day of data) { @@ -82,6 +88,34 @@ const getMonthMaxPower = async ( } return Math.max(...maxPowerArray) } + +/** Compute the off-peak hours consumption ratio */ +const getOffPeakHoursRatio = async ( + month: number, + year: number, + client: Client +) => { + logStack( + 'info', + `Fetching off-peak hours ratio for month ${month} of year ${year}` + ) + const enedisMonthlyAnalysisDataService = new EnedisMonthlyAnalysisDataService( + client + ) + const offPeakHours = await enedisMonthlyAnalysisDataService.getOffPeakHours() + if (!offPeakHours) return null + + const offPeakHoursRatio = + await enedisMonthlyAnalysisDataService.getOffPeakHoursRatio( + year, + month, + offPeakHours + ) + logStack('info', `Off-peak hours ratio is ${offPeakHoursRatio} `) + + return offPeakHoursRatio +} + /** * Get the average arrays of half-hour value on a given month */ @@ -110,6 +144,7 @@ const getEnedisMonthAnalysisData = async ( weekEndDaysHalfHourAverageValues: [], minimumLoad: null, maxPower: null, + offPeakHoursRatio: null, month: month, year: year, } @@ -135,14 +170,14 @@ const getEnedisMonthAnalysisData = async ( populateArrayWithTotalData(weekValuesArray, halfHourDayData, false) } } - const numberofDaysInMonth = DateTime.fromObject({ + const numberOfDaysInMonth = DateTime.fromObject({ month: month, year: year, }).daysInMonth monthlyAveragesLoads.minimumLoad = getMinMonthlyLoad( weekEndValuesArray, weekValuesArray, - numberofDaysInMonth + numberOfDaysInMonth ) const arrAvg = (arr: number[]) => arr.reduce((a, b) => a + b, 0) / arr.length @@ -158,6 +193,11 @@ const getEnedisMonthAnalysisData = async ( monthlyAveragesLoads.weekDaysHalfHourAverageValues = weekAverages monthlyAveragesLoads.weekEndDaysHalfHourAverageValues = weekEndAverages monthlyAveragesLoads.maxPower = await getMonthMaxPower(month, year, client) + monthlyAveragesLoads.offPeakHoursRatio = await getOffPeakHoursRatio( + month, + year, + client + ) return monthlyAveragesLoads } } @@ -169,116 +209,127 @@ const getEnedisMonthAnalysisData = async ( const syncEnedisMonthlyAnalysisDataDoctype = async ({ client, }: EnedisMonthlyProps) => { - // SERVICE RUNS ONLY IF ENEDIS MINUTE IS ACTIVATED - const emas = new EnedisMonthlyAnalysisDataService(client) - const cs = new ConsumptionService(client) - const firstMinuteData = (await cs.getFirsDataDateFromDoctype( + const enedisMonthlyAnalysisDataService = new EnedisMonthlyAnalysisDataService( + client + ) + const consumptionService = new ConsumptionService(client) + const firstMinuteData = (await consumptionService.getFirsDataDateFromDoctype( ENEDIS_MINUTE_DOCTYPE )) as DataloadEntity[] - const lastEnedisMonthlyAnalysis = await emas.getLastEnedisMonthlyAnalysis() - if (firstMinuteData?.[0]) { - // First creates the analysis of the month - 1 - logStack('info', 'Fetching last Enedis monthly Analysis...') - const firstMinuteDate = DateTime.fromObject({ - year: firstMinuteData[0].year, - month: firstMinuteData[0].month, - }).startOf('month') - const today = DateTime.local().setZone('utc', { - keepLocalTime: true, - }) - const analysisDate: DateTime = today.minus({ - month: 1, - }) - - const data = await getEnedisMonthAnalysisData( - client, - analysisDate.month, - analysisDate.year + const lastEnedisMonthlyAnalysis = + await enedisMonthlyAnalysisDataService.getLastEnedisMonthlyAnalysis() + // SERVICE RUNS ONLY IF ENEDIS MINUTE IS ACTIVATED + if (!firstMinuteData?.[0]) { + logStack( + 'info', + 'Enedis Minute is not activated or there is no data yet in this doctype' ) - if (data) { - const created = await emas.createEnedisMonthlyAnalysisData(data) - if (created) { - logStack('success', 'Created successfully ! ') - } else { - logStack('error', 'Failed to create last Enedis monthly Analysis') - Sentry.captureException( - JSON.stringify({ - error: 'Failed to create last Enedis monthly Analysis ', - }) - ) - } + return + } + // First creates the analysis of the month - 1 + logStack('info', 'Fetching last Enedis monthly Analysis...') + const firstMinuteDate = DateTime.fromObject({ + year: firstMinuteData[0].year, + month: firstMinuteData[0].month, + }).startOf('month') + const today = DateTime.local().setZone('utc', { + keepLocalTime: true, + }) + const analysisDate: DateTime = today.minus({ + month: 1, + }) + + const data = await getEnedisMonthAnalysisData( + client, + analysisDate.month, + analysisDate.year + ) + if (data) { + const created = + await enedisMonthlyAnalysisDataService.createEnedisMonthlyAnalysisData( + data + ) + if (created) { + logStack('success', 'Created successfully ! ') + } else { + logStack('error', 'Failed to create last Enedis monthly Analysis') + Sentry.captureException( + JSON.stringify({ + error: 'Failed to create last Enedis monthly Analysis ', + }) + ) } - logStack('info', 'Getting first enedis half hour data date') + } + logStack('info', 'Getting first enedis half hour data date') - if (lastEnedisMonthlyAnalysis.length > 0) { - // If user has more than one entry (already synced), fetch the full history - const firstEnedisMonthlyAnalysis = (await cs.getFirsDataDateFromDoctype( + if (lastEnedisMonthlyAnalysis.length > 0) { + // If user has more than one entry (already synced), fetch the full history + const firstEnedisMonthlyAnalysis = + (await consumptionService.getFirsDataDateFromDoctype( ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE )) as EnedisMonthlyAnalysisData[] - if ( - firstEnedisMonthlyAnalysis[0]?.month === firstMinuteData[0].month && - firstEnedisMonthlyAnalysis[0]?.year === firstMinuteData[0].year - ) { - logStack('info', 'Every Enedis Analysis already synchronized') - return - } else if (firstEnedisMonthlyAnalysis) { - logStack( - 'info', - 'Doctype is partially completed, fetching all available history' - ) - const firstEnedisMonthlyAnalysisDate = DateTime.fromObject({ - year: firstEnedisMonthlyAnalysis[0].year, - month: firstEnedisMonthlyAnalysis[0].month, - }).startOf('month') - const diffInmonths = Math.ceil( - firstEnedisMonthlyAnalysisDate.diff(firstMinuteDate, 'months').months - ) - for (let i = 1; i < diffInmonths; i++) { - const analysistoCreate = firstEnedisMonthlyAnalysisDate.minus({ - month: i, - }) - const data = await getEnedisMonthAnalysisData( - client, - analysistoCreate.month, - analysistoCreate.year - ) - if (data) { - await emas.createEnedisMonthlyAnalysisData(data) - } - } - } - } else { - // If user only have the last analysis available, fetch one year history + if ( + firstEnedisMonthlyAnalysis[0]?.month === firstMinuteData[0].month && + firstEnedisMonthlyAnalysis[0]?.year === firstMinuteData[0].year + ) { + logStack('info', 'Every Enedis Analysis already synchronized') + return + } else if (firstEnedisMonthlyAnalysis) { logStack( 'info', - 'Doctype is empty, fetching history for one year maximum or until first enedis minute date' + 'Doctype is partially completed, fetching all available history' ) - const maximumDate = analysisDate.minus({ month: 12 }).startOf('month') - const diffInmonths = Math.ceil( - firstMinuteDate.diff(maximumDate, 'months').months + const firstEnedisMonthlyAnalysisDate = DateTime.fromObject({ + year: firstEnedisMonthlyAnalysis[0].year, + month: firstEnedisMonthlyAnalysis[0].month, + }).startOf('month') + const diffInMonths = Math.ceil( + firstEnedisMonthlyAnalysisDate.diff(firstMinuteDate, 'months').months ) - const limitDate = diffInmonths > 0 ? firstMinuteDate : maximumDate - const diffInMonthsWithLimitDate = Math.ceil( - analysisDate.diff(limitDate, 'months').months - ) - for (let i = 1; i < diffInMonthsWithLimitDate; i++) { - const analysistoCreate = analysisDate.minus({ month: i }) + for (let i = 1; i < diffInMonths; i++) { + const analysisToCreate = firstEnedisMonthlyAnalysisDate.minus({ + month: i, + }) const data = await getEnedisMonthAnalysisData( client, - analysistoCreate.month, - analysistoCreate.year + analysisToCreate.month, + analysisToCreate.year ) if (data) { - await emas.createEnedisMonthlyAnalysisData(data) + await enedisMonthlyAnalysisDataService.createEnedisMonthlyAnalysisData( + data + ) } } } } else { + // If user only have the last analysis available, fetch one year history logStack( 'info', - 'Enedis Minute is not activated or there is no data yet in this doctype' + 'Doctype is empty, fetching history for one year maximum or until first enedis minute date' ) + const maximumDate = analysisDate.minus({ month: 12 }).startOf('month') + const diffInMonths = Math.ceil( + firstMinuteDate.diff(maximumDate, 'months').months + ) + const limitDate = diffInMonths > 0 ? firstMinuteDate : maximumDate + const diffInMonthsWithLimitDate = Math.ceil( + analysisDate.diff(limitDate, 'months').months + ) + for (let i = 1; i < diffInMonthsWithLimitDate; i++) { + const analysisToCreate = analysisDate.minus({ month: i }) + const data = await getEnedisMonthAnalysisData( + client, + analysisToCreate.month, + analysisToCreate.year + ) + if (data) { + await enedisMonthlyAnalysisDataService.createEnedisMonthlyAnalysisData( + data + ) + } + } } } diff --git a/src/targets/services/monthlyReportNotification.ts b/src/targets/services/monthlyReportNotification.ts index 9d4dc2fd2360e451764cffcb5dca51d7e8a6fb95..7cb75e4a4ff03ac4b9924b6f562f91e57069fd7b 100644 --- a/src/targets/services/monthlyReportNotification.ts +++ b/src/targets/services/monthlyReportNotification.ts @@ -10,6 +10,7 @@ import { MonthlyReport, PerformanceIndicator } from 'models' import ConsumptionService from 'services/consumption.service' import EnvironmentService from 'services/environment.service' import MailService from 'services/mail.service' +import { PermissionsService } from 'services/permissions.service' import ProfileService from 'services/profile.service' import { getMonthNameWithPrep } from 'utils/utils' import { runService } from './service' @@ -155,9 +156,10 @@ const monthlyReportNotification = async ({ client, }: MonthlyReportNotificationProps) => { logStack('info', 'Fetching user profile...') - const upm = new ProfileService(client) - let userProfil = await upm.getProfile() - if (!userProfil?.sendAnalysisNotification) { + const profileService = new ProfileService(client) + const permissionsService = new PermissionsService(client) + const userProfile = await profileService.getProfile() + if (!userProfile?.sendAnalysisNotification) { logStack( 'info', 'End of process - Report Notification disabled in user profile' @@ -166,11 +168,11 @@ const monthlyReportNotification = async ({ } // Init mail token for user in case he don't have one - if (!userProfil.mailToken || userProfil.mailToken === '') { + if (!userProfile.mailToken || userProfile.mailToken === '') { const token: string = require('crypto').randomBytes(48).toString('hex') try { - await upm.updateProfile({ + await profileService.updateProfile({ mailToken: token, }) } catch (error) { @@ -181,7 +183,7 @@ const monthlyReportNotification = async ({ } let username = '' - let url = '' + let analysisLink = '' logStack('info', 'Fetching data for mail...') // Retrieve public name from the stack @@ -197,7 +199,7 @@ const monthlyReportNotification = async ({ const apps = await client.getStackClient().fetchJSON('GET', '/apps/ecolyo') const appLink = get(apps, 'data.links.related') if (appLink) { - url = appLink + analysisLink = appLink } logStack('info', 'Creation of mail...') @@ -208,39 +210,34 @@ const monthlyReportNotification = async ({ }) const month = today.toFormat('MM') const year = today.toFormat('yyyy') - const monthlyReport: MonthlyReport = await getMonthlyReport( - year, - month, - client - ) + const monthlyReport = await getMonthlyReport(year, month, client) - let unsubscribeUrl - userProfil = await upm.getProfile() - let token = undefined - if (userProfil?.mailToken) { - token = userProfil.mailToken + /** bounce token, will be used to calculate bounce clicks from monthly report */ + let bounceToken = undefined + if (userProfile?.mailToken) { + bounceToken = userProfile.mailToken } - if (!url.includes('analysis')) { - unsubscribeUrl = url + '/#/unsubscribe' - url = url + '/#/analysis' - if (token) { - url += '?token=' + token - } - } else { - unsubscribeUrl = url.replace('analysis', 'unsubscribe') + if (!analysisLink.includes('analysis')) { + analysisLink = analysisLink + '/#/analysis' + } + if (bounceToken) { + analysisLink += '?token=' + bounceToken + } + + let unsubscribeUrl = appLink + 'public' + const unsubscribeToken = await permissionsService.getShareCode() + if (unsubscribeToken) { + unsubscribeUrl += `?token=${unsubscribeToken}` } const monthComparisonText = await buildComparisonText(client, 'month') const yearComparisonText = await buildComparisonText(client, 'year') - const isInfo: boolean = monthlyReport.info !== '' - - const isServiceNews: boolean = + const isInfo = monthlyReport.info !== '' + const isServiceNews = monthlyReport.newsTitle !== '' && monthlyReport.newsContent !== '' - - const isPoll: boolean = - monthlyReport.question !== '' && monthlyReport.link !== '' + const isPoll = monthlyReport.question !== '' && monthlyReport.link !== '' const date = DateTime.local() .setZone('utc', { keepLocalTime: true }) @@ -253,7 +250,7 @@ const monthlyReportNotification = async ({ title: 'Infos & bilan consos', baseUrl: baseUrl, username: username, - clientUrl: url, + clientUrl: analysisLink, unsubscribeUrl: unsubscribeUrl, comparisonExist: monthComparisonText.length > 0 || yearComparisonText.length > 0, @@ -283,12 +280,13 @@ const monthlyReportNotification = async ({ currentMonth: getMonthNameWithPrep(date), previousYear: date.year - 1, currentYear: date.year, + previousMonthYear: date.month === 1 ? date.year - 1 : date.year, consoImageUrl: baseUrl + '/assets/multifluidConsumption.png', feedbackImageUrl: baseUrl + '/assets/feedback.png', }) const mailData = { - mode: 'noreply', + mode: 'campaign', subject: monthlyReport.subject, parts: [ { diff --git a/src/targets/vendor/assets/offline.html b/src/targets/vendor/assets/offline.html index f310b42c32a6ccea791d848a0deaf5c61340cbcc..eff28e28a50078ea94b7939c7a5f893ada385681 100644 --- a/src/targets/vendor/assets/offline.html +++ b/src/targets/vendor/assets/offline.html @@ -1,4 +1,4 @@ -<!DOCTYPE html> +<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> @@ -52,30 +52,7 @@ <nav></nav> <div class="container"> <section> - <svg - width="80" - height="80" - viewBox="0 0 16 16" - fill="none" - xmlns="http://www.w3.org/2000/svg" - > - <path - d="M8.01323 15.059C14.8544 12.3888 14.3227 8.59276 13.9682 2.93081C11.7705 2.8343 9.82099 2.15873 8.01323 1.03278C6.20546 2.15873 4.25592 2.8343 2.05825 2.93081C1.70378 8.59276 1.17209 12.3888 8.01323 15.059Z" - fill="#1B1C22" - /> - <path - d="M8.01325 0L7.54979 0.288665C5.85495 1.34429 4.05006 1.96586 2.01981 2.05502L1.23259 2.08959L1.18335 2.87604C1.16873 3.10958 1.15353 3.34193 1.13842 3.57294C0.97583 6.05878 0.823332 8.39029 1.50758 10.3994C2.29645 12.7158 4.12651 14.483 7.69452 15.8756L8.01325 16V15.059C1.44034 12.4935 1.67345 8.88869 2.01622 3.58822C2.03021 3.37192 2.04438 3.1528 2.05827 2.93081C4.25595 2.8343 6.20549 2.15873 8.01325 1.03277V0Z" - fill="#FFC600" - /> - <path - d="M8.01323 0L8.4767 0.288665C10.1715 1.34429 11.9764 1.96586 14.0067 2.05502L14.7939 2.08959L14.8431 2.87604C14.8578 3.10958 14.873 3.34193 14.8881 3.57294C15.0507 6.05878 15.2032 8.39029 14.5189 10.3994C13.73 12.7158 11.9 14.483 8.33197 15.8756L8.01323 16V15.059C14.5862 12.4935 14.353 8.88869 14.0103 3.58822C13.9963 3.37192 13.9821 3.1528 13.9682 2.93081C11.7705 2.8343 9.821 2.15873 8.01323 1.03277V0Z" - fill="#DB8300" - /> - <path - d="M5.85148 5.51416H6.16248C6.28668 5.51416 6.4058 5.56292 6.49363 5.64973C6.58146 5.73653 6.6308 5.85427 6.6308 5.97703V10.6758H5.38316V5.97703C5.38316 5.85427 5.4325 5.73653 5.52033 5.64973C5.60815 5.56292 5.72727 5.51416 5.85148 5.51416ZM8.01233 7.80214H8.32333C8.44754 7.80214 8.56666 7.85091 8.65448 7.93771C8.74231 8.02452 8.79165 8.14225 8.79165 8.26502V10.6758H7.54401V8.26502C7.54401 8.14225 7.59335 8.02452 7.68118 7.93771C7.76901 7.85091 7.88813 7.80214 8.01233 7.80214ZM10.302 6.91708H10.613C10.7372 6.91708 10.8563 6.96584 10.9441 7.05265C11.032 7.13945 11.0813 7.25719 11.0813 7.37995V10.6758H9.83366V7.37995C9.83366 7.25719 9.883 7.13945 9.97083 7.05265C10.0587 6.96584 10.1778 6.91708 10.302 6.91708Z" - fill="#FFC600" - /> - </svg> + <img src="./icon.svg" alt="logo Ecolyo" height="80px" width="80px" /> <p class="text-16-white">Hors ligne</p> <p class="text-16-white"> Vérifiez votre connexion pour lancer Ecolyo. diff --git a/src/utils/picto.spec.ts b/src/utils/picto.spec.ts index c7ba738b0fd74e0715b3e6f97ca47decbff83c09..72b3a75b4a4468aaddc59a1a51e2e1e27167dae5 100644 --- a/src/utils/picto.spec.ts +++ b/src/utils/picto.spec.ts @@ -1,14 +1,8 @@ import AddElecIcon from 'assets/icons/ico/add-elec.svg' import AddGasIcon from 'assets/icons/ico/add-gas.svg' import AddWaterIcon from 'assets/icons/ico/add-water.svg' -import iconEglWhiteLogo from 'assets/icons/visu/egl-logo-white.svg' -import iconEglLogo from 'assets/icons/visu/egl-logo.svg' import ElecParamIcon from 'assets/icons/visu/elec-param.svg' -import iconEnedisWhiteLogo from 'assets/icons/visu/enedis-logo-white.svg' -import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg' import GasParamIcon from 'assets/icons/visu/gas-param.svg' -import iconGrdfWhiteLogo from 'assets/icons/visu/grdf-logo-white.svg' -import iconGrdfLogo from 'assets/icons/visu/grdf-logo.svg' import MultiIcon from 'assets/icons/visu/multi-icon.svg' import WaterParamIcon from 'assets/icons/visu/water-param.svg' import { FluidType } from 'enums' @@ -18,7 +12,7 @@ import GasSmallIcon from '../assets/icons/visu/gas-small.svg' import GasIcon from '../assets/icons/visu/gas.svg' import WaterSmallIcon from '../assets/icons/visu/water-small.svg' import WaterIcon from '../assets/icons/visu/water.svg' -import { getAddPicto, getParamPicto, getPartnerPicto, getPicto } from './picto' +import { getAddPicto, getParamPicto, getPicto } from './picto' const unknownFluidType = 99 as FluidType @@ -114,35 +108,4 @@ describe('picto utils test', () => { expect(result).toBe(ElecParamIcon) }) }) - - describe('getPartnerPicto test', () => { - it('should return enedis logo icon', () => { - const result = getPartnerPicto('enedissgegrandlyon', false) - expect(result).toBe(iconEnedisLogo) - }) - it('should return white enedis logo icon', () => { - const result = getPartnerPicto('enedissgegrandlyon', true) - expect(result).toBe(iconEnedisWhiteLogo) - }) - it('should return egl logo icon', () => { - const result = getPartnerPicto('eglgrandlyon', false) - expect(result).toBe(iconEglLogo) - }) - it('should return white egl logo icon', () => { - const result = getPartnerPicto('eglgrandlyon', true) - expect(result).toBe(iconEglWhiteLogo) - }) - it('should return grdf logo icon', () => { - const result = getPartnerPicto('grdfgrandlyon', false) - expect(result).toBe(iconGrdfLogo) - }) - it('should return white grdf logo icon', () => { - const result = getPartnerPicto('grdfgrandlyon', true) - expect(result).toBe(iconGrdfWhiteLogo) - }) - it('should return default Icon', () => { - const result = getPartnerPicto('', false) - expect(result).toBe('') - }) - }) }) diff --git a/src/utils/picto.ts b/src/utils/picto.ts index 0c8ae28308923a3373a21fcf45e2f56e672a4fcc..f6f9d7be1f2fabed5ea377f9d0510aa1f7c28e88 100644 --- a/src/utils/picto.ts +++ b/src/utils/picto.ts @@ -3,20 +3,14 @@ import AddGasIcon from 'assets/icons/ico/add-gas.svg' import AddWaterIcon from 'assets/icons/ico/add-water.svg' import Disconnected from 'assets/icons/visu/disconnected-grey.svg' import DisconnectedActive from 'assets/icons/visu/disconnected.svg' -import iconEglWhiteLogo from 'assets/icons/visu/egl-logo-white.svg' -import iconEglLogo from 'assets/icons/visu/egl-logo.svg' import ElecUnactive from 'assets/icons/visu/elec-grey.svg' import ElecParamIcon from 'assets/icons/visu/elec-param.svg' import ElecSmallIcon from 'assets/icons/visu/elec-small.svg' import ElecIcon from 'assets/icons/visu/elec.svg' -import iconEnedisWhiteLogo from 'assets/icons/visu/enedis-logo-white.svg' -import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg' import GasUnactive from 'assets/icons/visu/gas-grey.svg' import GasParamIcon from 'assets/icons/visu/gas-param.svg' import GasSmallIcon from 'assets/icons/visu/gas-small.svg' import GasIcon from 'assets/icons/visu/gas.svg' -import iconGrdfWhiteLogo from 'assets/icons/visu/grdf-logo-white.svg' -import iconGrdfLogo from 'assets/icons/visu/grdf-logo.svg' import MultiUnactive from 'assets/icons/visu/multi-grey.svg' import Multi from 'assets/icons/visu/multi.svg' import WaterUnactive from 'assets/icons/visu/water-grey.svg' @@ -24,7 +18,6 @@ import WaterParamIcon from 'assets/icons/visu/water-param.svg' import WaterSmallIcon from 'assets/icons/visu/water-small.svg' import WaterIcon from 'assets/icons/visu/water.svg' import { FluidType } from 'enums' -import ConfigService from 'services/fluidConfig.service' /** * Return an icon corresponding to FluidType enum @@ -108,22 +101,3 @@ export function getNavPicto( return ElecIcon } } - -/** - * Return an partner icon corresponding to FluidType enum - * @param slug string - * @param blackLogo boolean - define the color of the logo (black or white) - */ -export function getPartnerPicto(slug: string, blackLogo = true) { - const fluidConfig = new ConfigService().getFluidConfig() - switch (slug) { - case fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug: - return blackLogo ? iconEnedisLogo : iconEnedisWhiteLogo - case fluidConfig[FluidType.WATER].konnectorConfig.slug: - return blackLogo ? iconEglLogo : iconEglWhiteLogo - case fluidConfig[FluidType.GAS].konnectorConfig.slug: - return blackLogo ? iconGrdfLogo : iconGrdfWhiteLogo - default: - return '' - } -} diff --git a/src/utils/utils.spec.ts b/src/utils/utils.spec.ts index 1fe7e5944fb3ec95055b854411e2044d96d97af3..3fd5c09ab54600a8af02d745bd5cde7390449d59 100644 --- a/src/utils/utils.spec.ts +++ b/src/utils/utils.spec.ts @@ -10,6 +10,8 @@ import { FluidStatus } from 'models' import { formatListWithAnd, formatNumberValues, + formatOffPeakHours, + formatTwoDigits, getChallengeTitleWithLineReturn, getFluidName, getFluidType, @@ -20,6 +22,10 @@ import { getMonthNameWithPrep, getSeason, isKonnectorActive, + isValidOffPeakHours, + parseOffPeakHours, + roundOffPeakHours, + splitOffPeakHours, } from './utils' describe('utils test', () => { @@ -245,4 +251,112 @@ describe('utils test', () => { ) }) }) + + describe('isValidOffPeakHours', () => { + it('should return true for valid off-peak hours format', () => { + expect(isValidOffPeakHours('4H00-6H00')).toBe(true) + expect(isValidOffPeakHours('14H26-18H20')).toBe(true) + expect(isValidOffPeakHours('0H00-23H59')).toBe(true) + }) + + it('should return false for invalid off-peak hours format', () => { + expect(isValidOffPeakHours('invalid')).toBe(false) // unexpected string + expect(isValidOffPeakHours('2H30')).toBe(false) // Missing end of range + expect(isValidOffPeakHours('2H60-6H00')).toBe(false) // Minutes out of range + expect(isValidOffPeakHours('24H00-6H00')).toBe(false) // Hour out of range + }) + }) + + describe('parseOffPeakHours', () => { + it('should return empty array', () => { + expect(parseOffPeakHours('')).toStrictEqual([]) + }) + it('should return single interval', () => { + expect(parseOffPeakHours('22H00-6H00')).toStrictEqual([ + { start: { hour: 22, minute: 0 }, end: { hour: 6, minute: 0 } }, + ]) + }) + it('should return two intervals', () => { + expect(parseOffPeakHours('3H00-8H00;13H30-16H30')).toStrictEqual([ + { start: { hour: 3, minute: 0 }, end: { hour: 8, minute: 0 } }, + { start: { hour: 13, minute: 30 }, end: { hour: 16, minute: 30 } }, + ]) + }) + it('should return empty array because range is incomplete', () => { + expect(parseOffPeakHours('3H00-')).toStrictEqual([]) + }) + it('should return empty array because time is not valid', () => { + expect(parseOffPeakHours('51H00-98H99')).toStrictEqual([]) + }) + }) + describe('formatTwoDigits', () => { + it('should return number with padding', () => { + expect(formatTwoDigits(5)).toBe('05') + }) + it('should return number without padding', () => { + expect(formatTwoDigits(42)).toBe('42') + }) + }) + describe('formatOffPeakHours', () => { + it('should format correctly', () => { + expect( + formatOffPeakHours({ + start: { hour: 2, minute: 0 }, + end: { hour: 10, minute: 30 }, + }) + ).toBe('02H00-10H30') + }) + }) + describe('splitOffPeakHours', () => { + it('should split off-peak hours that cross midnight', () => { + const offPeakHours = [ + { start: { hour: 22, minute: 0 }, end: { hour: 6, minute: 0 } }, + ] + const expectedSplitOffPeakHours = [ + { start: { hour: 22, minute: 0 }, end: { hour: 23, minute: 59 } }, + { start: { hour: 0, minute: 0 }, end: { hour: 6, minute: 0 } }, + ] + const result = splitOffPeakHours(offPeakHours) + expect(result).toEqual(expectedSplitOffPeakHours) + }) + it('should not split off-peak hours that do not cross midnight', () => { + const offPeakHours = [ + { start: { hour: 8, minute: 0 }, end: { hour: 12, minute: 0 } }, + ] + const result = splitOffPeakHours(offPeakHours) + expect(result).toEqual(offPeakHours) + }) + }) + describe('roundOffPeakHours', () => { + it('rounds off-peak hours to the nearest half-hour', () => { + const offPeakHours = [ + { start: { hour: 2, minute: 2 }, end: { hour: 10, minute: 58 } }, + { start: { hour: 1, minute: 58 }, end: { hour: 11, minute: 2 } }, + { start: { hour: 7, minute: 15 }, end: { hour: 14, minute: 45 } }, + { start: { hour: 1, minute: 30 }, end: { hour: 3, minute: 0 } }, + ] + const roundedOffPeakHours = roundOffPeakHours(offPeakHours) + expect(roundedOffPeakHours).toEqual([ + { start: { hour: 2, minute: 0 }, end: { hour: 11, minute: 0 } }, + { start: { hour: 2, minute: 0 }, end: { hour: 11, minute: 0 } }, + { start: { hour: 7, minute: 30 }, end: { hour: 15, minute: 0 } }, + { start: { hour: 1, minute: 30 }, end: { hour: 3, minute: 0 } }, + ]) + }) + it('rounds off-peak hours to midnight', () => { + const offPeakHours = [ + { start: { hour: 0, minute: 5 }, end: { hour: 4, minute: 0 } }, + { start: { hour: 23, minute: 55 }, end: { hour: 4, minute: 0 } }, + { start: { hour: 16, minute: 0 }, end: { hour: 23, minute: 55 } }, + { start: { hour: 16, minute: 0 }, end: { hour: 0, minute: 5 } }, + ] + const roundedOffPeakHours = roundOffPeakHours(offPeakHours) + expect(roundedOffPeakHours).toEqual([ + { start: { hour: 0, minute: 0 }, end: { hour: 4, minute: 0 } }, + { start: { hour: 0, minute: 0 }, end: { hour: 4, minute: 0 } }, + { start: { hour: 16, minute: 0 }, end: { hour: 23, minute: 59 } }, + { start: { hour: 16, minute: 0 }, end: { hour: 23, minute: 59 } }, + ]) + }) + }) }) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index c9a6cc15bc48281469b265b67584e60fb5736032..834c7463d74b9489b3aa142199de9e224d1d05d7 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -323,3 +323,149 @@ export const formatListWithAnd = (array: string[]) => { return array.join(', ') + ' et ' + lastElement } } + +export type OffPeakHours = { + start: { hour: number; minute: number } + end: { hour: number; minute: number } +} + +/** + * Check if a string is a valid off-peak hour format + * @example + * isValidOffPeakHours("6H15-14H15") => true + * isValidOffPeakHours("68H78_12Hab") => false + */ +export const isValidOffPeakHours = (range: string) => { + const offPeakHoursRegex = + /^(0?\d|1\d|2[0-3])H[0-5]?\d-(0?\d|1\d|2[0-3])H[0-5]?\d$/ + return offPeakHoursRegex.test(range) +} + +/** + * Parse the string representation of off-peak hours from Enedis to an array of time ranges object + */ +export const parseOffPeakHours = (timeString: string): OffPeakHours[] => { + const timeRanges = timeString.split(';') + if (!timeRanges.every(range => isValidOffPeakHours(range))) { + console.error(`Error parsing time range "${timeString}"`) + return [] + } + + const intervals: OffPeakHours[] = [] + + for (const range of timeRanges) { + const [startStr, endStr] = range.split('-') + + const startTime = DateTime.fromFormat(startStr, "H'H'mm") + const endTime = DateTime.fromFormat(endStr, "H'H'mm") + + intervals.push({ + start: { hour: startTime.hour, minute: startTime.minute }, + end: { hour: endTime.hour, minute: endTime.minute }, + }) + } + + return intervals +} + +/** + * Format a number into a 2-digits string, padded with 0 + * @example formatTwoDigits(5) returns "05" + */ +export const formatTwoDigits = (num: number): string => { + return num.toString().padStart(2, '0') +} + +/** + * Format off-peak hours object into a human-readable string + * @example formatOffPeakHours({ start: { hour: 2, minute: 0 }, end: { hour: 10, minute: 0 }}) returns "02H00-10H00" + */ +export const formatOffPeakHours = (offPeakHours: OffPeakHours): string => { + const { start, end } = offPeakHours + const startTime = `${formatTwoDigits(start.hour)}H${formatTwoDigits( + start.minute + )}` + const endTime = `${formatTwoDigits(end.hour)}H${formatTwoDigits(end.minute)}` + + return `${startTime}-${endTime}` +} + +/** + * Split off-peak hours that cross midnight + * @example The range "22H00-6H00" becomes "22H00-23H59" and "0H00-6H00" + */ +export const splitOffPeakHours = ( + offPeakHours: OffPeakHours[] +): OffPeakHours[] => { + return offPeakHours.reduce((acc: OffPeakHours[], offPeakHour) => { + if (offPeakHour.start.hour > offPeakHour.end.hour) { + acc.push({ + start: { + hour: offPeakHour.start.hour, + minute: offPeakHour.start.minute, + }, + end: { + hour: 23, + minute: 59, + }, + }) + acc.push({ + start: { + hour: 0, + minute: 0, + }, + end: { + hour: offPeakHour.end.hour, + minute: offPeakHour.end.minute, + }, + }) + } else { + acc.push(offPeakHour) + } + return acc + }, []) +} + +export const roundToNearestHalfHour = ( + hour: number, + minute: number, + isEnd: boolean +): { hour: number; minute: number } => { + let roundedMinute = Math.round(minute / 30) * 30 // Round to the nearest half-hour + let roundedHour = hour + + // If rounding to the next hour (except for midnight), adjust the hour and reset the minute + if (roundedMinute === 60 && roundedHour !== 23) { + roundedHour += 1 + roundedMinute = 0 + } + + // Don't round to midnight for the off-peak hours end, instead round to 23:59 + if ( + (roundedMinute === 60 && roundedHour === 23) || + (roundedMinute === 0 && roundedHour === 0) + ) { + if (isEnd) { + roundedHour = 23 + roundedMinute = 59 + } else { + roundedHour = 0 + roundedMinute = 0 + } + } + + return { hour: roundedHour, minute: roundedMinute } +} + +/** + * Round off-peak hours to the nearest half-hour + * @example "6H50-14H50" becomes "7H00-15H00" + */ +export const roundOffPeakHours = ( + offPeakHours: OffPeakHours[] +): OffPeakHours[] => { + return offPeakHours.map(({ start, end }) => ({ + start: roundToNearestHalfHour(start.hour, start.minute, false), + end: roundToNearestHalfHour(end.hour, end.minute, true), + })) +} diff --git a/tests/__mocks__/chartData.mock.ts b/tests/__mocks__/chartData.mock.ts index 904a31f3e66e6f54ed8426584bf31f2bfd108b60..470ebe5080d61b03dae89b1a8c1b3c5ad988f836 100644 --- a/tests/__mocks__/chartData.mock.ts +++ b/tests/__mocks__/chartData.mock.ts @@ -102,7 +102,7 @@ export const dataLoadArray: Dataload[] = [ valueDetail: null, }, { - date: DateTime.fromISO('2021-09-23T00:00:00.000Z', { + date: DateTime.fromISO('2021-09-24T00:00:00.000Z', { zone: 'utc', }), value: 12, @@ -110,7 +110,7 @@ export const dataLoadArray: Dataload[] = [ valueDetail: null, }, { - date: DateTime.fromISO('2021-09-23T00:00:00.000Z', { + date: DateTime.fromISO('2021-09-25T00:00:00.000Z', { zone: 'utc', }), value: 12, @@ -118,7 +118,7 @@ export const dataLoadArray: Dataload[] = [ valueDetail: null, }, { - date: DateTime.fromISO('2021-09-23T00:00:00.000Z', { + date: DateTime.fromISO('2021-09-26T00:00:00.000Z', { zone: 'utc', }), value: 12, diff --git a/tests/__mocks__/customPopup.mock.ts b/tests/__mocks__/customPopup.mock.ts index 9cb45df355382f8200bfad24f25afb6b471b695a..1bd3f361ec0b790965ba73e7e408e72359f34ea6 100644 --- a/tests/__mocks__/customPopup.mock.ts +++ b/tests/__mocks__/customPopup.mock.ts @@ -3,6 +3,7 @@ import { CustomPopup } from 'models' export const mockCustomPopup: CustomPopup = { popupEnabled: true, title: 'Bold title', + image: 'bullhorn', description: 'Interesting description', endDate: '2099-10-04T15:10:53.219+02:00', } @@ -10,6 +11,7 @@ export const mockCustomPopup: CustomPopup = { export const mockCustomPopupWithLink: CustomPopup = { popupEnabled: true, title: 'Bold title', + image: 'bullhorn', description: '<p>Allez voir la page <a href="{cozyUrl}ecogestures" target="_self">astuces</a> !!</p>', endDate: '2099-10-04T15:10:53.219+02:00', @@ -18,6 +20,7 @@ export const mockCustomPopupWithLink: CustomPopup = { export const mockCustomPopupOff: CustomPopup = { popupEnabled: false, title: '', + image: '', description: '', endDate: '2099-10-04T15:10:53.219+02:00', } @@ -25,6 +28,7 @@ export const mockCustomPopupOff: CustomPopup = { export const mockCustomPopupOutdated: CustomPopup = { popupEnabled: true, title: 'Hello', + image: 'bullhorn', description: 'Friend', endDate: '2000-10-04T15:10:53.219+02:00', } diff --git a/tests/__mocks__/profileType.mock.ts b/tests/__mocks__/profileType.mock.ts index 37580a53f4211e99059ea7d33a52d4103e5fa2b8..0ae825f44fc43e4ef3d6596526f180ced47e19ee 100644 --- a/tests/__mocks__/profileType.mock.ts +++ b/tests/__mocks__/profileType.mock.ts @@ -15,15 +15,13 @@ import { import { DateTime } from 'luxon' import { MonthlyForecast, ProfileType, ProfileTypeAnswer } from 'models' +const IS_LEAP_YEAR = DateTime.now().isInLeapYear + export const profileTypeData: ProfileType = { - _id: 'ed8a160e06431be15c8fdbb428000f6a', - _rev: '16-f829d012bf290a3f9257be592d8c65d8', - id: 'ed8a160e06431be15c8fdbb428000f6a', area: '64', coldWater: IndividualOrCollective.INDIVIDUAL, constructionYear: ConstructionYear.AFTER_1998, cookingFluid: 0, - facilitiesInstallation: 'none', floor: Floor.INTERMEDIATE_FLOOR, hasInstalledVentilation: ThreeChoicesAnswer.NO, hasReplacedHeater: ThreeChoicesAnswer.NO, @@ -75,9 +73,9 @@ export const mockMonthElectricSpecificConsumption = 175 export const mockMonthColdWaterConsumption = 4247 export const mockWaterRawNeeds = 2480 -export const mockWaterSpreadNeeds = 2701 +export const mockWaterSpreadNeeds = IS_LEAP_YEAR ? 2708 : 2701 export const mockMonthEcsConsumptionOther = 166 -export const mockMonthEcsConsumptionThermo = 110 +export const mockMonthEcsConsumptionThermo = IS_LEAP_YEAR ? 111 : 110 export const mockProfileType1: ProfileType = { housingType: HousingType.APARTMENT, @@ -104,7 +102,7 @@ export const mockProfileType1: ProfileType = { // For the month of February export const mockMonthConsumption1 = 1174 -export const mockMonthEcsConsumption1Solar = 134 +export const mockMonthEcsConsumption1Solar = IS_LEAP_YEAR ? 135 : 134 export const mockProfileType2: ProfileType = { housingType: HousingType.INDIVIDUAL_HOUSE, @@ -184,17 +182,17 @@ export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = { detailsMonthlyForecast: { coldWaterConsumption: null, cookingConsumption: 85, - ecsConsumption: 290, + ecsConsumption: IS_LEAP_YEAR ? 291 : 290, electricSpecificConsumption: null, heatingConsumption: null, }, fluidType: 2, - load: 375, - value: 42.038, + load: IS_LEAP_YEAR ? 376 : 375, + value: IS_LEAP_YEAR ? 42.15 : 42.038, }, ], month: 1, - totalValue: 844.764, + totalValue: IS_LEAP_YEAR ? 844.876 : 844.764, } export const mockTestProfile2: ProfileType = { @@ -226,13 +224,13 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = { detailsMonthlyForecast: { coldWaterConsumption: null, cookingConsumption: 34, - ecsConsumption: 248, + ecsConsumption: IS_LEAP_YEAR ? 249 : 248, electricSpecificConsumption: 151, heatingConsumption: 1237, }, fluidType: 0, - load: 1670, - value: 290.58, + load: IS_LEAP_YEAR ? 1671 : 1670, + value: IS_LEAP_YEAR ? 290.75 : 290.58, }, { detailsMonthlyForecast: { @@ -260,7 +258,7 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = { }, ], month: 1, - totalValue: 317.676, + totalValue: IS_LEAP_YEAR ? 317.846 : 317.676, } export const mockTestProfile3: ProfileType = { @@ -457,15 +455,15 @@ export const mockMonthlyForecastJanuaryTest1WithFullArrays: MonthlyForecast = { detailsMonthlyForecast: { coldWaterConsumption: null, cookingConsumption: 85, - ecsConsumption: 290, + ecsConsumption: IS_LEAP_YEAR ? 291 : 290, electricSpecificConsumption: null, heatingConsumption: null, }, fluidType: 2, - load: 375, - value: 42.038, + load: IS_LEAP_YEAR ? 376 : 375, + value: IS_LEAP_YEAR ? 42.15 : 42.038, }, ], month: 1, - totalValue: 567.234, + totalValue: IS_LEAP_YEAR ? 567.346 : 567.234, } diff --git a/tests/__mocks__/store/modal.state.mock.ts b/tests/__mocks__/store/modal.state.mock.ts index 1407ce08c87d174bd15e3b7d1d6d10f98e47c82a..db9bdb4a10e2193464256b0b73dd1b0618af745c 100644 --- a/tests/__mocks__/store/modal.state.mock.ts +++ b/tests/__mocks__/store/modal.state.mock.ts @@ -4,6 +4,7 @@ export const mockModalState: ModalState = { customPopupModal: { popupEnabled: false, title: '', + image: '', description: '', endDate: '', }, diff --git a/tests/__mocks__/usageEventsData.mock.ts b/tests/__mocks__/usageEventsData.mock.ts index d96ad448d38f992e294302ea5f114caf3ab4d897..baef2eb627af43f6e319df2e54ae65427f3ad506 100644 --- a/tests/__mocks__/usageEventsData.mock.ts +++ b/tests/__mocks__/usageEventsData.mock.ts @@ -4,16 +4,14 @@ import { UsageEvent, UsageEventEntity } from 'models' export const usageEventEntityData: UsageEventEntity = { _id: '0001', - type: UsageEventType.CONNECTION_EVENT, - context: 'test', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: '2020-10-10T08:08:08.008Z', aggregated: false, } export const usageEventData: UsageEvent = { _id: '0001', - type: UsageEventType.CONNECTION_EVENT, - context: 'test', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc', }), @@ -23,8 +21,7 @@ export const usageEventData: UsageEvent = { export const allUsageEventsData: UsageEvent[] = [ { _id: '0001', - type: UsageEventType.CONNECTION_EVENT, - context: 'desktop', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc', }), @@ -32,8 +29,8 @@ export const allUsageEventsData: UsageEvent[] = [ }, { _id: '0002', - type: UsageEventType.NAVIGATION_EVENT, - target: 'consumption', + type: UsageEventType.REPORT_FROM_EMAIL, + target: 'analysis', eventDate: DateTime.fromISO('2020-10-10T08:09:08.008Z', { zone: 'utc', }), @@ -41,8 +38,7 @@ export const allUsageEventsData: UsageEvent[] = [ }, { _id: '0003', - type: UsageEventType.CONNECTION_EVENT, - context: 'desktop', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: DateTime.fromISO('2020-10-11T08:08:08.008Z', { zone: 'utc', }), @@ -50,8 +46,8 @@ export const allUsageEventsData: UsageEvent[] = [ }, { _id: '0004', - type: UsageEventType.NAVIGATION_EVENT, - context: 'challenge', + type: UsageEventType.REPORT_FROM_EMAIL, + context: 'analysis', eventDate: DateTime.fromISO('2020-10-11T08:09:08.008Z', { zone: 'utc', }), @@ -59,44 +55,25 @@ export const allUsageEventsData: UsageEvent[] = [ }, ] -export const connectionEventEntitiesData: UsageEventEntity[] = [ +export const profileSetEventEntitiesData: UsageEventEntity[] = [ { _id: '0001', - type: UsageEventType.CONNECTION_EVENT, - context: 'desktop', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: '2020-10-10T08:08:08.008Z', aggregated: false, }, { _id: '0002', - type: UsageEventType.CONNECTION_EVENT, - context: 'desktop', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: '2020-10-11T08:08:08.008Z', aggregated: false, }, ] -export const connectionAttemptEGLError: UsageEventEntity = { - _id: '00078', - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: 'eglgrandlyon', - result: 'error', - eventDate: '2020-10-10T08:08:08.008Z', - aggregated: false, -} -export const connectionAttemptEGLSuccess: UsageEventEntity = { - _id: '00078', - type: UsageEventType.KONNECTOR_ATTEMPT_EVENT, - target: 'eglgrandlyon', - result: 'success', - eventDate: '2020-10-10T08:08:08.008Z', - aggregated: false, -} -export const connectionUsageEventsData: UsageEvent[] = [ +export const profileSetUsageEventsData: UsageEvent[] = [ { _id: '0001', - type: UsageEventType.CONNECTION_EVENT, - context: 'desktop', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc', }), @@ -104,8 +81,7 @@ export const connectionUsageEventsData: UsageEvent[] = [ }, { _id: '0002', - type: UsageEventType.CONNECTION_EVENT, - context: 'desktop', + type: UsageEventType.PROFILE_SET_EVENT, eventDate: DateTime.fromISO('2020-10-11T08:08:08.008Z', { zone: 'utc', }), diff --git a/yarn.lock b/yarn.lock index 372e6beb5093e45740caec5057df25156f51f2e3..421f54db99ad4410a9d3fd5ba71b3b365eb6a2b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,7 +7,7 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@adobe/css-tools@^4.3.0": +"@adobe/css-tools@^4.3.1": version "4.3.1" resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.1.tgz#abfccb8ca78075a2b6187345c26243c1a0842f28" integrity sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg== @@ -55,7 +55,7 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.10.4": +"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -73,6 +73,28 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/core@7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.0.tgz#a6fe5db77ebfb61e0da6c5c36aaf14aab07b2b44" + integrity sha512-FGgV2XyPoVtYDvbFXlukEWt13Afka4mBRQ2CoTsHxpgVGO6XfgtT6eI+WyjQRGGTL90IDkIVmme8riFCLZ8lUw== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.10.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.10.0" + "@babel/parser" "^7.10.0" + "@babel/template" "^7.10.0" + "@babel/traverse" "^7.10.0" + "@babel/types" "^7.10.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@7.16.12": version "7.16.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" @@ -114,28 +136,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d" @@ -166,6 +166,16 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.0" +"@babel/generator@^7.10.0", "@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/generator@^7.16.8", "@babel/generator@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a" @@ -175,7 +185,7 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.18.6", "@babel/generator@^7.2.2", "@babel/generator@^7.9.0": +"@babel/generator@^7.18.6", "@babel/generator@^7.2.2": version "7.18.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd" integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A== @@ -276,6 +286,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -299,6 +314,14 @@ "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -306,6 +329,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-member-expression-to-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz#44802d7d602c285e1692db0bad9396d007be2afc" @@ -447,11 +477,23 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-string-parser@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" @@ -487,6 +529,15 @@ "@babel/traverse" "^7.18.10" "@babel/types" "^7.18.10" +"@babel/helpers@^7.10.0": + version "7.23.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + "@babel/helpers@^7.16.7": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" @@ -496,7 +547,7 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helpers@^7.18.6", "@babel/helpers@^7.2.0", "@babel/helpers@^7.9.0": +"@babel/helpers@^7.18.6", "@babel/helpers@^7.2.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd" integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ== @@ -523,11 +574,16 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.2.2", "@babel/parser@^7.7.0", "@babel/parser@^7.9.0": +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.2.2", "@babel/parser@^7.7.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.6.tgz#845338edecad65ebffef058d3be851f1d28a63bc" integrity sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw== +"@babel/parser@^7.10.0", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/parser@^7.16.12", "@babel/parser@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1" @@ -1533,6 +1589,15 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/template@^7.10.0", "@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/template@^7.16.7", "@babel/template@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -1542,7 +1607,7 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/template@^7.18.6", "@babel/template@^7.2.2", "@babel/template@^7.3.3", "@babel/template@^7.8.6": +"@babel/template@^7.18.6", "@babel/template@^7.2.2", "@babel/template@^7.3.3": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== @@ -1551,7 +1616,7 @@ "@babel/parser" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.7.0", "@babel/traverse@^7.9.0": +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.7.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.6.tgz#a228562d2f46e89258efa4ddd0416942e2fd671d" integrity sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw== @@ -1567,6 +1632,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.10.0", "@babel/traverse@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.16.10", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08" @@ -1583,7 +1664,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.9.0": +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.18.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.7.tgz#a4a2c910c15040ea52cdd1ddb1614a65c8041726" integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ== @@ -1591,6 +1672,15 @@ "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" +"@babel/types@^7.10.0", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@babel/types@^7.16.8", "@babel/types@^7.18.10", "@babel/types@^7.18.9": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" @@ -1708,12 +1798,12 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@es-joy/jsdoccomment@~0.40.1": - version "0.40.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz#13acd77fb372ed1c83b7355edd865a3b370c9ec4" - integrity sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg== +"@es-joy/jsdoccomment@~0.41.0": + version "0.41.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz#4a2f7db42209c0425c71a1476ef1bdb6dcd836f6" + integrity sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw== dependencies: - comment-parser "1.4.0" + comment-parser "1.4.1" esquery "^1.5.0" jsdoc-type-pratt-parser "~4.0.0" @@ -1981,6 +2071,13 @@ dependencies: "@sinclair/typebox" "^0.24.1" +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + "@jest/source-map@^26.6.2": version "26.6.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" @@ -2087,6 +2184,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz#687cc2bbf243f4e9a868ecf2262318e2658873a1" integrity sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -2097,6 +2199,19 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.14" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" @@ -2540,6 +2655,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.43.tgz#2e2bce0e5e493aaf639beed0cd6c88cfde7dd3d7" integrity sha512-1orQTvtazZmsPeBroJjysvsOQCYV2yjWlebkSY38pl5vr2tdLjEJ+LoxITlGNZaH2RE19WlAwQMkH/7C14wLfw== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sindresorhus/fnv1a@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@sindresorhus/fnv1a/-/fnv1a-1.2.0.tgz#d554da64c406f3b62ad06dfce9efd537a4a55de4" @@ -2559,21 +2679,7 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@testing-library/dom@^8.0.0": - version "8.20.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f" - integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.1.3" - chalk "^4.1.0" - dom-accessibility-api "^0.5.9" - lz-string "^1.5.0" - pretty-format "^27.0.2" - -"@testing-library/dom@^9.3.3": +"@testing-library/dom@^9.0.0", "@testing-library/dom@^9.3.3": version "9.3.3" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5" integrity sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw== @@ -2587,12 +2693,12 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.1.3": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.3.tgz#443118c9e4043f96396f120de2c7122504a079c5" - integrity sha512-YzpjRHoCBWPzpPNtg6gnhasqtE/5O4qz8WCwDEaxtfnPO6gkaLrnuXusrGSPyhIGPezr1HM7ZH0CFaUTY9PJEQ== +"@testing-library/jest-dom@^6.1.4": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.1.4.tgz#cf0835c33bc5ef00befb9e672b1e3e6a710e30e3" + integrity sha512-wpoYrCYwSZ5/AxcrjLxJmCU6I5QAJXslEeSiMQqaWmP2Kzpd1LvF/qxmAIW2qposULGWq2gw30GgVNFLSc2Jnw== dependencies: - "@adobe/css-tools" "^4.3.0" + "@adobe/css-tools" "^4.3.1" "@babel/runtime" "^7.9.2" aria-query "^5.0.0" chalk "^3.0.0" @@ -2601,22 +2707,14 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react-hooks@^8.0.0": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@testing-library/react-hooks/-/react-hooks-8.0.1.tgz#0924bbd5b55e0c0c0502d1754657ada66947ca12" - integrity sha512-Aqhl2IVmLt8IovEVarNDFuJDVWVvhnr9/GCU6UUnrYXwgDFF9h2L2o2P9KBni1AST5sT6riAyoukFLyjQUgD/g== - dependencies: - "@babel/runtime" "^7.12.5" - react-error-boundary "^3.1.0" - -"@testing-library/react@^12.1.0": - version "12.1.5" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b" - integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg== +"@testing-library/react@^14.1.2": + version "14.1.2" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.1.2.tgz#a2b9e9ee87721ec9ed2d7cfc51cc04e474537c32" + integrity sha512-z4p7DVBTPjKM5qDZ0t5ZjzkpSNb+fZy1u6bzO7kk8oeGagpPCAtgh4cx1syrfp7a+QWkM021jGqjJaxJJnXAZg== dependencies: "@babel/runtime" "^7.12.5" - "@testing-library/dom" "^8.0.0" - "@types/react-dom" "<18.0.0" + "@testing-library/dom" "^9.0.0" + "@types/react-dom" "^18.0.0" "@testing-library/user-event@^14.5.1": version "14.5.1" @@ -2881,19 +2979,6 @@ "@types/d3-transition" "^2" "@types/d3-zoom" "^2" -"@types/eslint@^8.4.2": - version "8.4.3" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece" - integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "0.0.52" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" - integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== - "@types/file-saver@^2.0.5": version "2.0.5" resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" @@ -2919,11 +3004,6 @@ dependencies: "@types/node" "*" -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - "@types/history@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@types/history/-/history-5.0.0.tgz#29f919f0c8e302763798118f45b19cab4a886f14" @@ -2982,7 +3062,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== @@ -3035,7 +3115,7 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^2.0.0", "@types/prettier@^2.6.0": +"@types/prettier@^2.0.0": version "2.6.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a" integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg== @@ -3050,19 +3130,19 @@ resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== -"@types/react-dom@<18.0.0": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.21.tgz#85d56965483ce4850f5f03f9234e54a1f47786e5" - integrity sha512-3rQEFUNUUz2MYiRwJJj6UekcW7rFLOtmK7ajQP7qJpjNdggInl3I/xM4I3Hq1yYPdCGVMgax1gZsB7BBTtayXg== +"@types/react-dom@^18.0.0": + version "18.2.17" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.17.tgz#375c55fab4ae671bd98448dcfa153268d01d6f64" + integrity sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg== dependencies: - "@types/react" "^17" + "@types/react" "*" -"@types/react-dom@^16.9.8": - version "16.9.16" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" - integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== +"@types/react-dom@^18.2.11": + version "18.2.11" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58" + integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg== dependencies: - "@types/react" "^16" + "@types/react" "*" "@types/react-lottie@^1.2.3": version "1.2.6" @@ -3081,23 +3161,6 @@ hoist-non-react-statics "^3.3.0" redux "^4.0.0" -"@types/react-router-dom@^5.3.3": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.18" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3" - integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-transition-group@^4.2.0": version "4.4.5" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416" @@ -3114,19 +3177,10 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/react@^16", "@types/react@^16.9.15": - version "16.14.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.28.tgz#073258f3fe7bb80c748842c1f93aeaafe16dffad" - integrity sha512-83zBE6+XUVXsdL3iFzOyUewdauaU+KviKCHEGOgSW52coAuqW7tEKQM0E9+ZC0Zk6TELQ2/JgogPvp7FavzFwg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^17": - version "17.0.67" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.67.tgz#1c224738f203829a4692aa48e33a732c34fd014a" - integrity sha512-zE76EIJ0Y58Oy9yDX/9csb/NuKjt0Eq2YgWb/8Wxo91YmuLzzbyiRoaqJE9h8iDlsT7n35GdpoLomHlaB1kFbg== +"@types/react@^18.2.25": + version "18.2.25" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.25.tgz#99fa44154132979e870ff409dc5b6e67f06f0199" + integrity sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3199,16 +3253,6 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.10.0": - version "5.30.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.5.tgz#f667c34e4e4c299d98281246c9b1e68c03a92522" - integrity sha512-zj251pcPXI8GO9NDKWWmygP6+UjwWmrdf9qMW/L/uQJBM/0XbU2inxe5io/234y/RCvwpKEYjZ6c1YrXERkK4Q== - dependencies: - "@typescript-eslint/scope-manager" "5.30.5" - "@typescript-eslint/types" "5.30.5" - "@typescript-eslint/typescript-estree" "5.30.5" - debug "^4.3.4" - "@typescript-eslint/parser@^5.56.0": version "5.56.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.56.0.tgz#42eafb44b639ef1dbd54a3dbe628c446ca753ea6" @@ -3219,13 +3263,16 @@ "@typescript-eslint/typescript-estree" "5.56.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.30.5": - version "5.30.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.5.tgz#7f90b9d6800552c856a5f3644f5e55dd1469d964" - integrity sha512-NJ6F+YHHFT/30isRe2UTmIGGAiXKckCyMnIV58cE3JkHmaD6e5zyEYm5hBDv0Wbin+IC0T1FWJpD3YqHUG/Ydg== +"@typescript-eslint/parser@^6.7.5": + version "6.19.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.19.1.tgz#68a87bb21afaf0b1689e9cdce0e6e75bc91ada78" + integrity sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ== dependencies: - "@typescript-eslint/types" "5.30.5" - "@typescript-eslint/visitor-keys" "5.30.5" + "@typescript-eslint/scope-manager" "6.19.1" + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/typescript-estree" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" + debug "^4.3.4" "@typescript-eslint/scope-manager@5.56.0": version "5.56.0" @@ -3243,6 +3290,14 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" +"@typescript-eslint/scope-manager@6.19.1": + version "6.19.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz#2f527ee30703a6169a52b31d42a1103d80acd51b" + integrity sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w== + dependencies: + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" + "@typescript-eslint/type-utils@5.56.0": version "5.56.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz#e6f004a072f09c42e263dc50e98c70b41a509685" @@ -3253,11 +3308,6 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.30.5": - version "5.30.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.5.tgz#36a0c05a72af3623cdf9ee8b81ea743b7de75a98" - integrity sha512-kZ80w/M2AvsbRvOr3PjaNh6qEW1LFqs2pLdo2s5R38B2HYXG8Z0PP48/4+j1QHJFL3ssHIbJ4odPRS8PlHrFfw== - "@typescript-eslint/types@5.56.0": version "5.56.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.56.0.tgz#b03f0bfd6fa2afff4e67c5795930aff398cbd834" @@ -3268,18 +3318,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.30.5": - version "5.30.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.5.tgz#c520e4eba20551c4ec76af8d344a42eb6c9767bb" - integrity sha512-qGTc7QZC801kbYjAr4AgdOfnokpwStqyhSbiQvqGBLixniAKyH+ib2qXIVo4P9NgGzwyfD9I0nlJN7D91E1VpQ== - dependencies: - "@typescript-eslint/types" "5.30.5" - "@typescript-eslint/visitor-keys" "5.30.5" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" +"@typescript-eslint/types@6.19.1": + version "6.19.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.1.tgz#2d4c9d492a63ede15e7ba7d129bdf7714b77f771" + integrity sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg== "@typescript-eslint/typescript-estree@5.56.0": version "5.56.0" @@ -3307,6 +3349,20 @@ semver "^7.3.7" tsutils "^3.21.0" +"@typescript-eslint/typescript-estree@6.19.1": + version "6.19.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz#796d88d88882f12e85bb33d6d82d39e1aea54ed1" + integrity sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA== + dependencies: + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + "@typescript-eslint/utils@5.56.0": version "5.56.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.56.0.tgz#db64705409b9a15546053fb4deb2888b37df1f41" @@ -3335,14 +3391,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.30.5": - version "5.30.5" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.5.tgz#d4bb969202019d5d5d849a0aaedc7370cc044b14" - integrity sha512-D+xtGo9HUMELzWIUqcQc0p2PO4NyvTrgIOK/VnSH083+8sq0tiLozNRKuLarwHYGRuA6TVBQSuuLwJUDWd3aaA== - dependencies: - "@typescript-eslint/types" "5.30.5" - eslint-visitor-keys "^3.3.0" - "@typescript-eslint/visitor-keys@5.56.0": version "5.56.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz#f19eb297d972417eb13cb69b35b3213e13cc214f" @@ -3359,6 +3407,14 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" +"@typescript-eslint/visitor-keys@6.19.1": + version "6.19.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz#2164073ed4fc34a5ff3b5e25bb5a442100454c4c" + integrity sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ== + dependencies: + "@typescript-eslint/types" "6.19.1" + eslint-visitor-keys "^3.4.1" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -3648,7 +3704,7 @@ ansi-escapes@^3.2.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -3687,11 +3743,6 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -3716,11 +3767,6 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" - integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== - ansi-wrap@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" @@ -4532,6 +4578,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.2.2, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -5192,13 +5245,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-highlight@2.1.11: version "2.1.11" resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" @@ -5211,22 +5257,6 @@ cli-highlight@2.1.11: parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^16.0.0" -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - cli-width@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" @@ -5368,11 +5398,6 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -colorette@^2.0.16, colorette@^2.0.17: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -5428,15 +5453,10 @@ commander@^8.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.3.0.tgz#f619114a5a2d2054e0d9ff1b31d5ccf89255e26b" - integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== - -comment-parser@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.0.tgz#0f8c560f59698193854f12884c20c0e39a26d32c" - integrity sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw== +comment-parser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== common-tags@^1.4.0: version "1.8.2" @@ -6182,12 +6202,12 @@ cozy-release@1.10.0: dependencies: exec-sh "0.3.2" -cozy-scripts@6.3.10: - version "6.3.10" - resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-6.3.10.tgz#16028dee93b0d9f0d886204c13a2a7299f6c96b8" - integrity sha512-aUB1yYvNwXgyxjlYP8FSEYICQ3Y8nwPhTFP4dZyat4zwbcU+97+IbZIfVjjaX+IWpzg/qG94VCVrCyu/Rummfw== +cozy-scripts@8.1: + version "8.1.2" + resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-8.1.2.tgz#5ff1ef11328215f2955d8d7620992326fa86dcad" + integrity sha512-4MvcWim6nAAzSllnkQUsgXTkzKTvYnePk38kWS/14W5w7Ip0VZql0BtewWMc1Sm07yAcyik9Of/i1yX3CxcOQA== dependencies: - "@babel/core" "7.9.0" + "@babel/core" "7.10.0" "@babel/polyfill" "^7.10.4" autoprefixer "9.7.6" babel-core "7.0.0-bridge.0" @@ -7402,11 +7422,6 @@ duplicate-package-checker-webpack-plugin@^3.0.0: lodash "^4.17.4" semver "^5.4.1" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -7830,20 +7845,20 @@ eslint-plugin-jest@^27.2.3: dependencies: "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-jsdoc@^46.8.2: - version "46.8.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz#3e6b1c93e91e38fe01874d45da121b56393c54a5" - integrity sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ== +eslint-plugin-jsdoc@^47.0.2: + version "47.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-47.0.2.tgz#113a6370e623535e5c6e0a59a094ffdc253371ff" + integrity sha512-sIq81Pv+yrhhwY0m1JH79rdZRgDNunehv3S0Yv0UfewpoeJyPkODFn2o4o20nofVoI2tjku9/QBcCYUmmeWFXA== dependencies: - "@es-joy/jsdoccomment" "~0.40.1" + "@es-joy/jsdoccomment" "~0.41.0" are-docs-informative "^0.0.2" - comment-parser "1.4.0" + comment-parser "1.4.1" debug "^4.3.4" escape-string-regexp "^4.0.0" esquery "^1.5.0" is-builtin-module "^3.2.1" semver "^7.5.4" - spdx-expression-parse "^3.0.1" + spdx-expression-parse "^4.0.0" eslint-plugin-jsx-a11y@^6.8.0: version "6.8.0" @@ -7983,7 +7998,7 @@ eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.0.0, eslint-scope@^7.1.1: +eslint-scope@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== @@ -8030,7 +8045,7 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0: +eslint-visitor-keys@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== @@ -8239,16 +8254,7 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" -espree@^9.0.0, espree@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" - integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== - dependencies: - acorn "^8.7.1" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -espree@^9.6.0, espree@^9.6.1: +espree@^9.3.1, espree@^9.6.0, espree@^9.6.1: version "9.6.1" resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== @@ -8257,6 +8263,15 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== + dependencies: + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -8379,21 +8394,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^3.0.1" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - execa@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" @@ -9837,11 +9837,6 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== - human-signals@^4.3.0: version "4.3.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" @@ -9852,11 +9847,6 @@ human-size@^1.1.0: resolved "https://registry.yarnpkg.com/human-size/-/human-size-1.1.0.tgz#052562be999841c037022c20259990c56ea996f9" integrity sha512-87GIsh59t9qL2939KBKmnT/EfcFk1suakkHoTjHsdnXB/JEU0ibz+9HRiwMueGVhKuRGby6bOtQHd+mIt4BIAQ== -husky@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" - integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw== - hyphenate-style-name@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" @@ -10356,11 +10346,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -10913,10 +10898,10 @@ jest-jasmine2@^26.6.3: pretty-format "^26.6.2" throat "^5.0.0" -jest-junit@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-15.0.0.tgz#a47544ab42e9f8fe7ada56306c218e09e52bd690" - integrity sha512-Z5sVX0Ag3HZdMUnD5DFlG+1gciIFSy7yIVPhOdGUi8YJaI9iLvvBb530gtQL2CHmv0JJeiwRZenr0VrSR7frvg== +jest-junit@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-16.0.0.tgz#d838e8c561cf9fdd7eb54f63020777eee4136785" + integrity sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ== dependencies: mkdirp "^1.0.4" strip-ansi "^6.0.1" @@ -11592,49 +11577,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lilconfig@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" - integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== - lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -lint-staged@>=8: - version "13.0.3" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-13.0.3.tgz#d7cdf03a3830b327a2b63c6aec953d71d9dc48c6" - integrity sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.17" - commander "^9.3.0" - debug "^4.3.4" - execa "^6.1.0" - lilconfig "2.0.5" - listr2 "^4.0.5" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-inspect "^1.12.2" - pidtree "^0.6.0" - string-argv "^0.3.1" - yaml "^2.1.1" - -listr2@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.5" - through "^2.3.8" - wrap-ansi "^7.0.0" - load-json-file@^1.0.0, load-json-file@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -11803,16 +11750,6 @@ lodash@4.17.19: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - loglevel-colored-level-prefix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" @@ -12138,7 +12075,7 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -12229,6 +12166,13 @@ minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -13120,7 +13064,7 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.0, object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== @@ -13788,11 +13732,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pidtree@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" - integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== - pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -14181,25 +14120,23 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prettier-eslint@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-15.0.1.tgz#2543a43e9acec2a9767ad6458165ce81f353db9c" - integrity sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg== +prettier-eslint@^16.0.0: + version "16.3.0" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-16.3.0.tgz#8f7bbc863f35939948e386eafe72ffd653b2d80b" + integrity sha512-Lh102TIFCr11PJKUMQ2kwNmxGhTsv/KzUg9QYF2Gkw259g/kPgndZDWavk7/ycbRvj2oz4BPZ1gCU8bhfZH/Xg== dependencies: - "@types/eslint" "^8.4.2" - "@types/prettier" "^2.6.0" - "@typescript-eslint/parser" "^5.10.0" + "@typescript-eslint/parser" "^6.7.5" common-tags "^1.4.0" dlv "^1.1.0" eslint "^8.7.0" indent-string "^4.0.0" lodash.merge "^4.6.0" loglevel-colored-level-prefix "^1.0.0" - prettier "^2.5.1" - pretty-format "^23.0.1" + prettier "^3.0.1" + pretty-format "^29.7.0" require-relative "^0.8.7" - typescript "^4.5.4" - vue-eslint-parser "^8.0.1" + typescript "^5.2.2" + vue-eslint-parser "^9.1.0" prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -14213,16 +14150,16 @@ prettier@1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== -prettier@^2.5.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - prettier@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== +prettier@^3.0.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283" + integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ== + pretty-error@^2.0.2: version "2.1.2" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" @@ -14231,14 +14168,6 @@ pretty-error@^2.0.2: lodash "^4.17.20" renderkid "^2.0.4" -pretty-format@^23.0.1: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" @@ -14267,6 +14196,15 @@ pretty-format@^29.0.0, pretty-format@^29.0.3: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" @@ -14568,22 +14506,13 @@ react-chartjs-2@4.1.0: resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-4.1.0.tgz#2a123df16d3a987c54eb4e810ed766d3c03adf8d" integrity sha512-AsUihxEp8Jm1oBhbEovE+w50m9PVNhz1sfwEIT4hZduRC0m14gHWHd0cUaxkFDb8HNkdMIGzsNlmVqKiOpU74g== -react-dom@16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-error-boundary@^3.1.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-3.1.4.tgz#255db92b23197108757a888b01e5b729919abde0" - integrity sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA== - dependencies: - "@babel/runtime" "^7.12.5" + scheduler "^0.23.0" react-event-listener@^0.6.0: version "0.6.6" @@ -14849,16 +14778,6 @@ react-swipeable-views@^0.13.3: react-swipeable-views-utils "^0.13.9" warning "^4.0.1" -react-test-renderer@16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae" - integrity sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg== - dependencies: - object-assign "^4.1.1" - prop-types "^15.6.2" - react-is "^16.8.6" - scheduler "^0.19.1" - react-transition-group@^4.3.0, react-transition-group@^4.4.0: version "4.4.2" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" @@ -14886,14 +14805,12 @@ react-zlib-js@^1.0.4: resolved "https://registry.yarnpkg.com/react-zlib-js/-/react-zlib-js-1.0.5.tgz#7bb433e1a4ae53a8e6f361b3d36166baf5bbc60f" integrity sha512-TLcPdmqhIl+ylwOwlfm1WUuI7NVvhAv3L74d1AabhjyaAbmLOROTA/Q4EQ/UMCFCOjIkVim9fT3UZOQSFk/mlA== -react@16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" read-pkg-up@^1.0.1: version "1.0.1" @@ -15391,14 +15308,6 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -15419,11 +15328,6 @@ revalidator@0.1.x: resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" integrity sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg== -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -15509,13 +15413,6 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== - dependencies: - tslib "^2.1.0" - safe-array-concat@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" @@ -15604,13 +15501,12 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^0.4.0: version "0.4.7" @@ -15698,7 +15594,7 @@ semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semve dependencies: lru-cache "^6.0.0" -semver@^7.5.4: +semver@^7.3.6, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -15932,15 +15828,6 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -15950,14 +15837,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - slick@^1.12.2: version "1.12.2" resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" @@ -16085,7 +15964,7 @@ spdx-exceptions@^2.1.0: resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== -spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: +spdx-expression-parse@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== @@ -16093,6 +15972,14 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-license-ids@^3.0.0: version "3.0.11" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" @@ -16320,11 +16207,6 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -string-argv@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -16368,15 +16250,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - string.prototype.matchall@^4.0.2: version "4.0.7" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" @@ -16538,13 +16411,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -16924,7 +16790,7 @@ through2@^4.0.0: dependencies: readable-stream "3" -through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -17110,6 +16976,11 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -17257,16 +17128,16 @@ typescript@^4.3.5, typescript@^4.5.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== -typescript@^4.5.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== - typescript@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.2.tgz#891e1a90c5189d8506af64b9ef929fca99ba1ee5" integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw== +typescript@^5.2.2: + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + uglify-js@3.4.x: version "3.4.10" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f" @@ -17721,18 +17592,18 @@ vue-eslint-parser@^5.0.0: esquery "^1.0.1" lodash "^4.17.11" -vue-eslint-parser@^8.0.1: - version "8.3.0" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d" - integrity sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g== +vue-eslint-parser@^9.1.0: + version "9.4.2" + resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz#02ffcce82042b082292f2d1672514615f0d95b6d" + integrity sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ== dependencies: - debug "^4.3.2" - eslint-scope "^7.0.0" - eslint-visitor-keys "^3.1.0" - espree "^9.0.0" + debug "^4.3.4" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" esquery "^1.4.0" lodash "^4.17.21" - semver "^7.3.5" + semver "^7.3.6" vuvuzela@1.0.3: version "1.0.3" @@ -18293,11 +18164,6 @@ yaml@^1.10.0, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec" - integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw== - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"