From c54757e292eab5304d590f89c4191cd0fc7d4d13 Mon Sep 17 00:00:00 2001 From: Haupais Date: Tue, 20 Feb 2024 10:12:29 +0100 Subject: [PATCH] feat(refacto): code refactoring to remove empty response for status 400 --- API.md | 444 ++++++++-------- EcoSonar-API/README.md | 201 +++---- .../dataBase/bestPracticesRepository.js | 144 ++--- EcoSonar-API/dataBase/greenItRepository.js | 193 ++----- EcoSonar-API/dataBase/lighthouseRepository.js | 311 ++++------- EcoSonar-API/dataBase/projectsRepository.js | 107 ++-- .../dataBase/tempurlsProjectRepository.js | 1 - .../dataBase/urlsProjectRepository.js | 154 +++--- EcoSonar-API/dataBase/w3cRepository.js | 270 ++-------- EcoSonar-API/routes/app.js | 207 ++++---- EcoSonar-API/services/W3C/w3cAnalysis.js | 16 +- EcoSonar-API/services/analysisService.js | 37 +- EcoSonar-API/services/bestPracticesService.js | 18 +- .../services/crawler/crawlerService.js | 60 +-- EcoSonar-API/services/exportAuditService.js | 206 ++++---- .../services/format/bestPracticesSorting.js | 53 +- .../services/format/formatGreenItAnalysis.js | 95 ++-- .../format/formatLighthouseAnalysis.js | 163 +++--- .../services/format/formatW3cAnalysis.js | 106 ++-- .../greenit-analysis/analyseService.js | 10 +- .../greenit-analysis/greenit-analysis.js | 7 +- .../services/lighthouse/lighthouse.js | 9 +- .../loginProxyConfigurationService.js | 140 +++-- EcoSonar-API/services/procedureService.js | 37 +- EcoSonar-API/services/projectService.js | 220 ++++---- .../services/retrieveAnalysisService.js | 499 ++++++++++-------- .../services/retrieveBestPracticesService.js | 277 ++++++---- .../services/urlConfigurationService.js | 82 +-- EcoSonar-API/services/userJourneyService.js | 127 +++-- EcoSonar-API/utils/enumAudits.js | 6 +- EcoSonar-API/utils/playSelectors.js | 6 + .../utils/quick_wins_configuration.json | 3 + EcoSonar-SonarQube/README.md | 23 +- .../components/AnalysisPerUrlPanel.js | 11 +- .../components/EcoSonarAnalysisPage.js | 6 +- .../components/Accordion/Accordion.js | 6 +- .../components/Accordion/Procedure.js | 6 +- .../components/BestPracticesPage.js | 33 +- .../components/ConfigurationPage.js | 11 +- .../components/Crawler/CrawlerPage.js | 8 +- .../main/js/services/bestpracticesService.js | 18 +- .../src/main/js/services/configUrlService.js | 11 +- .../src/main/js/services/crawlerService.js | 10 +- .../src/main/js/services/ecoSonarService.js | 22 +- .../js/utils/bestPractices/greenItData.json | 146 +++++ .../lighthouseAccessibilityData.json | 272 ++++++++++ .../lighthousePerformanceData.json | 169 ++++++ README.md | 15 +- images/delete-login-for-project.webp | Bin 14548 -> 15070 bytes images/delete-proxy-for-project.webp | Bin 14694 -> 14780 bytes images/get-all-scores-projects.webp | Bin 29772 -> 31794 bytes images/get-average-all-scores-projects.webp | Bin 17336 -> 22684 bytes images/get-crawler-result.webp | Bin 14792 -> 13420 bytes images/get-login-for-project.webp | Bin 13232 -> 14166 bytes images/get-project-scores.webp | Bin 14032 -> 15806 bytes images/get-proxy-for-project.webp | Bin 14474 -> 13712 bytes images/get-urls-from-project.webp | Bin 13856 -> 15180 bytes images/get-user-flow-for-url.webp | Bin 13386 -> 15380 bytes images/retrieve-analysis-per-project.webp | Bin 12548 -> 14332 bytes images/retrieve-analysis-per-url.webp | Bin 15098 -> 16886 bytes .../retrieve-best-practices-per-project.webp | Bin 13908 -> 8160 bytes images/retrieve-best-practices-per-url.webp | Bin 15494 -> 10418 bytes ...rieve-procedure-saved-for-the-project.webp | Bin 12920 -> 8104 bytes 63 files changed, 2677 insertions(+), 2299 deletions(-) create mode 100644 EcoSonar-SonarQube/src/main/js/utils/bestPractices/greenItData.json create mode 100644 EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthouseAccessibilityData.json create mode 100644 EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthousePerformanceData.json diff --git a/API.md b/API.md index 96a010f..5b82da0 100644 --- a/API.md +++ b/API.md @@ -1,4 +1,4 @@ -**EcoSonar API** +# EcoSonar API New Postman Collection available with all endpoints : @@ -8,7 +8,46 @@ Swagger User Interface available at the link : `[ECOSONAR-API-URL]/swagger/` Locally, available at this address : `http://localhost:3002/swagger/` +# Summary + +- URL Configuration + - [GET URLs FROM PROJECT](#get-urls) + - [INSERT URLs IN PROJECT](#insert-urls) + - [DELETE URL IN PROJECT](#delete-url) + - [DELETE PROJECT](#delete-project) + - [LAUNCH CRAWLER](#launch-crawler) + - [GET CRAWLER RESULT](#get-crawler) +- Login Configuration + - [SAVE LOGIN FOR PROJECT](#save-login) + - [GET LOGIN FOR PROJECT](#get-login) + - [DELETE LOGIN FOR PROJECT](#delete-login) +- Proxy Configuration + - [SAVE PROXY FOR PROJECT](#save-proxy) + - [GET PROXY FOR PROJECT](#get-proxy) + - [DELETE PROXY FOR PROJECT](#delete-proxy) +- User Flow Configuration + - [SAVE USER FLOW FOR URL](#save-user-flow) + - [GET USER FLOW FOR URL](#get-user-flow) + - [DELETE USER FLOW for URL](#delete-user-flow) +- EcoSonar Analysis + - [EcoSonar LAUNCH ANALYSIS](#launch-analysis) + - [RETRIEVE ANALYSIS PER PROJECT](#get-analysis-project) + - [RETRIEVE ANALYSIS PER URL](#get-analysis-url) + - [GET PROJECT SCORES](#get-project-scores) + - [GET AVERAGE OF ALL SCORES FOR PROJECTS REGISTERED IN ECOSONAR AT A DEFINED DATE](#get-ecosonar-info) + - [GET ALL PROJECTS SCORES FROM DATE DEFINED](#get-projects-info) + - [RETRIEVE ECOSONAR AUDIT IN EXCEL FORMAT FOR PROJECT](#export-audit) + - [RETRIEVE BEST PRACTICES PER PROJECT](#get-best-practices-project) + - [RETRIEVE BEST PRACTICES PER URL](#get-best-practices-url) +- Procedure Configuration + - [SAVE PROCEDURE FOR THE PROJECT](#save-procedure) + - [RETRIEVE PROCEDURE SAVED FOR THE PROJECT](#get-procedure) +- EcoSonar Infos + - [GET VERSION](#get-version) + - [GET BEST PRACTICES DOCUMENTATION](#get-best-practices-docs) + --- + ## **EcoSonar URL Configuration - GET URLs FROM PROJECT** @@ -44,18 +83,12 @@ Locally, available at this address : `http://localhost:3002/swagger/` - **Error Response:** -When you don't have any URLs assigned to a project into EcoSonar - -- **Code:** 400 BAD REQUEST
- **Content:** `{ -"error": "Your project has no url assigned into EcoSonar. You must at least add one url if you want to analyse ecodesign practices." -}` +EcoSonar API is not able to request the MongoDB Database or an internal error occured -OR +- **Code:** 500 Internal Server Error
-EcoSonar API is not able to request to the MongoDB Database : -- **Code:** 500 Internal Server Error
+ ## **EcoSonar URL Configuration - INSERT URLs IN PROJECT** @@ -100,10 +133,12 @@ When you have validation errors in the list of urls you want to insert (url inva OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar URL Configuration - DELETE URL IN PROJECT** ![DELETE URL IN PROJECT](./images/delete-url-in-project.webp) @@ -146,10 +181,12 @@ When the url can't be found in your project OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar URL Configuration - DELETE PROJECT** ![DELETE PROJECT](./images/delete-project.webp) @@ -181,10 +218,12 @@ None - **Error Response:** -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar URL Configuration - LAUNCH CRAWLER** ![LAUNCH CRAWLER](./images/launch-crawler.webp) @@ -204,7 +243,7 @@ None - **Data Params** PROJECT_NAME should match to the Project Key defined in your Sonarqube Project. homepage_url is the home page of your website from where the crawler will start finding all pages within your website - save is a boolean value : if true, results will be saved in datatabse and pages will be audited by EcoSonar. If false, they will be saved in a temp collection to be reviewed by a user before being applied in EcoSonar configuration. + save is a boolean value : if true, results will be saved in datatabse and pages will be audited by EcoSonar. If false, they will be saved in a temporary collection to be reviewed by a user before being applied in EcoSonar configuration. `{ "projectName": "PROJECT_NAME", @@ -216,6 +255,8 @@ None - **Code:** 202
+ + ## **EcoSonar URL Configuration - GET CRAWLER RESULT** ![GET CRAWLER RESULT](./images/get-crawler-result.webp) @@ -249,15 +290,12 @@ None - **Error Response:** -EcoSonar API failed to get crawler results: - -- **Code:** 400 BAD REQUEST
- **Content:** `No crawled urls were saved for this project` - -OR +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar Login Configuration - SAVE LOGIN FOR PROJECT** ![SAVE LOGIN FOR PROJECT](./images/save-login-for-project.webp) @@ -292,10 +330,12 @@ OR - **Error Response:** -EcoSonar API is not able to save into the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar Login Configuration - GET LOGIN FOR PROJECT** ![GET LOGIN FOR PROJECT](./images/get-login-for-project.webp) @@ -330,19 +370,13 @@ EcoSonar API is not able to save into the MongoDB Database : - **Error Response:** -When you don't have any login registered for your project into EcoSonar - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "Your project does not have login saved into database." -}` - -OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar Login Configuration - DELETE LOGIN FOR PROJECT** ![DELETE LOGIN FOR PROJECT](./images/delete-login-for-project.webp) @@ -373,7 +407,7 @@ EcoSonar API is not able to request to the MongoDB Database : - **Error Response:** -When you don't have any login registered for your project into EcoSonar and you want still to delete it +When you don't have any login saved into database for your project into EcoSonar and you want still to delete it - **Code:** 400 BAD REQUEST
**Content:** `{ @@ -382,10 +416,12 @@ When you don't have any login registered for your project into EcoSonar and you OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar Proxy Configuration - SAVE PROXY FOR PROJECT** ![SAVE PROXY FOR PROJECT](./images/save-proxy-for-project.webp) @@ -420,10 +456,12 @@ EcoSonar API is not able to request to the MongoDB Database : - **Error Response:** -EcoSonar API is not able to save into the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar Proxy Configuration - GET PROXY FOR PROJECT** ![GET PROXY FOR PROJECT](./images/get-proxy-for-project.webp) @@ -458,19 +496,12 @@ EcoSonar API is not able to save into the MongoDB Database : - **Error Response:** -When you don't have any proxy registered for your project into EcoSonar - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "Your project does not have proxy configuration saved into database." -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar Proxy Configuration - DELETE PROXY FOR PROJECT** ![DELETE PROXY FOR PROJECT](./images/delete-proxy-for-project.webp) @@ -499,11 +530,24 @@ EcoSonar API is not able to request to the MongoDB Database : - **Code:** 200
-EcoSonar API is not able to request to the MongoDB Database : +- **Error Response:** + +When you don't have any proxy saved in database for your project into EcoSonar and you want still to delete it + +- **Code:** 400 BAD REQUEST
+ **Content:** `{ + "error": "Project not found" +}` + +OR + +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
-## **EcoSonar USER FLOW Configuration - SAVE USER FLOW for URL** + + +## **EcoSonar USER FLOW Configuration - SAVE USER FLOW FOR URL** ![SAVE USER FLOW for URL](./images/save-user-flow-for-url.webp) @@ -548,11 +592,13 @@ You want to add user flow to unexisting url : OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
-## **EcoSonar USER FLOW Configuration - GET USER FLOW for URL** + + +## **EcoSonar USER FLOW Configuration - GET USER FLOW FOR URL** ![GET USER FLOW for URL](./images/get-user-flow-for-url.webp) @@ -587,19 +633,13 @@ None - **Error Response:** -When you don't have any user flow registered for the url into EcoSonar -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "Your project does not have user flow saved into database." -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar USER FLOW Configuration - DELETE USER FLOW FOR URL** ![DELETE USER FLOW FOR URL](./images/delete-user-flow-for-url.webp) @@ -628,8 +668,23 @@ None EcoSonar API is not able to request to the MongoDB Database : +- **Error Response:** + +When you don't have a user flow saved in database for your url into EcoSonar and you want still to delete it + +- **Code:** 400 BAD REQUEST
+ **Content:** `{ + "error": "Url not found" +}` + +OR + +EcoSonar API is not able to request the MongoDB Database or an internal error occured + - **Code:** 500 Internal Server Error
+ + ## **EcoSonar LAUNCH ANALYSIS** ![LAUNCH ANALYSIS](./images/launch-analysis.webp) @@ -660,13 +715,15 @@ EcoSonar analysis is launched through this API call either directly with a curl - **Code:** 202
+ + ## **EcoSonar ANALYSIS - RETRIEVE ANALYSIS PER PROJECT** ![RETRIEVE ANALYSIS PER PROJECT](./images/retrieve-analysis-per-project.webp) - **URL** - `/api/project?projectName=` + `/api/greenit/project?projectName=` - **Method:** @@ -792,26 +849,12 @@ EcoSonar analysis is launched through this API call either directly with a curl - **Error Response:** -When no analysis has been done yet on your project - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "No analysis found for PROJECT_NAME" -}` - -OR - -When an error occured when generating the report - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "Error during generation of PROJECT_NAME analysis" -}` - -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar ANALYSIS - RETRIEVE ANALYSIS PER URL** ![RETRIEVE ANALYSIS PER URL](./images/retrieve-analysis-per-url.webp) @@ -944,19 +987,12 @@ EcoSonar API is not able to request to the MongoDB Database : - **Error Response:** -When no analysis has been done yet on your url - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "No lighthouse and greenit analysis found for url url_to_retrieve in project PROJECT_NAME" -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar ANALYSIS - GET PROJECT SCORES** ![GET PROJECT SCORES](./images/get-project-scores.webp) @@ -996,19 +1032,12 @@ Retrieve current scores from EcoIndex, Lighthouse Performance and Accessibility - **Error Response:** -When no analysis found for the project - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "No Analysis found for project PROJECT_NAME" -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar ANALYSIS - GET AVERAGE OF ALL SCORES FOR PROJECTS REGISTERED IN ECOSONAR AT A DEFINED DATE** ![GET AVERAGE OF ALL SCORES FOR PROJECTS REGISTERED IN ECOSONAR AT A DEFINED DATE](./images/get-average-all-scores-projects.webp) @@ -1059,10 +1088,12 @@ If date format is wrong OR -EcoSonar API is not able to request to the MongoDB Database or other internal error: +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar ANALYSIS - GET ALL PROJECTS SCORES FROM DATE DEFINED** ![GET ALL PROJECTS SCORES FROM DATE DEFINED](./images/get-all-scores-projects.webp) @@ -1138,10 +1169,12 @@ If date format is wrong OR -EcoSonar API is not able to request to the MongoDB Database or other internal error: +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar ANALYSIS - RETRIEVE ECOSONAR AUDIT IN EXCEL FORMAT FOR PROJECT** Retrieve audits from GreenIt-Analysis, Google Lighthouse and W3C Validator aggregated per project in an Excel format. @@ -1182,113 +1215,11 @@ When an error occured during file generation OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
-## **EcoSonar ANALYSIS - SAVE PROCEDURE FOR THE PROJECT** - -![SAVE PROCEDURE FOR THE PROJECT](./images/save-procedure-for-the-project.webp) - -Procedure in Ecosonar are the configuration chosen by delivery teams to sort the EcoSonar recommandations related to ecodesign. -You have 3 different configurations available in EcoSonar: - -- `scoreImpact` : best practices will be sorted by descending order of implementation (best practices not implemented returned first) -- `quickWins` : best practices will be sorted by ascending order of difficulty (best practices easy to implement returned first) -- `highestImpact` : best practices will be sorted by order of impact to improve EcoSonar scores (best practices most efficient returned first) - -* **URL** - -`/api/procedure` - -- **Method:** - - `POST` - -- **URL Params** - - None - -- **Data Params** - - PROJECT_NAME should match to the Project Key defined in your Sonarqube Project. - selected_procedure can take 3 values : `scoreImpact`, `quickWins`, `highestImpact` - - `{ - "projectName" : "PROJECT_NAME", - "selectedProcedure": "selected_procedure" -}` - -- **Success Response:** - - - **Code:** 200
- **Content:** `{ - "procedure": "quickWins" -}` - -- **Error Response:** - -When no procedure have been registered for your project - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "Procedure is not defined in project PROJECT_NAME" -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : - -- **Code:** 500 Internal Server Error
- -## **EcoSonar ANALYSIS - RETRIEVE PROCEDURE SAVED FOR THE PROJECT** - -![RETRIEVE PROCEDURE SAVED FOR THE PROJECT](./images/retrieve-procedure-saved-for-the-project.webp) - -Procedure in Ecosonar are the configuration chosen by delivery teams to sort the EcoSonar recommandations related to ecodesign. -This request will return you the procedure chosen for this project. - -- **URL** - -`/api/procedure?projectName=` - -- **Method:** - - `GET` - -- **URL Params** - - PROJECT_NAME should match to the Project Key defined in your Sonarqube Project. - - **Required:** - - `PROJECT_NAME=[string]` - -- **Data Params** - - None - -- **Success Response:** - - - **Code:** 200
- **Content:** `{ - "procedure": "quickWins" -}` - -- **Error Response:** - -When no procedure have been registered for your project - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "Procedure is not defined in project PROJECT_NAME" -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : - -- **Code:** 500 Internal Server Error
+ ## **EcoSonar ANALYSIS - RETRIEVE BEST PRACTICES PER PROJECT** @@ -1365,19 +1296,12 @@ Retrieve audits from GreenIt-Analysis and Google Lighthouse aggregated per proje - **Error Response:** -When no analysis has been done yet on your project - -- **Code:** 400 BAD REQUEST
- **Content:** `{ - "error": "No analysis found for PROJECT_NAME" -}` - -OR - -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + ## **EcoSonar ANALYSIS - RETRIEVE BEST PRACTICES PER URL** ![RETRIEVE BEST PRACTICES PER URL](./images/retrieve-best-practices-per-url.webp) @@ -1454,19 +1378,111 @@ Retrieve audits from GreenIt-Analysis and Google Lighthouse per url audited. - **Error Response:** -When no analysis has been done yet on your project +EcoSonar API is not able to request the MongoDB Database or an internal error occured + +- **Code:** 500 Internal Server Error
+ + + +## **EcoSonar ANALYSIS - SAVE PROCEDURE FOR THE PROJECT** + +![SAVE PROCEDURE FOR THE PROJECT](./images/save-procedure-for-the-project.webp) + +Procedure in Ecosonar are the configuration chosen by delivery teams to sort the EcoSonar recommandations related to ecodesign. +You have 3 different configurations available in EcoSonar: + +- `scoreImpact` : best practices will be sorted by descending order of implementation (best practices not implemented returned first) +- `quickWins` : best practices will be sorted by ascending order of difficulty (best practices easy to implement returned first) +- `highestImpact` : best practices will be sorted by order of impact to improve EcoSonar scores (best practices most efficient returned first) + +* **URL** + +`/api/procedure` + +- **Method:** + + `POST` + +- **URL Params** + + None + +- **Data Params** + + PROJECT_NAME should match to the Project Key defined in your Sonarqube Project. + selected_procedure can take 3 values : `scoreImpact`, `quickWins`, `highestImpact` + + `{ + "projectName" : "PROJECT_NAME", + "selectedProcedure": "selected_procedure" +}` + +- **Success Response:** + + - **Code:** 200
+ **Content:** `{ + "procedure": "quickWins" +}` + +- **Error Response:** + +When adding a non-registered procedure : - **Code:** 400 BAD REQUEST
**Content:** `{ - "error": "No analysis found for url url_to_retrieve into project PROJECT_NAME" + "error": "projects validation failed: procedure: `string` is not a valid enum value for path `procedure`." }` OR -EcoSonar API is not able to request to the MongoDB Database : +EcoSonar API is not able to request the MongoDB Database or an internal error occured - **Code:** 500 Internal Server Error
+ + +## **EcoSonar ANALYSIS - RETRIEVE PROCEDURE SAVED FOR THE PROJECT** + +![RETRIEVE PROCEDURE SAVED FOR THE PROJECT](./images/retrieve-procedure-saved-for-the-project.webp) + +Procedure in Ecosonar are the configuration chosen by delivery teams to sort the EcoSonar recommandations related to ecodesign. +This request will return you the procedure chosen for this project. + +- **URL** + +`/api/procedure?projectName=` + +- **Method:** + + `GET` + +- **URL Params** + + PROJECT_NAME should match to the Project Key defined in your Sonarqube Project. + + **Required:** + + `PROJECT_NAME=[string]` + +- **Data Params** + + None + +- **Success Response:** + + - **Code:** 200
+ **Content:** `{ + "procedure": "quickWins" +}` + +- **Error Response:** + +EcoSonar API is not able to request the MongoDB Database or an internal error occured + +- **Code:** 500 Internal Server Error
+ + + ## **EcoSonar Infos - GET VERSION** ![GET VERSION](./images/get-version.webp) @@ -1498,6 +1514,8 @@ EcoSonar API is not able to request to the MongoDB Database : - **Code:** 400 BAD REQUEST
+ + ## **EcoSonar Infos - GET BEST PRACTICES DOCUMENTATION** ![GET BEST PRACTICES DOCUMENTATION](./images/get-best-practices-documentation.webp) diff --git a/EcoSonar-API/README.md b/EcoSonar-API/README.md index 87a5558..ca6795e 100644 --- a/EcoSonar-API/README.md +++ b/EcoSonar-API/README.md @@ -18,6 +18,11 @@ Then, the API can allow you to retrieve pre-formatted audit results using json f - [Create a MongoDB Community Server](#mongodb-server) - [Create a MongoDB Atlas Database](#mongodb-atlas) - [Create MongoDB Collections](#mongodb-collections) + - [Add Environment setup to API](#env-setup) + - [Database configuration](#database-env-var) + - [CORS Setup](#cors) + - [Enable W3C validator Analysis](#w3c-validator) + - [Setup User flow](#user-flow) - [API: option 1 - Node.js](#nodejs) - [Prerequisites](#prerequisites-node) - [Installation](#installation-node) @@ -25,11 +30,6 @@ Then, the API can allow you to retrieve pre-formatted audit results using json f - [Prerequisites](#prerequisites-docker) - [Installation](#installation-api) - [Our advice for Server Deployment](#docker-deployment) - - [Add Environment setup to API](#env-setup) - - [Database configuration](#database-env-var) - - [CORS Setup](#cors) - - [Enable W3C validator Analysis](#w3c-validator) - - [Setup User flow](#user-flow) - [API Endpoints](#api-endpoints) - [Usage Rights](#usage-rights) @@ -50,6 +50,15 @@ In both cases, it will be necessary to set up a new MongoDB database. ## MongoDB Database +You will need to choose the most adequate MongoDB database according to your infrastructure. +By default, we have implemented connection with + +- MongoDB Community Server : https://www.mongodb.com/try/download/community +- MongoDB Atlas : https://www.mongodb.com/atlas +- Azure CosmosDB : https://azure.microsoft.com/en-us/products/cosmos-db/#overview + +For any other MongoDB Database, you will need to set up a new database connection in the file `EcoSonar-API/configuration/database.js`. + ### Installation @@ -60,14 +69,7 @@ If the MongoDB database is already created, you can skip this step and retrieve #### Create a MongoDB Database -You will need to choose the most adequate MongoDB database according to your infrastructure. -By default, we have implemented connection with - -- MongoDB Community Server : https://www.mongodb.com/try/download/community -- MongoDB Atlas : https://www.mongodb.com/atlas -- Azure CosmosDB : https://azure.microsoft.com/en-us/products/cosmos-db/#overview - -For any other MongoDB Database, you will need to set up a new database connection in the file `EcoSonar-API/configuration/database.js`. +Locally, we advise you to use a MongoDB Community Server. @@ -126,90 +128,8 @@ However, if you chose Azure CosmoDB for MongoDB Database as database, then you w 4. projects : `_id` 5. urlsprojects : `_id`, `idKey` 6. w3cs : `_id`, `idW3cAnalysis`, `dateW3cAnalysis` -7. tempurlsprojects: `_id`, `idKey` - - - -## API: option 1 - Node.js - - - -### Prerequisites - -- Node.js https://nodejs.org/fr/ (at least v16) - - - -### Installation - -1. Retrieve source code : - -``` -git clone https://github.com/Accenture/EcoSonar -``` - -2. Go into the Folder EcoSonar-API - -3. Install npm packages : - -``` -npm install -``` - -4. Launch the API - -``` -npm start -``` - -API can be reached at: http://localhost:3000 - - - -## API: option 2 - Docker - - - -### Prerequisites - -- Docker (Note : for Windows, a licence is now required if you need to use Docker Desktop at an Enterprise Level) - - - -### Installation - -1. Retrieve source code : - -``` -git clone https://github.com/Accenture/EcoSonar -``` - -2. Go into the Folder EcoSonar-API -3. Build Docker image : - -``` -docker build -t imageName . -``` - -4. Launch a Docker Server : - -``` -docker container run -d -p 3000:3000 imageName -``` - -API can be reached at: http://localhost:3000 +7. tempurlsprojects: `_id` - - -#### Our advice for Server Deployment - -Instead, we recommend setting up a CI/CD pipeline with the following steps: - -1. Build the Docker image -2. Push the Docker image into the Docker Registry -3. Stop the server -4. Deploy the server using the newly imported image and correct API configuration -5. Start the server @@ -303,6 +223,95 @@ If your projects require to set up a user flow to access some of your web pages, ECOSONAR_ENV_USER_JOURNEY_ENABLED = `true`or `false` ``` + + + +## API: option 1 - Node.js + + + +### Prerequisites + +- Node.js https://nodejs.org/fr/ (at least v16) + + + +### Installation + +1. Retrieve source code : + +``` +git clone https://github.com/Accenture/EcoSonar +``` + +2. Go into the Folder EcoSonar-API + +3. Set up the environment variables accordingly. + +4. Install npm packages : + +``` +npm install +``` + +5. Launch the API + +``` +npm start +``` + +API can be reached at: http://localhost:3000 + + + +## API: option 2 - Docker + + + +### Prerequisites + +- Docker (Note : for Windows, a licence is now required if you need to use Docker Desktop at an Enterprise Level) + + + +### Installation + +1. Retrieve source code : + +``` +git clone https://github.com/Accenture/EcoSonar +``` + +2. Go into the Folder EcoSonar-API + +3. Set up the environment variables accordingly. + +4. Build Docker image : + +``` +docker build -t imageName . +``` + +5. Launch a Docker Server : + +``` +docker container run -d -p 3000:3000 imageName +``` + +API can be reached at: http://localhost:3000 + + + +#### Our advice for Server Deployment + +Instead, we recommend setting up a CI/CD pipeline with the following steps: + +1. Build the Docker image +2. Push the Docker image into the Docker Registry +3. Stop the server +4. Deploy the server using the newly imported image and correct API configuration +5. Start the server + # API Endpoints diff --git a/EcoSonar-API/dataBase/bestPracticesRepository.js b/EcoSonar-API/dataBase/bestPracticesRepository.js index c85000a..603f62a 100644 --- a/EcoSonar-API/dataBase/bestPracticesRepository.js +++ b/EcoSonar-API/dataBase/bestPracticesRepository.js @@ -1,5 +1,4 @@ const bestpractices = require('./models/bestpractices') -const urlsprojects = require('./models/urlsprojects') const SystemError = require('../utils/SystemError') const BestPracticesRepository = function () { @@ -8,8 +7,9 @@ const BestPracticesRepository = function () { * @param {Array} reports array containing the result of greenIt analysis (including metrics and best practices) */ this.insertBestPractices = async function (reports) { - if (reports.length > 0) { reports = checkValues(reports) } - + if (reports.length > 0) { + reports = checkValues(reports) + } reports = reports.map((report) => replaceDotWithUnderscoreInKeys(report)) return new Promise((resolve, reject) => { @@ -21,8 +21,7 @@ const BestPracticesRepository = function () { }) .catch((error) => { console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) } else { console.log('None of the urls analyzed could be inserted') @@ -32,122 +31,57 @@ const BestPracticesRepository = function () { } /** - * deletion of one or more analysis of best practices on the table bestPractices - * @param {string} projectNameReq + * Deletion of all best practices recommendation for a url + * @param {Object} url url to be deleted */ - this.delete = async function (projectNameReq) { - let empty = false - let errDelete = false - let resAnalysis - try { - const resList = await urlsprojects.find({ projectName: projectNameReq }, { idKey: 1 }) - if (resList.length === 0) { - empty = true - } else { - const listIdKey = resList.map((url) => url.idKey) - resAnalysis = await bestpractices.deleteMany({ idUrl: listIdKey }) - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - errDelete = true - } + this.deleteAnalysisFromUrl = async function (url) { return new Promise((resolve, reject) => { - if (errDelete) { - const systemError = new SystemError() - console.log('error during deletion of best practices analysis in ' + projectNameReq) - reject(systemError) - } else if (empty) { - console.log('Best practices analysis for ' + projectNameReq + ' not found') - reject(new Error('Best practices analysis for ' + projectNameReq + ' not found')) - } else { - if (resAnalysis.deletedCount >= 1) { - console.log('Best practices analysis of project ' + projectNameReq + ' where deleted') - } else { - console.log('no best practices analysis found in ' + projectNameReq) - } - resolve() - } + bestpractices.deleteMany({ idUrl: url[0].idKey }) + .then((result) => { + console.log(`DELETE URL - On best practices ${result.deletedCount} objects removed`) + resolve() + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** * find All analysis of best practices for a project on the table bestPractices - * @param {string} projectNameReq + * @param {Array} listIdKey list of urls id keys * @returns {Array} best practices reports for the last analysis run on project */ - this.findAll = async function (projectNameReq) { - let hasNoUrl = false - let systemError = null - let results = [] - let latestBestPracticeReports = [] - try { - const resList = await urlsprojects.find({ projectName: projectNameReq }, { idKey: 1 }) - if (resList.length === 0) { - hasNoUrl = true - } else { - let i = 0 - const listIdKey = [] - while (i < resList.length) { - listIdKey[i] = resList[i].idKey - i++ - } - results = await bestpractices - .find({ idUrl: listIdKey }, { bestPractices: 1, lighthousePerformanceBestPractices: 1, lighthouseAccessibilityBestPractices: 1, dateAnalysisBestPractices: 1 }) - .sort({ dateAnalysisBestPractices: 1 }) - const latestBestPracticeDate = new Date( - Math.max(...results.map(element => { return new Date(element.dateAnalysisBestPractices) })) - ) - latestBestPracticeReports = results.filter(element => element.dateAnalysisBestPractices.getTime() === latestBestPracticeDate.getTime()) - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log('error during generation of ' + projectNameReq + ' best practices analysis') - systemError = new SystemError() - } + this.findBestPracticesForProject = async function (listIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (hasNoUrl) { - reject(new Error('No analysis found for project' + projectNameReq)) - } else { - resolve(latestBestPracticeReports) - } + bestpractices + .find({ idUrl: listIdKey }, { bestPractices: 1, lighthousePerformanceBestPractices: 1, lighthouseAccessibilityBestPractices: 1, dateAnalysisBestPractices: 1 }) + .sort({ dateAnalysisBestPractices: 1 }) + .then((result) => resolve(result)) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** * find analysis of best practices for an URL on the table bestPractices - * @param {string} projectName - * @param {string} urlName - * @returns {Array} best practices reports for the last analysis run on URL + * @param {string} urlIdKey id key of the url saved + * @returns {Array} best practices report for the last analysis run on URL */ - this.find = async function (projectName, urlName) { - let hasNoUrl = false - let systemError = null - let result - try { - const resList = await urlsprojects.find({ projectName, urlName }, { idKey: 1 }) - if (resList.length < 1) { - hasNoUrl = true - } else { - result = await bestpractices - .find({ idUrl: resList[0].idKey }, { bestPractices: 1, lighthousePerformanceBestPractices: 1, lighthouseAccessibilityBestPractices: 1, dateAnalysisBestPractices: 1 }) - .sort({ dateAnalysisBestPractices: -1 }) - .limit(1) - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log(`Error during generation of ${urlName} best practices analysis`) - systemError = new SystemError() - } + this.findBestPracticesForUrl = async function (urlIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (hasNoUrl) { - reject(new Error(`No analysis found for url ${urlName} into project ${projectName}`)) - } else { - resolve(result) - } + bestpractices + .find({ idUrl: urlIdKey }, { bestPractices: 1, lighthousePerformanceBestPractices: 1, lighthouseAccessibilityBestPractices: 1, dateAnalysisBestPractices: 1 }) + .sort({ dateAnalysisBestPractices: -1 }) + .limit(1) + .then((result) => resolve(result)) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } @@ -184,7 +118,7 @@ function checkValues (arrayToInsert) { if (analysis.bestPractices) { arrayToInsertSanitized.push(analysis) } else { - console.log(`BEST PRACTICES INSERT - Best practices for url ${analysis.url} cannot be inserted due to presence of NaN or undefined values`) + console.warn(`BEST PRACTICES INSERT - Best practices for url ${analysis.url} cannot be inserted due to presence of NaN or undefined values`) } } return arrayToInsertSanitized diff --git a/EcoSonar-API/dataBase/greenItRepository.js b/EcoSonar-API/dataBase/greenItRepository.js index 9e9676f..87b8756 100644 --- a/EcoSonar-API/dataBase/greenItRepository.js +++ b/EcoSonar-API/dataBase/greenItRepository.js @@ -1,7 +1,6 @@ const greenits = require('./models/greenits') const urlsprojects = require('./models/urlsprojects') const SystemError = require('../utils/SystemError') -const formatGreenItAnalysis = require('../services/format/formatGreenItAnalysis') const GreenItRepository = function () { /** @@ -37,7 +36,7 @@ const GreenItRepository = function () { */ this.findAllAnalysis = async function () { return new Promise((resolve, reject) => { - greenits.find({}) + greenits.find({}, { dateGreenAnalysis: 1, ecoIndex: 1, idUrlGreen: 1 }) .then((res) => { resolve(res) }) @@ -50,159 +49,73 @@ const GreenItRepository = function () { /** * find last greenit analysis for one url - * @param {string} projectNameReq project name - * @param {string} urlNameReq URL of the page analyzed + * @param {string} urlIdKey id key of the url saved * @returns last greenit analysis of a url */ - this.findAnalysisUrl = async function (projectNameReq, urlNameReq) { - let res - let allAnalysis - let stringErr = null - let systemError = null - try { - res = await urlsprojects.find({ projectName: projectNameReq, urlName: urlNameReq }, { idKey: 1 }) - if (res.length === 0) { - stringErr = 'url : ' + urlNameReq + ' or project : ' + projectNameReq + ' not found' - } else { - allAnalysis = await greenits - .find({ idUrlGreen: res[0].idKey }, { domSize: 1, nbRequest: 1, responsesSize: 1, dateGreenAnalysis: 1, ecoIndex: 1, grade: 1 }) - .sort({ dateGreenAnalysis: 1 }) - if (allAnalysis.length === 0) { - stringErr = 'Greenit - no greenit analysis found for ' + urlNameReq - console.log(stringErr) - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log('An error occured while retrieving analysis') - systemError = new SystemError() - } + this.findAnalysisUrl = async function (urlIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - const lastAnalysis = { - domSize: allAnalysis[allAnalysis.length - 1].domSize, - nbRequest: allAnalysis[allAnalysis.length - 1].nbRequest, - responsesSize: allAnalysis[allAnalysis.length - 1].responsesSize, - ecoIndex: allAnalysis[allAnalysis.length - 1].ecoIndex, - grade: allAnalysis[allAnalysis.length - 1].grade - } - let i = 0 - let element - const deployments = [] - while (i < allAnalysis.length) { - element = { - dateGreenAnalysis: allAnalysis[i].dateGreenAnalysis, - domSize: allAnalysis[i].domSize, - nbRequest: allAnalysis[i].nbRequest, - responsesSize: allAnalysis[i].responsesSize, - ecoIndex: allAnalysis[i].ecoIndex - } - deployments.push(element) - i++ - } - const formattedDeployments = formatGreenItAnalysis.formatDeploymentsForGraphs(deployments) - const analysis = { deployments: formattedDeployments, lastAnalysis } - resolve(analysis) - } + greenits + .find({ idUrlGreen: urlIdKey }, { domSize: 1, nbRequest: 1, responsesSize: 1, dateGreenAnalysis: 1, ecoIndex: 1, grade: 1 }) + .sort({ dateGreenAnalysis: 1 }) + .then((result) => { + resolve(result) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** - * find last greenit analysis for one Project - * @param {string} projectNameReq name of the project - * @returns last greenit analysis of a project + * find greenit analysis for one Project + * @param {array} listIdKey list of urls id keys + * @returns greenit analysis of a project */ - this.findAnalysisProject = async function (projectNameReq) { - let stringErr = null - let systemError = null - let deployments, results - try { - const resList = await urlsprojects.find({ projectName: projectNameReq }, { idKey: 1 }) - if (resList.length === 0) { - stringErr = 'url or project :' + projectNameReq + ' not found' - } else { - // create a list of idKey - let i = 0 - const listIdKey = [] - while (i < resList.length) { - listIdKey[i] = resList[i].idKey - i++ - } - deployments = await greenits.find({ idUrlGreen: listIdKey }, { ecoIndex: 1, nbRequest: 1, domSize: 1, responsesSize: 1, dateGreenAnalysis: 1 }).sort({ dateGreenAnalysis: 1 }) - if (deployments.length !== 0) { - const dateLastAnalysis = deployments[deployments.length - 1].dateGreenAnalysis - const lastAnalysis = deployments.filter((greenitAnalysis) => greenitAnalysis.dateGreenAnalysis.getTime() === dateLastAnalysis.getTime()) - results = { deployments, lastAnalysis } - } else { - console.log('Greenit - no greenit analysis found for ' + projectNameReq) - results = { deployments: [], lastAnalysis: null } - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log('error during generation of ' + projectNameReq + ' analysis') - systemError = new SystemError() - } + this.findAnalysisProject = async function (listIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - resolve(results) - } + greenits.find({ idUrlGreen: listIdKey }, { ecoIndex: 1, nbRequest: 1, domSize: 1, responsesSize: 1, dateGreenAnalysis: 1 }) + .sort({ dateGreenAnalysis: 1 }) + .then((result) => { resolve(result) }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** - * find scores from last analysis for one Project - * @param {string} projectNameReq name of the project - * @returns scores of last analysis + * find scores from analysis for one Project + * @param {array} listIdKey list of urls id keys + * @returns scores of analysis */ - this.findScoreProject = async function (projectNameReq) { - let stringErr = null - let systemError = null - let analysis - let result = {} - try { - const resList = await urlsprojects.find({ projectName: projectNameReq }, { idKey: 1 }) - if (resList.length === 0) { - stringErr = 'url or project :' + projectNameReq + ' not found' - } else { - // create a list of idKey - let i = 0 - const listIdKey = [] - while (i < resList.length) { - listIdKey[i] = resList[i].idKey - i++ - } - analysis = await greenits.find({ idUrlGreen: listIdKey }, { ecoIndex: 1, dateGreenAnalysis: 1 }).sort({ dateGreenAnalysis: 1 }) - if (analysis.length !== 0) { - const dateLastAnalysis = analysis[analysis.length - 1].dateGreenAnalysis - const lastAnalysis = analysis.filter((greenitAnalysis) => greenitAnalysis.dateGreenAnalysis.getTime() === dateLastAnalysis.getTime()) - result = { scores: lastAnalysis } - } else { - console.log('Greenit - no greenit analysis found for ' + projectNameReq) - result = { scores: null } - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log('error during generation of ' + projectNameReq + ' analysis') - systemError = new SystemError() - } + this.findScoreProject = async function (listIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - resolve(result) - } + greenits.find({ idUrlGreen: listIdKey }, { ecoIndex: 1, dateGreenAnalysis: 1 }) + .sort({ dateGreenAnalysis: 1 }) + .then((result) => { resolve(result) }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) + }) + } + + /** + * Deletion of all greenit analysis for a url + * @param {Object} url url to be deleted + */ + this.deleteAnalysisFromUrl = async function (url) { + return new Promise((resolve, reject) => { + greenits.deleteMany({ idUrlGreen: url[0].idKey }) + .then((result) => { + console.log(`DELETE URL - On GreenIt ${result.deletedCount} objects removed`) + resolve() + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } diff --git a/EcoSonar-API/dataBase/lighthouseRepository.js b/EcoSonar-API/dataBase/lighthouseRepository.js index 30f9ae7..57946e3 100644 --- a/EcoSonar-API/dataBase/lighthouseRepository.js +++ b/EcoSonar-API/dataBase/lighthouseRepository.js @@ -1,7 +1,5 @@ const lighthouses = require('./models/lighthouses') -const urlsprojects = require('./models/urlsprojects') const SystemError = require('../utils/SystemError') -const formatLighthouseAnalysis = require('../services/format/formatLighthouseAnalysis') const LighthouseRepository = function () { /** @@ -17,10 +15,8 @@ const LighthouseRepository = function () { resolve() }) .catch((err) => { - console.error('\x1b[31m%s\x1b[0m', 'LIGHTHOUSE - error during insertion of analysis') - console.error('\x1b[31m%s\x1b[0m', err.message) - const systemError = new SystemError() - reject(systemError) + console.error('\x1b[31m%s\x1b[0m', err) + reject(new SystemError()) }) } else { console.log('LIGHTHOUSE - None of the urls analysed could be inserted') @@ -37,12 +33,17 @@ const LighthouseRepository = function () { */ this.findAllAnalysis = async function () { return new Promise((resolve, reject) => { - lighthouses.find({}) + lighthouses.find({}, { + dateLighthouseAnalysis: 1, + performance: 1, + accessibility: 1, + idUrlLighthouse: 1 + }) .then((res) => { resolve(res) }) .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error.message) + console.error('\x1b[31m%s\x1b[0m', error) reject(new SystemError()) }) }) @@ -50,238 +51,108 @@ const LighthouseRepository = function () { /** * find last analysis for one url in a project - * @param {string} projectNameReq name of the project - * @param {string} urlNameReq url id key representing the url saved in database + * @param {string} urlIdKey id key of the url saved * @returns last ligthouse analysis for url */ - this.findAnalysisUrl = async function (projectNameReq, urlNameReq) { - let urlMatching - let allAnalysis - let stringErr = null - let systemError = null - try { - urlMatching = await urlsprojects.find( - { projectName: projectNameReq, urlName: urlNameReq }, - { idKey: 1 } - ) - if (urlMatching.length === 0) { - stringErr = - 'url : ' + - urlNameReq + - ' or project : ' + - projectNameReq + - ' not found' - } else { - allAnalysis = await lighthouses - .find( - { idUrlLighthouse: urlMatching[0].idKey }, - { - dateLighthouseAnalysis: 1, - performance: 1, - accessibility: 1, - cumulativeLayoutShift: 1, - largestContentfulPaint: 1, - firstContentfulPaint: 1, - speedIndex: 1, - totalBlockingTime: 1, - interactive: 1 - } - ) - .sort({ dateLighthouseAnalysis: 1 }) - if (allAnalysis.length === 0) { - stringErr = 'Lighthouse - No lighthouse analysis found for ' + urlNameReq - console.log(stringErr) - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log('An error occured while retrieving lighthouse analysis') - systemError = new SystemError() - } + this.findAnalysisUrl = async function (urlIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - const lastAnalysis = { - dateLighthouseAnalysis: allAnalysis[allAnalysis.length - 1].dateLighthouseAnalysis, - performance: allAnalysis[allAnalysis.length - 1].performance, - accessibility: allAnalysis[allAnalysis.length - 1].accessibility, - cumulativeLayoutShift: allAnalysis[allAnalysis.length - 1].cumulativeLayoutShift, - largestContentfulPaint: allAnalysis[allAnalysis.length - 1].largestContentfulPaint, - firstContentfulPaint: allAnalysis[allAnalysis.length - 1].firstContentfulPaint, - speedIndex: allAnalysis[allAnalysis.length - 1].speedIndex, - totalBlockingTime: allAnalysis[allAnalysis.length - 1].totalBlockingTime, - interactive: allAnalysis[allAnalysis.length - 1].interactive - } - - let i = 0 - let element - const deployments = [] - while (i < allAnalysis.length) { - element = { - dateAnalysis: allAnalysis[i].dateLighthouseAnalysis, - performanceScore: allAnalysis[i].performance.score, - accessibilityScore: allAnalysis[i].accessibility.score, - cumulativeLayoutShift: allAnalysis[i].cumulativeLayoutShift.score, - largestContentfulPaint: allAnalysis[i].largestContentfulPaint.score, - firstContentfulPaint: allAnalysis[i].firstContentfulPaint.score, - speedIndex: allAnalysis[i].speedIndex.score, - totalBlockingTime: allAnalysis[i].totalBlockingTime.score, - interactive: allAnalysis[i].interactive.score + lighthouses + .find( + { idUrlLighthouse: urlIdKey }, + { + dateLighthouseAnalysis: 1, + performance: 1, + accessibility: 1, + cumulativeLayoutShift: 1, + largestContentfulPaint: 1, + firstContentfulPaint: 1, + speedIndex: 1, + totalBlockingTime: 1, + interactive: 1 } - deployments.push(element) - i++ - } - - const formattedDeployments = formatLighthouseAnalysis.formatDeploymentsForGraphs(deployments) - - const analysis = { deployments: formattedDeployments, lastAnalysis } - resolve(analysis) - } + ) + .sort({ dateLighthouseAnalysis: 1 }) + .then((result) => { + resolve(result) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** * find last lighthouse analysis for one Project - * @param {string} projectNameReq project name + * @param {array} urls list of urls id keys * @returns last lighthouse analysis for the project */ - this.findAnalysisProject = async function (projectNameReq) { - let stringErr = null - let systemError = null - let deployments, resultats - try { - const resList = await urlsprojects.find( - { projectName: projectNameReq }, - { idKey: 1 } - ) - if (resList.length === 0) { - stringErr = 'url or project :' + projectNameReq + ' not found' - } else { - // create a list of idKey - let i = 0 - const listIdKey = [] - while (i < resList.length) { - listIdKey[i] = resList[i].idKey - i++ - } - - deployments = await lighthouses - .find( - { idUrlLighthouse: listIdKey }, - { - performance: 1, - accessibility: 1, - largestContentfulPaint: 1, - cumulativeLayoutShift: 1, - firstContentfulPaint: 1, - speedIndex: 1, - totalBlockingTime: 1, - interactive: 1, - dateLighthouseAnalysis: 1 - } - ) - .sort({ dateLighthouseAnalysis: 1 }) - - if (deployments.length !== 0) { - const dateLastAnalysis = - deployments[deployments.length - 1].dateLighthouseAnalysis - const lastDeployment = deployments.filter( - (deployment) => - deployment.dateLighthouseAnalysis.getTime() === - dateLastAnalysis.getTime() - ) - resultats = { - deployments, - lastAnalysis: lastDeployment - } - } else { - console.log('no lighthouse analysis found for ' + projectNameReq) - resultats = { deployments: [], lastAnalysis: null } - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log( - 'error during generation of ' + projectNameReq + ' lighthouse analysis' - ) - systemError = new SystemError() - } + this.findAnalysisProject = async function (listIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - resolve(resultats) - } + lighthouses + .find( + { idUrlLighthouse: listIdKey }, + { + performance: 1, + accessibility: 1, + largestContentfulPaint: 1, + cumulativeLayoutShift: 1, + firstContentfulPaint: 1, + speedIndex: 1, + totalBlockingTime: 1, + interactive: 1, + dateLighthouseAnalysis: 1 + } + ) + .sort({ dateLighthouseAnalysis: 1 }) + .then((result) => { resolve(result) }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** * find Lighthouse Scores for one Project - * @param {string} projectNameReq project name - * @returns ligthouse score for last analysis in the project + * @param {array} listIdKey list of urls id keys + * @returns ligthouse score for analysis in the project */ - this.findScoreProject = async function (projectNameReq) { - let stringErr = null - let systemError = null - let deployments, result - try { - const resList = await urlsprojects.find( - { projectName: projectNameReq }, - { idKey: 1 } - ) - if (resList.length === 0) { - stringErr = 'url or project :' + projectNameReq + ' not found' - } else { - // create a list of idKey - const listIdKey = [] - for (let i = 0; i < resList.length; i++) { - listIdKey[i] = resList[i].idKey - } - deployments = await lighthouses - .find( - { idUrlLighthouse: listIdKey }, - { - performance: 1, - accessibility: 1, - dateLighthouseAnalysis: 1 - } - ) - .sort({ dateLighthouseAnalysis: 1 }) - if (deployments.length !== 0) { - const dateLastAnalysis = deployments[deployments.length - 1].dateLighthouseAnalysis - const lastDeployment = deployments.filter( - (deployment) => - deployment.dateLighthouseAnalysis.getTime() === - dateLastAnalysis.getTime() - ) - result = { - scores: lastDeployment + this.findScoreProject = async function (listIdKey) { + return new Promise((resolve, reject) => { + lighthouses + .find( + { idUrlLighthouse: listIdKey }, + { + performance: 1, + accessibility: 1, + dateLighthouseAnalysis: 1 } - } else { - console.log('Lighthouse - No lighthouse analysis found for ' + projectNameReq) - result = { scores: null } - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log( - 'error during generation of ' + projectNameReq + ' lighthouse analysis' - ) - systemError = new SystemError() - } + ) + .sort({ dateLighthouseAnalysis: 1 }) + .then((result) => { resolve(result) }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) + }) + } + + /** + * Deletion of all lighthouses analysis for a url + * @param {Object} url url to be deleted + */ + this.deleteAnalysisFromUrl = async function (url) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - resolve(result) - } + lighthouses.deleteMany({ idUrlLighthouse: url[0].idKey }) + .then((result) => { + console.log(`DELETE URL - On Lighthouse ${result.deletedCount} objects removed`) + resolve() + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } diff --git a/EcoSonar-API/dataBase/projectsRepository.js b/EcoSonar-API/dataBase/projectsRepository.js index 8f1f0c5..7faeb83 100644 --- a/EcoSonar-API/dataBase/projectsRepository.js +++ b/EcoSonar-API/dataBase/projectsRepository.js @@ -1,30 +1,7 @@ const projects = require('./models/projects') const SystemError = require('../utils/SystemError') -const urlsProject = require('./models/urlsprojects') const ProjectsRepository = function () { - /** - * get all projects in database that match a regexp - * @param {string} filterName regexp for the project name - * @returns an array with the projectName for all projects found - */ - this.findAllProjectsNames = async function (filterName) { - let query = {} - if (filterName !== null) { - query = { projectName: { $regex: new RegExp(filterName, 'i') } } - } - return new Promise((resolve, reject) => { - urlsProject.find(query) - .then((res) => { - resolve(res) - }) - .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error.message) - reject(new SystemError()) - }) - }) - } - /** * add a new procedure for a project * @param {string} projectName the name of the project @@ -35,12 +12,11 @@ const ProjectsRepository = function () { projects.create({ projectName, procedure }) .then(() => { resolve() }) .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) if (error._message === 'projects validation failed') { reject(new Error(error.message)) } - console.error('\x1b[31m%s\x1b[0m', error.message) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -57,12 +33,11 @@ const ProjectsRepository = function () { resolve() }) .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) if (error._message === 'projects validation failed') { reject(new Error(error.message)) } - console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -78,10 +53,8 @@ const ProjectsRepository = function () { projects.create({ projectName, login: loginMap }) .then(() => { resolve() }) .catch((error) => { - console.error('PROJECTS REPOSITORY - login creation failed') console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -96,10 +69,8 @@ const ProjectsRepository = function () { projects.create({ projectName, proxy }) .then(() => { resolve() }) .catch((error) => { - console.error('PROJECTS REPOSITORY - proxy creation failed') console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -107,19 +78,16 @@ const ProjectsRepository = function () { /** * Update login Configuration to be saved in the project * @param {string} projectName is the name of the project - * @param {string} procedure is the procedure to be saved in a specified enumeration * @param {JSON} loginCredentials is the login credentials to be set when analysing the project */ - this.updateLoginConfiguration = async function (projectName, procedure, loginCredentials) { + this.updateLoginConfiguration = async function (projectName, loginCredentials) { const loginMap = new Map(Object.entries(loginCredentials)) return new Promise((resolve, reject) => { - projects.updateOne({ projectName }, { login: loginMap, procedure }) + projects.updateOne({ projectName }, { login: loginMap }) .then(() => { resolve() }) .catch((error) => { - console.error('PROJECTS REPOSITORY - login update failed') console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -127,18 +95,15 @@ const ProjectsRepository = function () { /** * Update proxy configuration to be saved in the project * @param {string} projectName is the name of the project - * @param {string} procedure is the procedure to be saved in a specified enumeration * @param {JSON} proxy is the proxy configuration to be set when analysing the project */ - this.updateProxyConfiguration = async function (projectName, procedure, proxy) { + this.updateProxyConfiguration = async function (projectName, proxy) { return new Promise((resolve, reject) => { - projects.updateOne({ projectName }, { proxy, procedure }) + projects.updateOne({ projectName }, { proxy }) .then(() => { resolve() }) .catch((error) => { - console.error('PROJECTS REPOSITORY - proxy update failed') console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -149,23 +114,15 @@ const ProjectsRepository = function () { * @returns project settings */ this.getProjectSettings = async function (projectName) { - let systemError = null - let result - try { - result = await projects.findOne({ projectName }, { login: 1, procedure: 1, proxy: 1 }) - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) - console.log(`Error when retrieving project settings for ${projectName}`) - systemError = new SystemError() - } return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (result === null) { - reject(new Error(`Project Settings is not defined for project ${projectName}`)) - } else { - resolve(result) - } + projects.findOne({ projectName }, { login: 1, procedure: 1, proxy: 1 }) + .then((result) => { + resolve(result) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } @@ -176,21 +133,20 @@ const ProjectsRepository = function () { * @param {JSON} proxyRegistered proxy registered for the project */ this.deleteLoginCredentials = async function (projectNameReq, procedureRegistered, proxyRegistered) { - let systemError = null + let systemError = false try { - if (procedureRegistered !== undefined && proxyRegistered !== undefined) { + if (procedureRegistered !== undefined || proxyRegistered.ipAddress !== undefined || proxyRegistered.port !== undefined) { await projects.updateOne({ projectName: projectNameReq }, { $unset: { login: '' } }) } else { await projects.deleteOne({ projectName: projectNameReq }) } } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) - systemError = new SystemError() + console.error('\x1b[31m%s\x1b[0m', error) + systemError = true } return new Promise((resolve, reject) => { - if (systemError !== null) { - console.log('error during deletion of login credentials in ' + projectNameReq) - reject(systemError) + if (systemError) { + reject(new SystemError()) } else { resolve() } @@ -204,7 +160,7 @@ const ProjectsRepository = function () { * @param {JSON} loginRegistered login registered for the project */ this.deleteProxyConfiguration = async function (projectNameReq, procedureRegistered, loginRegistered) { - let systemError = null + let systemError = false try { if (procedureRegistered !== undefined || loginRegistered !== undefined) { await projects.updateOne({ projectName: projectNameReq }, { $unset: { proxy: '', ipAddress: '', port: '' } }) @@ -212,13 +168,12 @@ const ProjectsRepository = function () { await projects.deleteOne({ projectName: projectNameReq }) } } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) - systemError = new SystemError() + console.error('\x1b[31m%s\x1b[0m', error) + systemError = true } return new Promise((resolve, reject) => { - if (systemError !== null) { - console.log('error during deletion of proxy configuration in ' + projectNameReq) - reject(systemError) + if (systemError) { + reject(new SystemError()) } else { resolve() } diff --git a/EcoSonar-API/dataBase/tempurlsProjectRepository.js b/EcoSonar-API/dataBase/tempurlsProjectRepository.js index 7dfcda3..6e693bd 100644 --- a/EcoSonar-API/dataBase/tempurlsProjectRepository.js +++ b/EcoSonar-API/dataBase/tempurlsProjectRepository.js @@ -42,7 +42,6 @@ const TempUrlsProjectRepository = function () { /** * get urls crawled for the project in the collection temporaryurlsProject * @param {string} projectName project name - * @param {Array} urls urls crawled to be saved * @returns list of urls crawled */ this.findUrls = async function (name) { diff --git a/EcoSonar-API/dataBase/urlsProjectRepository.js b/EcoSonar-API/dataBase/urlsProjectRepository.js index 81fca3a..f1dd3de 100644 --- a/EcoSonar-API/dataBase/urlsProjectRepository.js +++ b/EcoSonar-API/dataBase/urlsProjectRepository.js @@ -1,9 +1,5 @@ const uniqid = require('uniqid') const urlsprojects = require('./models/urlsprojects') -const greenits = require('./models/greenits') -const bestpractices = require('./models/bestpractices') -const w3cs = require('./models/w3cs') -const lighthouses = require('./models/lighthouses') const SystemError = require('../utils/SystemError') const UrlsProjectRepository = function () { @@ -40,46 +36,27 @@ const UrlsProjectRepository = function () { } reject(errors) } else { - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) } }) }) } /** - * deletion on the table urlsProject - * @param {id url} key - */ - this.delete = async function (projectNameReq, urlNameReq) { - let empty = false - let errDelete = false - try { - const idKey = await urlsprojects.find({ projectName: projectNameReq, urlName: urlNameReq }, { idKey: 1 }) - if (idKey.length === 0) { - empty = true - } else { - await greenits.deleteMany({ idUrlGreen: idKey[0].idKey }) - await bestpractices.deleteOne({ idUrl: idKey[0].idKey }) - await w3cs.deleteMany({ idUrlW3c: idKey[0].idKey }) - await lighthouses.deleteMany({ idUrlLighthouse: idKey[0].idKey }) - await urlsprojects.deleteOne({ projectName: projectNameReq, urlName: urlNameReq }) - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - errDelete = true - } + * Deletion of an url + * @param {Object} url url to be deleted + */ + this.deleteUrl = async function (url) { return new Promise((resolve, reject) => { - if (errDelete) { - const systemError = new SystemError() - reject(systemError) - } else if (empty) { - console.log(urlNameReq + ' in ' + projectNameReq + ' not found') - reject(new Error(urlNameReq + ' in ' + projectNameReq + ' not found')) - } else { - console.log('analysis linked to url ' + urlNameReq + ' from ' + projectNameReq + ' were deleted as well as url') - resolve() - } + urlsprojects.deleteOne({ urlName: url[0].urlName }) + .then((result) => { + console.log(`DELETE URL - On URL PROJECT ${result.deletedCount} objects removed`) + resolve() + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } @@ -103,24 +80,18 @@ const UrlsProjectRepository = function () { /** * list all urls of a project - * @param {string} projectName name of the project - * @param {boolean} getUrlNameOnly retrieve only parameter url from the collection + * @param {string} projectNameReq name of the project */ - this.findAll = async function (projectNameReq, getUrlNameOnly) { + this.findAll = async function (projectNameReq) { return new Promise((resolve, reject) => { - let res - try { - if (getUrlNameOnly) { - res = urlsprojects.find({ projectName: projectNameReq }) - } else { - res = urlsprojects.find({ projectName: projectNameReq }, { urlName: 1 }) - } - resolve(res) - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) - } + urlsprojects.find({ projectName: projectNameReq }) + .then((result) => { + resolve(result) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } @@ -136,8 +107,7 @@ const UrlsProjectRepository = function () { .then(() => { resolve() }) .catch((error) => { console.error('\x1b[31m%s\x1b[0m', error) - const systemError = new SystemError() - reject(systemError) + reject(new SystemError()) }) }) } @@ -149,43 +119,63 @@ const UrlsProjectRepository = function () { * @returns user flow for the project and url defined */ this.getUserFlow = async function (projectName, urlName) { - let systemError = null - let result - try { - result = await urlsprojects.findOne({ projectName, urlName }, { idKey: 1, projectName: 1, urlName: 1, userFlow: 1 }) - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) - console.log(`Error when retrieving user flow for ${urlName}`) - systemError = new SystemError() - } return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else { - resolve(result) - } + urlsprojects.findOne({ projectName, urlName }, { idKey: 1, projectName: 1, urlName: 1, userFlow: 1 }) + .then((result) => { + resolve(result) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** - * Deletion of user flow for a specified url + * Deletion of user flow for a specified url in a project + * @param {string} projectName project name of the url * @param {string} urlName url to delete user flow */ this.deleteUserFlow = async function (projectName, urlName) { - let systemError = null - try { - await urlsprojects.updateOne({ projectName, urlName }, { $unset: { userFlow: '' } }) - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) - systemError = new SystemError() + return new Promise((resolve, reject) => { + urlsprojects.updateOne({ projectName, urlName }, { $unset: { userFlow: '' } }) + .then(() => { resolve() }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) + }) + } + + this.findUrl = async function (projectName, urlName) { + return new Promise((resolve, reject) => { + urlsprojects.find({ projectName, urlName }, { idKey: 1 }) + .then((result) => { resolve(result) }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) + }) + } + /** + * get all projects in database that match a regexp + * @param {string} filterName regexp for the project name + * @returns an array with the projectName for all projects found + */ + this.findAllProjectsNames = async function (filterName) { + let query = {} + if (filterName !== null) { + query = { projectName: { $regex: new RegExp(filterName, 'i') } } } return new Promise((resolve, reject) => { - if (systemError !== null) { - console.log('error during deletion of user flow for ' + urlName) - reject(systemError) - } else { - resolve() - } + urlsprojects.find(query) + .then((res) => { + resolve(res) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } } diff --git a/EcoSonar-API/dataBase/w3cRepository.js b/EcoSonar-API/dataBase/w3cRepository.js index 9264acc..5713358 100644 --- a/EcoSonar-API/dataBase/w3cRepository.js +++ b/EcoSonar-API/dataBase/w3cRepository.js @@ -1,8 +1,6 @@ const SystemError = require('../utils/SystemError') const w3cs = require('./models/w3cs') -const urlsprojects = require('./models/urlsprojects') -const formatW3cAnalysis = require('../services/format/formatW3cAnalysis') const W3cRepository = function () { /** @@ -18,10 +16,8 @@ const W3cRepository = function () { resolve() }) .catch((err) => { - console.error('\x1b[31m%s\x1b[0m', 'W3C - error during insertion of analysis') - console.error('\x1b[31m%s\x1b[0m', err.message) - const systemError = new SystemError() - reject(systemError) + console.error('\x1b[31m%s\x1b[0m', err) + reject(new SystemError()) }) } else { console.log('W3C - None of the urls analysed could be inserted') @@ -38,186 +34,57 @@ const W3cRepository = function () { */ this.findAllAnalysis = async function () { return new Promise((resolve, reject) => { - w3cs.find({}) + w3cs.find({}, { + idUrlW3c: 1, + dateW3cAnalysis: 1, + score: 1 + }) .then((res) => { resolve(res) }) .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error.message) + console.error('\x1b[31m%s\x1b[0m', error) reject(new SystemError()) }) }) } /** - * find last w3c analysis for one url in a project - * @param {string} projectNameReq project Name - * @param {string} urlNameReq url Name - * @returns last w3c analysis for the URL + * find w3c analysis for one url in a project + * @param {string} urlIdKey id key of the url saved + * @returns w3c analysis for the URL */ - this.findAnalysisUrl = async function (projectNameReq, urlNameReq) { - let urlMatching - let allAnalysis - let stringErr = null - let systemError = null - try { - urlMatching = await urlsprojects.find( - { projectName: projectNameReq, urlName: urlNameReq }, - { idKey: 1 } - ) - if (urlMatching.length === 0) { - stringErr = - 'url : ' + - urlNameReq + - ' or project : ' + - projectNameReq + - ' not found' - } else { - allAnalysis = await w3cs - .find( - { idUrlW3c: urlMatching[0].idKey }, - { - idUrlW3c: 1, - dateW3cAnalysis: 1, - score: 1, - w3cBestPractices: 1 - } - ) - .sort({ dateW3cAnalysis: 1 }) - if (allAnalysis.length === 0) { - stringErr = 'no w3c analysis found for ' + urlNameReq - console.log(stringErr) - } - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log('An error occured while retrieving W3C analysis') - systemError = new SystemError() - } + this.findAnalysisUrl = async function (urlIdKey) { return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (stringErr !== null) { - reject(new Error(stringErr)) - } else { - const lastAnalysis = [{ - idUrlW3c: allAnalysis[allAnalysis.length - 1].idUrlW3c, - dateW3cAnalysis: allAnalysis[allAnalysis.length - 1].dateW3cAnalysis, - score: allAnalysis[allAnalysis.length - 1].score, - w3cBestPractices: allAnalysis[allAnalysis.length - 1].w3cBestPractices - }] - const w3cLastAnalysis = formatW3cAnalysis.w3cLastAnalysisFormatted(lastAnalysis) - - let i = 0 - let element - const deployments = [] - while (i < allAnalysis.length) { - element = { - idUrlW3c: allAnalysis[i].idUrlW3c, - dateW3cAnalysis: allAnalysis[i].dateW3cAnalysis, - score: allAnalysis[i].score, - w3cBestPractices: allAnalysis[i].w3cBestPractices - } - deployments.push(element) - i++ + w3cs.find({ idUrlW3c: urlIdKey }, + { + idUrlW3c: 1, + dateW3cAnalysis: 1, + score: 1, + w3cBestPractices: 1 } - const formattedDeployments = formatW3cAnalysis.w3cAnalysisFormattedDeployments(deployments) - const analysis = { deployments: formattedDeployments, w3cLastAnalysis } - resolve(analysis) - } - }) - } - - /** - * find last w3c analysis for one Project - * @param {string} projectName project Name - * @returns last w3c analysis for the project - */ - this.findAnalysisProject = async function (projectName) { - let error = null - let systemError = null - - let deployments, result - try { - // Retrieving URLs for the project - const resList = await urlsprojects.find( - { projectName }, - { idKey: 1 } ) - - if (resList.length === 0) { - error = 'url or project :' + projectName + ' not found' - } else { - // Create a list of idKey - let i = 0 - const listIdKey = [] - while (i < resList.length) { - listIdKey[i] = resList[i].idKey - i++ - } - deployments = await w3cs - .find( - { idUrlW3c: listIdKey }, - { - idUrlW3c: 1, - dateW3cAnalysis: 1, - score: 1, - w3cBestPractices: 1 - } - ) - .sort({ dateW3cAnalysis: 1 }) - if (deployments.length !== 0) { - const dateLastAnalysis = - deployments[deployments.length - 1].dateW3cAnalysis - const lastDeployment = deployments.filter( - (deployment) => - deployment.dateW3cAnalysis.getTime() === - dateLastAnalysis.getTime() - ) - result = { - deployments, - lastAnalysis: lastDeployment - } - } else { - console.log('W3C - No W3C analysis found for ' + projectName) - result = { deployments: [], lastAnalysis: null } - } - } - } catch (err) { - console.error('\x1b[31m%s\x1b[0m', err) - console.log( - 'error during generation of ' + projectName + ' W3C analysis' - ) - systemError = new SystemError() - } - - return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (error !== null) { - reject(new Error(error)) - } else { - resolve(result) - } + .sort({ dateW3cAnalysis: 1 }) + .then((result) => { + resolve(result) + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } /** - * find last analysis of w3c best practices for an URL on the table w3cs - * @param {string} projectName name of the project - * @param {string} urlName url - * @returns last w3c analysis + * find w3c analysis for one Project + * @param {array} urls list of urls id keys + * @returns w3c analysis for the project */ - this.find = async function (projectName, urlName) { - let hasNoUrl = false - let systemError = null - let resultats - try { - const resList = await urlsprojects.find({ projectName, urlName }, { idKey: 1 }) - if (resList.length < 1) { - hasNoUrl = true - } else { - resultats = await w3cs.find({ idUrlW3c: resList[0].idKey }, + this.findAnalysisProject = async function (listIdKey) { + return new Promise((resolve, reject) => { + w3cs + .find( + { idUrlW3c: listIdKey }, { idUrlW3c: 1, dateW3cAnalysis: 1, @@ -225,60 +92,31 @@ const W3cRepository = function () { w3cBestPractices: 1 } ) - .sort({ dateW3cAnalysis: -1 }).limit(1) - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - console.log(`Error during generation of ${urlName} w3c best practices analysis`) - systemError = new SystemError() + .sort({ dateW3cAnalysis: 1 }) + .then((result) => { resolve(result) }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) } - return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) - } else if (hasNoUrl) { - reject(new Error(`W3C BEST PRACTICES PROJECT - No analysis found for url ${urlName} into project ${projectName}`)) - } else { - resolve(resultats) - } - }) + ) } /** - * Deletion of one or more w3c analysis on the w3cs collection - * @param {string} projectNameReq name of the project + * Deletion of all w3c analysis for a url + * @param {Object} url url to be deleted */ - this.delete = async function (projectNameReq) { - let empty = false - let errDelete = false - let resAnalysis - try { - const resList = await urlsprojects.find({ projectName: projectNameReq }, { idKey: 1 }) - if (resList.length === 0) { - empty = true - } else { - const listIdKey = resList.map(url => url.idKey) - resAnalysis = await w3cs.deleteMany({ idUrlW3c: listIdKey }) - } - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error) - errDelete = true - } + this.deleteAnalysisFromUrl = async function (url) { return new Promise((resolve, reject) => { - if (errDelete) { - const systemError = new SystemError() - console.log('error during deletion of w3c analysis in ' + projectNameReq) - reject(systemError) - } else if (empty) { - console.log('w3c analysis for ' + projectNameReq + ' not found') - reject(new Error('w3c analysis for ' + projectNameReq + ' not found')) - } else { - if (resAnalysis.deletedCount >= 1) { - console.log('w3c of project ' + projectNameReq + ' where deleted') - } else { - console.log('no w3c found in ' + projectNameReq) - } - resolve() - } + w3cs.deleteMany({ idUrlW3c: url[0].idKey }) + .then((result) => { + console.log(`DELETE URL - On W3C ${result.deletedCount} objects removed`) + resolve() + }) + .catch((error) => { + console.error('\x1b[31m%s\x1b[0m', error) + reject(new SystemError()) + }) }) } @@ -294,7 +132,7 @@ const W3cRepository = function () { resolve() }) .catch((error) => { - console.error('\x1b[31m%s\x1b[0m', error.message) + console.error('\x1b[31m%s\x1b[0m', error) reject(new SystemError()) }) }) diff --git a/EcoSonar-API/routes/app.js b/EcoSonar-API/routes/app.js index 671524b..e77bc8b 100644 --- a/EcoSonar-API/routes/app.js +++ b/EcoSonar-API/routes/app.js @@ -75,8 +75,6 @@ app.use((_req, res, next) => { * responses: * 200: * description: Success. - * 400: - * description: No url found for the project. * 500: * description: System error. */ @@ -89,11 +87,9 @@ app.get('/api/all', asyncMiddleware(async (req, res, _next) => { return res.status(200).json(results) }) .catch((error) => { - if (error instanceof SystemError) { - return res.status(500).send() - } - console.log('GET URLS PROJECT - No url retrieved for project ' + projectName) - return res.status(400).json({ error: error.message }) + console.error(error) + console.error('GET URLS PROJECT - retrieve all urls encountered an error for project ' + projectName) + return res.status(500).send() }) })) @@ -142,9 +138,11 @@ app.post('/api/insert', asyncMiddleware(async (req, res, _next) => { }) .catch((error) => { if (error instanceof SystemError) { + console.error(error) + console.error(`INSERT URLS PROJECT - insert urls into project ${projectName} encountered an error`) return res.status(500).send() } - console.log('INSERT URLS PROJECT - Validation failed') + console.error('INSERT URLS PROJECT - Validation failed') return res.status(400).json({ error }) }) })) @@ -187,10 +185,11 @@ app.delete('/api/delete', asyncMiddleware(async (req, res, _next) => { return res.status(200).send() }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.error('DELETE URLS PROJECT - delete url ' + urlName + ' from project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('DELETE URLS PROJECT - Url not found, could not be deleted') return res.status(400).json({ error: error.message }) }) })) @@ -203,7 +202,7 @@ app.delete('/api/delete', asyncMiddleware(async (req, res, _next) => { * tags: * - "Login Configuration" * summary: "Save Login For Project" - * description: Insert login credentials for a project. + * description: Insert how to login into the project in database * parameters: * - name: projectName * in: query @@ -242,10 +241,11 @@ app.post('/api/login/insert', asyncMiddleware(async (req, res, _next) => { return res.status(201).send() }) .catch((error) => { + console.error(error) + console.error('INSERT LOGIN CREDENTIALS - insert credentials into project ' + projectName + ' encountered an error') if (error instanceof SystemError) { return res.status(500).send() } - console.log('INSERT LOGIN CREDENTIALS - insertion failed') return res.status(400).json({ error }) }) })) @@ -295,10 +295,11 @@ app.post('/api/proxy/insert', asyncMiddleware(async (req, res, _next) => { return res.status(201).send() }) .catch((error) => { + console.error(error) + console.error('INSERT PROXY - proxy credentials into project ' + projectName + ' encountered an error') if (error instanceof SystemError) { return res.status(500).send() } - console.log('INSERT PROXY CREDENTIALS - insertion failed') return res.status(400).json({ error }) }) })) @@ -320,8 +321,6 @@ app.post('/api/proxy/insert', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: No login credentials retrieved. * 500: * description: System error. */ @@ -335,10 +334,12 @@ app.get('/api/login/find', asyncMiddleware(async (req, res, _next) => { }) .catch((error) => { if (error instanceof SystemError) { + console.error(error) + console.error('FIND LOGIN CREDENTIALS - credentials into project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('FIND LOGIN CREDENTIALS - failed') - return res.status(400).json({ error: error.message }) + console.warn('FIND LOGIN CREDENTIALS - credentials into project ' + projectName + ' are not saved') + return res.status(200).json({}) }) })) @@ -359,8 +360,6 @@ app.get('/api/login/find', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: No proxy configuration retrieved. * 500: * description: System error. */ @@ -374,10 +373,12 @@ app.get('/api/proxy/find', asyncMiddleware(async (req, res, _next) => { }) .catch((error) => { if (error instanceof SystemError) { + console.error(error) + console.error('FIND PROXY CREDENTIALS - credentials into project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('FIND PROXY CONFIGURATION - failed') - return res.status(400).json({ error: error.message }) + console.warn('FIND PROXY CREDENTIALS - credentials into project ' + projectName + ' are not saved') + return res.status(200).json({}) }) })) @@ -388,7 +389,7 @@ app.get('/api/proxy/find', asyncMiddleware(async (req, res, _next) => { * tags: * - "Login Configuration" * summary: "Delete Login For Project" - * description: Delete login credentials for a project. + * description: Delete login credentials saved in database for a project. * parameters: * - name: projectName * in: query @@ -399,7 +400,7 @@ app.get('/api/proxy/find', asyncMiddleware(async (req, res, _next) => { * 200: * description: Success. * 400: - * description: Delete login credentials failed. + * description: Project not found. * 500: * description: System error. */ @@ -412,10 +413,11 @@ app.delete('/api/login', asyncMiddleware(async (req, res, _next) => { return res.status(200).send() }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.error('DELETE LOGIN CREDENTIALS - delete credentials into project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('DELETE LOGIN CREDENTIALS - failed') return res.status(400).json({ error: error.message }) }) })) @@ -427,7 +429,7 @@ app.delete('/api/login', asyncMiddleware(async (req, res, _next) => { * tags: * - "Proxy Configuration" * summary: "Delete Proxy For Project" - * description: Delete proxy configuration for a project. + * description: Delete proxy configuration saved in database for a project. * parameters: * - name: projectName * in: query @@ -438,7 +440,7 @@ app.delete('/api/login', asyncMiddleware(async (req, res, _next) => { * 200: * description: Success. * 400: - * description: Delete proxy configuration failed. + * description: Project not found. * 500: * description: System error. */ @@ -451,10 +453,11 @@ app.delete('/api/proxy', asyncMiddleware(async (req, res, _next) => { return res.status(200).send() }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.error('DELETE PROXY CONFIGURATION - delete credentials into project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('DELETE PROXY CONFIGURATION - failed') return res.status(400).json({ error: error.message }) }) })) @@ -506,10 +509,12 @@ app.post('/api/user-flow/insert', asyncMiddleware(async (req, res, _next) => { return res.status(200).send() }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.error('INSERT USER FLOW - insert credentials for url ' + url + ' in project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('INSERT USER FLOW - insertion failed') + console.error('INSERT USER FLOW - insertion failed') return res.status(400).json({ error: error.message }) }) })) @@ -536,15 +541,13 @@ app.post('/api/user-flow/insert', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: No user flow retrieved. * 500: * description: System error. */ app.post('/api/user-flow/find', asyncMiddleware(async (req, res, _next) => { const url = req.body.url const projectName = req.body.projectName - console.log('FIND USER FLOW - credentials into url ' + url + ' in project ' + projectName) + console.log('FIND USER FLOW - get flow for url ' + url + ' in project ' + projectName) userJourneyService.getUserFlow(projectName, url) .then((userFlow) => { console.log('FIND USER FLOW - retrieve succeeded') @@ -552,10 +555,12 @@ app.post('/api/user-flow/find', asyncMiddleware(async (req, res, _next) => { }) .catch((error) => { if (error instanceof SystemError) { + console.error(error) + console.log('FIND USER FLOW - get flow for url ' + url + ' in project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('FIND USER FLOW - failed') - return res.status(400).json({ error: error.message }) + console.warn('FIND USER FLOW - flow for url ' + url + ' is not saved') + return res.status(200).json({}) }) })) @@ -596,10 +601,11 @@ app.delete('/api/user-flow', asyncMiddleware(async (req, res, _next) => { return res.status(200).send() }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.error('DELETE USER FLOW - delete user flow into url ' + url + ' in project ' + projectName + ' encountered an error') return res.status(500).send() } - console.log('USER FLOW - failed') return res.status(400).json({ error: error.message }) }) })) @@ -658,8 +664,6 @@ app.post('/api/greenit/insert', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: Analysis for url could not be retrieved. * 500: * description: System error. */ @@ -673,11 +677,9 @@ app.post('/api/greenit/url', asyncMiddleware(async (req, res, _next) => { return res.status(200).json(results) }) .catch((error) => { - if (error instanceof SystemError) { - return res.status(500).send() - } - console.log('GET ANALYSIS URL - Analysis for url could not be retrieved') - return res.status(400).json({ error: error.message }) + console.log(error) + console.log('GET ANALYSIS URL - retrieve analysis for url ' + urlName + ' in project ' + projectName + ' encountered an error') + return res.status(500).send() }) })) @@ -698,8 +700,6 @@ app.post('/api/greenit/url', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: Analysis for project could not be retrieved. * 500: * description: System error. */ @@ -711,11 +711,9 @@ app.get('/api/greenit/project', asyncMiddleware(async (req, res, _next) => { console.log('GET ANALYSIS PROJECT - Analysis for project retrieved') return res.status(200).json(results) }).catch((error) => { - if (error instanceof SystemError) { - return res.status(500).send() - } - console.log('GET ANALYSIS PROJECT - Analysis for project could not be retrieved') - return res.status(400).json({ error: error.message }) + console.error(error) + console.error('GET ANALYSIS PROJECT - retrieve analysis for project ' + projectName + ' encountered an erro') + return res.status(500).send() }) })) @@ -736,8 +734,6 @@ app.get('/api/greenit/project', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: Scores for project could not be retrieved. * 500: * description: System error. */ @@ -749,11 +745,9 @@ app.get('/api/ecosonar/scores', asyncMiddleware(async (req, res, _next) => { console.log('GET ECOSONAR PROJECT SCORES - Scores for project retrieved') return res.status(200).json(result) }).catch((error) => { - if (error instanceof SystemError) { - return res.status(500).send() - } - console.log('GET ECOSONAR PROJECT SCORES - Scores for project could not be retrieved') - return res.status(400).json({ error: error.message }) + console.error(error) + console.error('GET ECOSONAR PROJECT SCORES - retrieve scores for project ' + projectNameReq + ' encountered an error') + return res.status(500).send() }) })) @@ -768,7 +762,7 @@ app.get('/api/ecosonar/scores', asyncMiddleware(async (req, res, _next) => { * parameters: * - name: date * in: query - * description: endpoint will return the last analysis before that date, today if none + * description: endpoint will return the last analysis before that date, today if none, format YYYY-MM-DD * required: false * type: string * format: date @@ -777,7 +771,7 @@ app.get('/api/ecosonar/scores', asyncMiddleware(async (req, res, _next) => { * 200: * description: Success. * 400: - * description: Scores for projects could not be retrieved. + * description: Bad date format * 500: * description: System error. */ @@ -786,13 +780,15 @@ app.get('/api/ecosonar/info', asyncMiddleware(async (req, res, _next) => { console.log('GET AVERAGE PROJECT SCORE - retrieve all informations for all projects for the date defined') projectService.getAllInformationsAverage(date) .then((result) => { - console.log('GET AVERAGE PROJECT SCORES - Average of scores from all projects for the date defined') + console.log('GET AVERAGE PROJECT SCORES - Retrieved average of scores from all projects for the date defined') return res.status(200).json(result) }).catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.error('GET AVERAGE PROJECT SCORE - retrieve all informations for all projects for the date defined encountered an error') return res.status(500).send() } - console.log('GET AVERAGE PROJECT SCORES - Average of scores from all projects for the date defined could not be retrieved') + console.error('GET AVERAGE PROJECT SCORES - Average of scores from all projects for the date defined could not be retrieved') return res.status(400).json({ error: error.message }) }) })) @@ -808,7 +804,7 @@ app.get('/api/ecosonar/info', asyncMiddleware(async (req, res, _next) => { * parameters: * - name: date * in: query - * description: endpoint will return the last analysis before that date, today if none + * description: endpoint will return the last analysis before that date, today if none, format YYYY-MM-DD * required: false * type: string * format: date @@ -821,7 +817,7 @@ app.get('/api/ecosonar/info', asyncMiddleware(async (req, res, _next) => { * example: "my-project" * - name: filterAndSort * in: body - * description: filter and sorting configuration for projects scores of all projects registered in EcoSonar API. CATEGORY in filterScore can take the following enum ecoIndex, perfScore, accessScore, w3cScore. score is a value from 0 to 100, it will be the threshold for the CATEGORY. select takes the value upper or lower according if you want only project whose scores have an average value higher than score or lower. CATEGORY in sortBy can take the following enum ecoIndex, perfScore, accessScore, w3cScore and name. order can take the value asc or desc if you want to sort your projects according to the type. + * description: filter and sorting configuration to retrieve only specific projects registered in EcoSonar. For filtering (filterScore), it will retrieve only projects whose score is either above or below the threshold defined in the field score. cat can take the following values ecoIndex, perfScore, accessScore, w3cScore. Score is a value from 0 to 100 and select can take the values upper or lower. For sorting (sortBy), it will sort the list of projects according to the category and order chosen.type can take the following values ecoIndex, perfScore, accessScore, w3cScore and name. order can take the value asc or desc. * required: false * schema: * type: object @@ -867,7 +863,7 @@ app.get('/api/ecosonar/info', asyncMiddleware(async (req, res, _next) => { * 200: * description: Success. * 400: - * description: Scores for project could not be retrieved. + * description: Bad date format * 500: * description: System error. */ @@ -876,16 +872,18 @@ app.post('/api/project/all', asyncMiddleware(async (req, res, _next) => { const filterName = req.query.filterName ?? null const sortBy = req.body.sortBy ?? null const filterScore = req.body.filterScore ?? null - console.log('GET PROJECTS SCORES - Retrieve scores for each projects.') + console.log('GET PROJECTS SCORES - Retrieve scores for each project') projectService.getAllProjectInformations(date, sortBy, filterName, filterScore) .then((result) => { - console.log('GET PROJECTS SCORES - Average scores for each projects.') + console.log('GET PROJECTS SCORES - Average scores for each project retrieved') return res.status(200).json(result) }).catch((error) => { + console.error(error) if (error instanceof SystemError) { + console.log('GET PROJECTS SCORES - Retrieve scores for each project encountered an error') return res.status(500).send() } - console.log('GET PROJECT SCORES - Average scores for each each projects could not be retrieved') + console.log('GET PROJECT SCORES - Average scores for each each project could not be retrieved') return res.status(400).json({ error: error.message }) }) })) @@ -908,8 +906,6 @@ app.post('/api/project/all', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: Best practices analysis for project could not be retrieved. * 500: * description: System error. */ @@ -922,12 +918,9 @@ app.get('/api/bestPractices/project', asyncMiddleware(async (req, res, _next) => return res.status(200).json(results) }) .catch((error) => { - if (error instanceof SystemError) { - return res.status(500).send() - } - console.log('GET BEST PRACTICES PROJECT - Best practices analysis for project could not be retrieved') - console.log(error.message) - return res.status(400).json({ error: error.message }) + console.error(error) + console.error('GET BEST PRACTICES PROJECT - retrieve best practices analysis for project ' + projectName + ' encountered an error') + return res.status(500).send() }) })) @@ -955,8 +948,6 @@ app.get('/api/bestPractices/project', asyncMiddleware(async (req, res, _next) => * responses: * 200: * description: Success. - * 400: - * description: Best practices analysis for url could not be retrieved. * 500: * description: System error. */ @@ -970,11 +961,9 @@ app.post('/api/bestPractices/url', asyncMiddleware(async (req, res, _next) => { return res.status(200).json(results) }) .catch((error) => { - if (error instanceof SystemError) { - return res.status(500).send() - } - console.log('GET BEST PRACTICES URL - Best practices analysis for url could not be retrieved') - return res.status(400).json({ error: error.message }) + console.error(error) + console.log(`GET BEST PRACTICES URL - retrieve best practices analysis for url ${urlName} into project ${projectName} encountered an error`) + return res.status(500).send() }) })) @@ -1032,8 +1021,6 @@ app.post('/api/crawl', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: No urls crawled saved. * 500: * description: System error. */ @@ -1046,12 +1033,9 @@ app.get('/api/crawl', asyncMiddleware(async (req, res, _next) => { return res.status(200).json(results) }) .catch((error) => { - if (error instanceof SystemError) { - console.log(`CRAWLER - Urls for ${projectName} retrieving has encountered an error`) - return res.status(500).send() - } - console.log(`CRAWLER - No Urls saved for ${projectName}`) - return res.status(400).json(error.message) + console.error(error) + console.error(`CRAWLER - Retrieve all urls crawled for ${projectName} encountered an error`) + return res.status(500).send() }) })) @@ -1087,17 +1071,19 @@ app.get('/api/crawl', asyncMiddleware(async (req, res, _next) => { app.post('/api/procedure', asyncMiddleware(async (req, res, _next) => { const projectName = req.body.projectName const selectedProcedure = req.body.selectedProcedure + console.log(`POST PROCEDURE - Save procedure ${selectedProcedure} for project ${projectName}`) procedureService.saveProcedure(projectName, selectedProcedure) .then(() => { - console.log(`POST PROCEDURE - Procedure ${selectedProcedure} for project ${projectName} saved`) + console.log(`POST PROCEDURE - Procedure for project ${projectName} saved`) return res.status(200).send() }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { - console.log('POST PROCEDURE - Procedure saving has encountered an error') + console.error(`POST PROCEDURE - Save procedure ${selectedProcedure} for project ${projectName} encountered an error`) return res.status(500).send() } - console.log(`POST PROCEDURE PROJECT - Procedure ${selectedProcedure} for project ${projectName} could not be retrieved`) + console.error(`POST PROCEDURE PROJECT - Procedure for project ${projectName} could not be saved because procedure is incorrect`) return res.status(400).json({ error: error.message }) }) })) @@ -1119,25 +1105,21 @@ app.post('/api/procedure', asyncMiddleware(async (req, res, _next) => { * responses: * 200: * description: Success. - * 400: - * description: Procedure could not be retrieved. * 500: * description: System Error. */ app.get('/api/procedure', asyncMiddleware(async (req, res, _next) => { const projectName = req.query.projectName + console.log(`GET PROCEDURE - Get Procedure for project ${projectName}`) procedureService.getProcedure(projectName) .then((procedure) => { - console.log(`GET PROCEDURE - Project ${projectName} with ${procedure.procedure} retrieved`) + console.log(`GET PROCEDURE - Project ${projectName} retrieved`) return res.status(200).json(procedure) }) .catch((error) => { - if (error instanceof SystemError) { - console.log(`GET PROCEDURE - Procedure for project ${projectName} retrieving has encountered an error`) - return res.status(500).send() - } - console.log(`GET PROCEDURE - Procedure for project ${projectName} could not be retrieved`) - return res.status(400).json({ error: error.message }) + console.error(error) + console.error(`GET PROCEDURE - Get Procedure for project ${projectName} encountered an error`) + return res.status(500).send() }) })) @@ -1150,8 +1132,9 @@ app.post('/api/export', asyncMiddleware(async (req, res, _next) => { return res.status(200).send(auditExported) }) .catch((error) => { + console.error(error) if (error instanceof SystemError) { - console.log('POST EXCEL - Excel export has encountered an error') + console.log(`POST EXCEL - audit for project ${projectName} to be retrieved encountered an error`) return res.status(500).send() } console.log(`POST EXCEL PROJECT - Excel export for project ${projectName} could not be resolved`) @@ -1178,7 +1161,7 @@ app.get('/api/version', asyncMiddleware(async (_req, res, _next) => { console.log('GET VERSION - Version of Ecosonar retrieved') return res.status(200).json({ version: packageJson.version }) } catch (error) { - console.log('GET VERSION - Version of Ecosonar could not be retrieved') + console.error('GET VERSION - Version of Ecosonar could not be retrieved') return res.status(400).json({ error: error.message }) } })) @@ -1200,15 +1183,14 @@ app.get('/api/version', asyncMiddleware(async (_req, res, _next) => { app.get('/api/best-practices-rules', asyncMiddleware(async (req, res, _next) => { console.log('GET BEST PRACTICES - Best practices rules to be retrieved') - bestPracticesServices.getAllBestPracticesRules() - .then((bestPracticesRules) => { - console.log('GET BEST PRACTICES - Best practices rules has been retrieved') - return res.status(200).send(bestPracticesRules) - }) - .catch((error) => { - console.log('GET BEST PRACTICES - Best practices rules could not be retrieved') - return res.status(400).json({ error: error.message }) - }) + try { + const bestPracticesRules = bestPracticesServices.getAllBestPracticesRules() + console.log('GET BEST PRACTICES - Best practices rules has been retrieved') + return res.status(200).send(bestPracticesRules) + } catch (error) { + console.error('GET BEST PRACTICES - Best practices rules could not be retrieved') + return res.status(400).json({ error: error.message }) + } })) /** @@ -1239,8 +1221,9 @@ app.delete('/api/project', asyncMiddleware(async (req, res, _next) => { console.log(`DELETE PROJECT - Project ${projectName} deletion succeeded`) return res.status(200).send() }) - .catch(() => { - console.log(`DELETE PROJECT - Project ${projectName} deletion failed`) + .catch((error) => { + console.error(error) + console.error(`DELETE PROJECT - Delete project ${projectName} encountered an error`) return res.status(500).send() }) })) diff --git a/EcoSonar-API/services/W3C/w3cAnalysis.js b/EcoSonar-API/services/W3C/w3cAnalysis.js index a5a0b6d..f02178c 100644 --- a/EcoSonar-API/services/W3C/w3cAnalysis.js +++ b/EcoSonar-API/services/W3C/w3cAnalysis.js @@ -1,6 +1,5 @@ const validator = require('html-validator') const puppeteer = require('puppeteer') -const userJourneyService = require('../userJourneyService') const authenticationService = require('../authenticationService') class W3cAnalysis {} @@ -22,13 +21,13 @@ W3cAnalysis.prototype.w3cAnalysisWithAPI = async function (urlsList) { const resultForUrl = await validator(options) if (resultForUrl.messages[0].type === 'non-document-error') { console.error('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : URL ${url} cannot be found`) - console.log('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : ${url} has been removed from result `) + console.error('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : ${url} has been removed from result `) } else { reports.push(resultForUrl) console.log(`W3C ANALYSIS : Analyse ended for ${url} `) } } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) + console.error('\x1b[31m%s\x1b[0m', error) } } return reports @@ -36,6 +35,7 @@ W3cAnalysis.prototype.w3cAnalysisWithAPI = async function (urlsList) { /** * This function run the W3C Validator locally by setting the validator to WHATWG. It needs no external connection to the W3C API. + * NOT CONNECTED TO EXISTING ECOSONAR ANALYSIS * @param {Array} urlsList is a list of urls that needs to be analysed by W3C HTML Validator * @returns a list of HTML issues */ @@ -77,7 +77,6 @@ W3cAnalysis.prototype.w3cAnalysisLocal = async function (urlsList, projectName) for (const url of urlsList) { const page = await browser.newPage() - await userJourneyService.playUserJourney(url, browser) await page.setCacheEnabled(false) // Set BypassCSP allow pupeteer to insert script inside the created page, without it CSP using pages would block the script used later in the function page.setBypassCSP(true) @@ -89,7 +88,7 @@ W3cAnalysis.prototype.w3cAnalysisLocal = async function (urlsList, projectName) htmlResults.push({ url, html }) } catch { console.error('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : An error happened on URL ${url}`) - console.log('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : ${url} has been removed from result `) + console.error('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : ${url} has been removed from result `) } await page.close() } @@ -106,12 +105,15 @@ W3cAnalysis.prototype.w3cAnalysisLocal = async function (urlsList, projectName) const resultForHtml = await validator(options) resultForUrlsList.push(htmlResult.url, resultForHtml) console.log(`W3C ANALYSIS : Analyse ended for ${htmlResult.url} `) - } catch { - console.error('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : An error happoened on URL ${htmlResult.url}`) + } catch (error) { + console.error('\x1b[31m%s\x1b[0m', `W3C ANALYSIS : An error happened on URL ${htmlResult.url}`) + console.error(error) } } return resultForUrlsList + } else { + console.warn('Could not log in, audit for w3c analysis is skipped') } } catch (error) { console.error('\x1b[31m%s\x1b[0m', error) diff --git a/EcoSonar-API/services/analysisService.js b/EcoSonar-API/services/analysisService.js index 16e167d..dd1901a 100644 --- a/EcoSonar-API/services/analysisService.js +++ b/EcoSonar-API/services/analysisService.js @@ -20,20 +20,19 @@ class AnalysisService {} * @param {boolean} autoscroll is used to enable autoscrolling for each tab opened during analysis */ AnalysisService.prototype.insert = async function (projectName, autoscroll) { - const allowExternalAPI = process.env.ECOSONAR_ENV_ALLOW_EXTERNAL_API + const allowExternalAPI = process.env.ECOSONAR_ENV_ALLOW_EXTERNAL_API || 'false' let urlProjectList = [] let reports = [] let systemError = false - try { - urlProjectList = await urlsProjectRepository.findAll(projectName, true) - } catch (error) { - console.log('GREENIT INSERT - can not retrieved urls from project') - systemError = true - } + await urlsProjectRepository.findAll(projectName) + .then((urls) => { urlProjectList = urls }) + .catch(() => { + systemError = true + }) if (systemError || urlProjectList.length === 0) { - console.log('GREENIT INSERT - project has no url to do the audit. Audit stopped') + console.warn('GREENIT INSERT - project has no url to do the audit. Audit stopped') } else { reports = await launchAuditsToUrlList(urlProjectList, autoscroll, projectName, allowExternalAPI) const reportsFormatted = formatAuditsToBeSaved(reports, urlProjectList) @@ -41,28 +40,28 @@ AnalysisService.prototype.insert = async function (projectName, autoscroll) { greenItRepository .insertAll(reportsFormatted.greenitAnalysisFormatted) .then(() => { - console.log('GREENIT INSERT - analysis has been insert') + console.log('GREENIT INSERT - analysis has been inserted') }) .catch(() => { - console.log('GREENIT INSERT - greenit insertion failed') + console.error('GREENIT INSERT - greenit insertion failed') }) lighthouseRepository .insertAll(reportsFormatted.analysisLighthouseFormatted) .then(() => { - console.log('LIGHTHOUSE INSERT - analysis has been insert') + console.log('LIGHTHOUSE INSERT - analysis has been inserted') }) .catch(() => { - console.log('LIGHTHOUSE INSERT - lighthouse insertion failed') + console.error('LIGHTHOUSE INSERT - lighthouse insertion failed') }) if (allowExternalAPI === 'true') { w3cRepository.insertAll(reportsFormatted.w3cAnalysisFormatted) .then(() => { - console.log('W3C INSERT - analysis has been insert') + console.log('W3C INSERT - analysis has been inserted') }) .catch(() => { - console.log('W3C INSERT - w3c insertion failed') + console.error('W3C INSERT - w3c insertion failed') }) } @@ -72,7 +71,7 @@ AnalysisService.prototype.insert = async function (projectName, autoscroll) { console.log('BEST PRACTICES INSERT - best practices have been inserted') }) .catch(() => { - console.log('BEST PRACTICES INSERT : best practice insertion failed') + console.error('BEST PRACTICES INSERT : best practices insertion failed') }) } } @@ -86,21 +85,21 @@ async function launchAuditsToUrlList (urlProjectList, autoscroll, projectName, a try { reportsGreenit = await greenItAnalysis.analyse(urlList, autoscroll, projectName) } catch (error) { - console.log(error) + console.error(error) } try { reportsLighthouse = await lighthouseAnalysis.lighthouseAnalysis(urlList, projectName) } catch (error) { - console.log(error) + console.error(error) } if (allowExternalAPI === 'true') { try { reportsW3c = await w3cAnalysis.w3cAnalysisWithAPI(urlList) } catch (error) { - console.log(error) + console.error(error) } } else { - console.log('INSERT ANALYSIS - Usage of external API is not allowed, W3C analysis skipped') + console.warn('INSERT ANALYSIS - Usage of external API is not allowed, W3C analysis skipped') } return { reportsGreenit, diff --git a/EcoSonar-API/services/bestPracticesService.js b/EcoSonar-API/services/bestPracticesService.js index 637cf1f..3c6ddf7 100644 --- a/EcoSonar-API/services/bestPracticesService.js +++ b/EcoSonar-API/services/bestPracticesService.js @@ -4,19 +4,11 @@ const lighthousePerformanceData = require('../utils/bestPractices/lighthousePerf class BestPracticesServices { } -BestPracticesServices.prototype.getAllBestPracticesRules = async function () { - const allBestPracticesRules = { - greenitDocs: {}, - lighthousePerformanceDocs: {}, - lighthouseAccessbilityDocs: {} - } - try { - allBestPracticesRules.greenitDocs = greenItData - allBestPracticesRules.lighthousePerformanceDocs = lighthousePerformanceData - allBestPracticesRules.lighthouseAccessbilityDocs = lighthouseAccessibilityData - return allBestPracticesRules - } catch (error) { - return error +BestPracticesServices.prototype.getAllBestPracticesRules = function () { + return { + greenitDocs: greenItData, + lighthousePerformanceDocs: lighthousePerformanceData, + lighthouseAccessbilityDocs: lighthouseAccessibilityData } } diff --git a/EcoSonar-API/services/crawler/crawlerService.js b/EcoSonar-API/services/crawler/crawlerService.js index 344ae00..714b4d9 100644 --- a/EcoSonar-API/services/crawler/crawlerService.js +++ b/EcoSonar-API/services/crawler/crawlerService.js @@ -6,15 +6,6 @@ const tempUrlsProjectRepository = require('../../dataBase/tempurlsProjectReposit class CrawlerService { } -/** - * VARIABLES - */ -let webSitePrefixWithoutProtocol -let webSitePrefixWithProtocol -let websiteProtocol -let alternativeProtocol -let seenUrls - /** * * @param {*} projectName the name of the project @@ -25,7 +16,7 @@ let seenUrls CrawlerService.prototype.launchCrawl = async function (projectName, mainUrl, savedAsPermanent) { let crawledUrls = [] let projectUrls = [] - seenUrls = [] + const seenUrls = [] const browserArgs = [ '--no-sandbox', // can't run inside docker without @@ -48,9 +39,9 @@ CrawlerService.prototype.launchCrawl = async function (projectName, mainUrl, sav }) try { - getWebsiteProtocolAndPrefix(mainUrl) + const websiteDetails = getWebsiteProtocolAndPrefix(mainUrl) await authenticationService.loginIfNeeded(browser) - await recursiveCrawl(mainUrl, browser, crawledUrls) + await recursiveCrawl(mainUrl, browser, crawledUrls, seenUrls, websiteDetails) } catch (error) { console.error(error) } finally { browser.close() } @@ -83,6 +74,9 @@ CrawlerService.prototype.launchCrawl = async function (projectName, mainUrl, sav * This function extract the websiteProtocol (http or https) and the website name from the given entry URL */ function getWebsiteProtocolAndPrefix (url) { + let websiteProtocol + let alternativeProtocol + let webSitePrefixWithoutProtocol if (url.includes('http://')) { websiteProtocol = 'http://' alternativeProtocol = 'https://' @@ -101,7 +95,14 @@ function getWebsiteProtocolAndPrefix (url) { } else { webSitePrefixWithoutProtocol = urlWithoutWebsiteProtocol } - webSitePrefixWithProtocol = websiteProtocol + webSitePrefixWithoutProtocol + const webSitePrefixWithProtocol = websiteProtocol + webSitePrefixWithoutProtocol + + return { + websiteProtocol, + alternativeProtocol, + webSitePrefixWithoutProtocol, + webSitePrefixWithProtocol + } } /** @@ -110,10 +111,10 @@ function getWebsiteProtocolAndPrefix (url) { * @returns a array of URL * Crawler extract every URL into the website, then crawl them recursively until every URL has already been seen. */ -async function recursiveCrawl (url, browser, crawledUrls) { +async function recursiveCrawl (url, browser, crawledUrls, seenUrls, websiteDetails) { try { if (!seenUrls.includes(url)) { - if (CrawlerService.prototype.checkUrl(url)) { + if (checkUrl(url, seenUrls)) { // CRAWLING PAGE console.log('CRAWLING', url) seenUrls.push(url) @@ -132,9 +133,9 @@ async function recursiveCrawl (url, browser, crawledUrls) { .get() for (const link of links) { - const retrievedUrl = CrawlerService.prototype.getUrl(link) + const retrievedUrl = getUrl(link, websiteDetails) if (retrievedUrl) { - await recursiveCrawl(retrievedUrl, browser, crawledUrls) + await recursiveCrawl(retrievedUrl, browser, crawledUrls, seenUrls, websiteDetails) } } } @@ -204,17 +205,17 @@ async function saveUrlsCrawled (projectName, urlsList, savedAsPermanent) { * @returns a formatted link * Avoid issue with relatives URL by formatting links to be crawled. Ex : given '/about' when crawling, function will construct an usable URL with websiteProtocol and websitePrefix to be : 'https://nameofthewebsite.com/about' */ -CrawlerService.prototype.getUrl = function (link) { +function getUrl (link, websiteDetails) { // Exclude links that are outside website - if ((link.includes(websiteProtocol) || link.includes(alternativeProtocol)) && link.startsWith(webSitePrefixWithProtocol)) { + if ((link.includes(websiteDetails.websiteProtocol) || link.includes(websiteDetails.alternativeProtocol)) && link.startsWith(websiteDetails.webSitePrefixWithProtocol)) { return undefined } else { // If the link is part of the website - if (!link.includes(websiteProtocol) && !link.includes(webSitePrefixWithoutProtocol) && !link.startsWith('/')) { - return `${websiteProtocol}${webSitePrefixWithoutProtocol}/${link}` - } else if (!link.includes(websiteProtocol) && !link.includes(webSitePrefixWithoutProtocol) && link.startsWith('/')) { - return `${websiteProtocol}${webSitePrefixWithoutProtocol}${link}` - } else if (link.includes(websiteProtocol) && link.includes(webSitePrefixWithoutProtocol)) { + if (!link.includes(websiteDetails.websiteProtocol) && !link.includes(websiteDetails.webSitePrefixWithoutProtocol) && !link.startsWith('/')) { + return `${websiteDetails.websiteProtocol}${websiteDetails.webSitePrefixWithoutProtocol}/${link}` + } else if (!link.includes(websiteDetails.websiteProtocol) && !link.includes(websiteDetails.webSitePrefixWithoutProtocol) && link.startsWith('/')) { + return `${websiteDetails.websiteProtocol}${websiteDetails.webSitePrefixWithoutProtocol}${link}` + } else if (link.includes(websiteDetails.websiteProtocol) && link.includes(websiteDetails.webSitePrefixWithoutProtocol)) { return link } else { return undefined @@ -228,7 +229,7 @@ CrawlerService.prototype.getUrl = function (link) { * Exclude the url that return a file or a mailing redirection * @returns a boolean depending on the result of the check */ -CrawlerService.prototype.checkUrl = function (url) { +function checkUrl (url, seenUrls) { const invalidUrl = ['.csv', '.pdf', 'mailto:', '.jpg', '.jpeg', '.gif', '.docx', '.txt', '.bmp', '#'] const result = invalidUrl.some((element) => url.includes(element)) if (result) { @@ -241,18 +242,15 @@ CrawlerService.prototype.checkUrl = function (url) { /** * * @param {string} projectName project name - * retrieve the temporary urls saved from last crawling in the database for this project + * retrieve the temporary urls saved from last crawlings in the database for this project * @returns a list of urls crawled saved */ CrawlerService.prototype.retrieveCrawledUrl = async function (projectName) { return new Promise((resolve, reject) => { tempUrlsProjectRepository.findUrls(projectName) .then((result) => { - if (result && result.urlsList.length > 0) { - resolve(result.urlsList) - } else { - reject(new Error('No crawled urls were saved for this project')) - } + const urlsCrawled = result ? result.urlsList : [] + resolve(urlsCrawled) }).catch((error) => { reject(error) }) diff --git a/EcoSonar-API/services/exportAuditService.js b/EcoSonar-API/services/exportAuditService.js index 5185e78..03761eb 100644 --- a/EcoSonar-API/services/exportAuditService.js +++ b/EcoSonar-API/services/exportAuditService.js @@ -6,35 +6,28 @@ const SystemError = require('../utils/SystemError') class ExportAuditService { } ExportAuditService.prototype.exportAudit = async function (projectName) { - // get Urls let urls = [] let analysis = null + await urlConfigurationService.getAll(projectName) .then((results) => { urls = results }) - .catch((error) => { - if (error instanceof SystemError) { - return new SystemError() - } - console.log('EXPORT EXCEL - No url retrieved for project ' + projectName) + .catch(() => { + return new SystemError() }) - // get project analysis + await retrieveAnalysisService.getProjectAnalysis(projectName) .then((results) => { analysis = results - }).catch((error) => { - if (error instanceof SystemError) { - return new SystemError() - } - console.log('EXPORT EXCEL - Analysis for project could not be retrieved') + }).catch(() => { + return new SystemError() }) if (urls.length === 0 || analysis == null) { throw new Error('Export Audit is not possible because urls were not inserted into project or analysis for project could not be retrieved') } - // date const dateGreenitLastAnalysis = analysis.lastAnalysis.greenit !== null && analysis.lastAnalysis.greenit.dateAnalysis ? `${new Date(analysis.lastAnalysis.greenit.dateAnalysis).toDateString()} - ${new Date(analysis.lastAnalysis.greenit.dateAnalysis).toLocaleTimeString([], { hour12: false })} ` : null @@ -47,9 +40,7 @@ ExportAuditService.prototype.exportAudit = async function (projectName) { } else if (dateLighthouseLastAnalysis !== null) { dateLastAnalysis = dateLighthouseLastAnalysis } - // analysis - let analysisGreenit = analysis.lastAnalysis.greenit - let analysisW3c = analysis.lastAnalysis.w3c + let lighthousePerformance, lighthouseAccessibility, lighthouseMetrics if (analysis.lastAnalysis.lighthouse) { lighthousePerformance = { @@ -101,32 +92,47 @@ ExportAuditService.prototype.exportAudit = async function (projectName) { x: 0, y: 0, width: 10000, height: 20000, firstSheet: 0, activeTab: 0, visibility: 'visible' } ] - // project page - formatExcelSheet('', 0, workbook, projectName, analysisGreenit, analysisW3c, lighthouseAccessibility, lighthousePerformance, lighthouseMetrics, dateLastAnalysis) - // url pages + + const analysisForProject = { + analysisGreenit: analysis.lastAnalysis.greenit, + analysisW3c: analysis.lastAnalysis.w3c, + lighthouseAccessibility, + lighthousePerformance, + lighthouseMetrics + } + formatExcelSheet('', 0, workbook, projectName, analysisForProject, dateLastAnalysis) + for (const [index, url] of urls.entries()) { await retrieveAnalysisService.getUrlAnalysis(projectName, url) .then((res) => { - analysisGreenit = res.lastAnalysis.greenit - analysisW3c = res.lastAnalysis.w3c lighthouseAccessibility = res.lastAnalysis.lighthouse !== null ? res.lastAnalysis.lighthouse.accessibility : null lighthousePerformance = res.lastAnalysis.lighthouse !== null ? res.lastAnalysis.lighthouse.performance : null - lighthouseMetrics = res.lastAnalysis.lighthouse - formatExcelSheet(url, index + 1, workbook, projectName, analysisGreenit, analysisW3c, lighthouseAccessibility, lighthousePerformance, lighthouseMetrics, dateLastAnalysis) + + const analysisForUrl = { + analysisGreenit: res.lastAnalysis.greenit, + analysisW3c: res.lastAnalysis.w3c, + lighthouseAccessibility, + lighthousePerformance, + lighthouseMetrics: res.lastAnalysis.lighthouse + } + formatExcelSheet(url, index + 1, workbook, projectName, analysisForUrl, dateLastAnalysis) }) - .catch((error) => { - console.error(error.message) - console.log('Analysis for URL ' + url + ' could not be resolved ') + .catch(() => { + console.error('Analysis for URL ' + url + ' could not be resolved ') }) } return workbook.xlsx.writeBuffer() } catch (err) { - console.error(err.message) + console.error(err) return new Error('Could not export Audit to Excel for projet ' + projectName) } } -function formatExcelSheet (urlName, index, workbook, projectName, analysisGreenit, analysisW3c, lighthouseAccessibility, lighthousePerformance, lighthouseMetrics, dateLastAnalysis) { +function formatExcelSheet (urlName, index, workbook, projectName, analysis, dateLastAnalysis) { + if (checkAnalysisIsEmpty(analysis)) { + return + } + let sheet if (urlName !== '') { sheet = workbook.addWorksheet('url' + index) @@ -196,33 +202,33 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni // score and grade row = sheet.getRow(rowIndex) row.getCell(1).value = 'EcoIndex project grade (average)' - if (analysisGreenit !== null) { - row.getCell(2).value = analysisGreenit.grade - setColor(row.getCell(2), analysisGreenit.grade) + if (analysis.analysisGreenit !== null) { + row.getCell(2).value = analysis.analysisGreenit.grade + setColor(row.getCell(2), analysis.analysisGreenit.grade) } else { row.getCell(2).value = 'no analysis' setColor(row.getCell(2), '') } row.getCell(3).value = 'Lighthouse Performance grade (average)' - if (lighthousePerformance !== null) { - row.getCell(4).value = lighthousePerformance.complianceLevel - setColor(row.getCell(4), lighthousePerformance.complianceLevel) + if (analysis.lighthousePerformance !== null) { + row.getCell(4).value = analysis.lighthousePerformance.complianceLevel + setColor(row.getCell(4), analysis.lighthousePerformance.complianceLevel) } else { row.getCell(4).value = 'no analysis' setColor(row.getCell(4), '') } row.getCell(5).value = 'Lighthouse Accessibility grade (average)' - if (lighthouseAccessibility !== null) { - row.getCell(6).value = lighthouseAccessibility.complianceLevel - setColor(row.getCell(6), lighthouseAccessibility.complianceLevel) + if (analysis.lighthouseAccessibility !== null) { + row.getCell(6).value = analysis.lighthouseAccessibility.complianceLevel + setColor(row.getCell(6), analysis.lighthouseAccessibility.complianceLevel) } else { row.getCell(6).value = 'no analysis' setColor(row.getCell(6), '') } row.getCell(7).value = 'W3C validator grade' - if (analysisW3c !== null) { - row.getCell(8).value = analysisW3c.grade - setColor(row.getCell(8), analysisW3c.grade) + if (analysis.analysisW3c !== null) { + row.getCell(8).value = analysis.analysisW3c.grade + setColor(row.getCell(8), analysis.analysisW3c.grade) } else { row.getCell(8).value = 'no analysis' setColor(row.getCell(8), '') @@ -270,33 +276,33 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'EcoIndex project score (average)' - if (analysisGreenit !== null) { - row.getCell(2).value = analysisGreenit.ecoIndex - setColor(row.getCell(2), analysisGreenit.grade) + if (analysis.analysisGreenit !== null) { + row.getCell(2).value = analysis.analysisGreenit.ecoIndex + setColor(row.getCell(2), analysis.analysisGreenit.grade) } else { row.getCell(2).value = 'no analysis' setColor(row.getCell(2), '') } row.getCell(3).value = 'Lighthouse Performance score (average)' - if (lighthousePerformance !== null) { - row.getCell(4).value = lighthousePerformance.displayValue - setColor(row.getCell(4), lighthousePerformance.complianceLevel) + if (analysis.lighthousePerformance !== null) { + row.getCell(4).value = analysis.lighthousePerformance.displayValue + setColor(row.getCell(4), analysis.lighthousePerformance.complianceLevel) } else { row.getCell(4).value = 'no analysis' setColor(row.getCell(4), '') } row.getCell(5).value = 'Lighthouse Accessibility score (average)' - if (lighthouseAccessibility !== null) { - row.getCell(6).value = lighthouseAccessibility.displayValue - setColor(row.getCell(6), lighthouseAccessibility.complianceLevel) + if (analysis.lighthouseAccessibility !== null) { + row.getCell(6).value = analysis.lighthouseAccessibility.displayValue + setColor(row.getCell(6), analysis.lighthouseAccessibility.complianceLevel) } else { row.getCell(6).value = 'no analysis' setColor(row.getCell(6), '') } row.getCell(7).value = 'W3C validator score' - if (analysisW3c !== null) { - row.getCell(8).value = analysisW3c.score - setColor(row.getCell(8), analysisW3c.grade) + if (analysis.analysisW3c !== null) { + row.getCell(8).value = analysis.analysisW3c.score + setColor(row.getCell(8), analysis.analysisW3c.grade) } else { row.getCell(8).value = 'no analysis' setColor(row.getCell(8), '') @@ -366,11 +372,11 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni top: { style: 'thick' } } row = sheet.getRow(rowIndex) - if (analysisGreenit !== null) { + if (analysis.analysisGreenit !== null) { row.getCell(1).value = 'Size of the DOM (average)' - row.getCell(2).value = analysisGreenit.domSize.displayValue - row.getCell(3).value = analysisGreenit.domSize.complianceLevel - setColor(row.getCell(3), analysisGreenit.domSize.complianceLevel) + row.getCell(2).value = analysis.analysisGreenit.domSize.displayValue + row.getCell(3).value = analysis.analysisGreenit.domSize.complianceLevel + setColor(row.getCell(3), analysis.analysisGreenit.domSize.complianceLevel) // formatting row.getCell(1).alignment = { wrapText: true } row.getCell(2).alignment = { wrapText: true } @@ -385,9 +391,9 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni } row = sheet.getRow(rowIndex) row.getCell(1).value = 'Number of requests (average)' - row.getCell(2).value = analysisGreenit.nbRequest.displayValue - row.getCell(3).value = analysisGreenit.nbRequest.complianceLevel - setColor(row.getCell(3), analysisGreenit.nbRequest.complianceLevel) + row.getCell(2).value = analysis.analysisGreenit.nbRequest.displayValue + row.getCell(3).value = analysis.analysisGreenit.nbRequest.complianceLevel + setColor(row.getCell(3), analysis.analysisGreenit.nbRequest.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' } @@ -403,9 +409,9 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'Size of the page (Kb) (average)' - row.getCell(2).value = analysisGreenit.responsesSize.displayValue - row.getCell(3).value = analysisGreenit.responsesSize.complianceLevel - setColor(row.getCell(3), analysisGreenit.responsesSize.complianceLevel) + row.getCell(2).value = analysis.analysisGreenit.responsesSize.displayValue + row.getCell(3).value = analysis.analysisGreenit.responsesSize.complianceLevel + setColor(row.getCell(3), analysis.analysisGreenit.responsesSize.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' }, @@ -472,13 +478,13 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni } row = sheet.getRow(rowIndex) - if (lighthouseMetrics !== null) { + if (analysis.lighthouseMetrics !== null) { row.getCell(1).value = 'Largest Contentful Paint (s) (average)' - row.getCell(2).value = lighthouseMetrics.largestContentfulPaint.displayValue - row.getCell(3).value = lighthouseMetrics.largestContentfulPaint.complianceLevel - row.getCell(4).value = lighthouseMetrics.largestContentfulPaint.score - setColor(row.getCell(3), lighthouseMetrics.largestContentfulPaint.complianceLevel) - setColor(row.getCell(4), lighthouseMetrics.largestContentfulPaint.complianceLevel) + row.getCell(2).value = analysis.lighthouseMetrics.largestContentfulPaint.displayValue + row.getCell(3).value = analysis.lighthouseMetrics.largestContentfulPaint.complianceLevel + row.getCell(4).value = analysis.lighthouseMetrics.largestContentfulPaint.score + setColor(row.getCell(3), analysis.lighthouseMetrics.largestContentfulPaint.complianceLevel) + setColor(row.getCell(4), analysis.lighthouseMetrics.largestContentfulPaint.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' } @@ -495,11 +501,11 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'Cumulative Layout Shift (average)' - row.getCell(2).value = lighthouseMetrics.cumulativeLayoutShift.displayValue - row.getCell(3).value = lighthouseMetrics.cumulativeLayoutShift.complianceLevel - row.getCell(4).value = lighthouseMetrics.cumulativeLayoutShift.score - setColor(row.getCell(3), lighthouseMetrics.cumulativeLayoutShift.complianceLevel) - setColor(row.getCell(4), lighthouseMetrics.cumulativeLayoutShift.complianceLevel) + row.getCell(2).value = analysis.lighthouseMetrics.cumulativeLayoutShift.displayValue + row.getCell(3).value = analysis.lighthouseMetrics.cumulativeLayoutShift.complianceLevel + row.getCell(4).value = analysis.lighthouseMetrics.cumulativeLayoutShift.score + setColor(row.getCell(3), analysis.lighthouseMetrics.cumulativeLayoutShift.complianceLevel) + setColor(row.getCell(4), analysis.lighthouseMetrics.cumulativeLayoutShift.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' } @@ -516,11 +522,11 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'First Contentful Paint (s) (average)' - row.getCell(2).value = lighthouseMetrics.firstContentfulPaint.displayValue - row.getCell(3).value = lighthouseMetrics.firstContentfulPaint.complianceLevel - row.getCell(4).value = lighthouseMetrics.firstContentfulPaint.score - setColor(row.getCell(3), lighthouseMetrics.firstContentfulPaint.complianceLevel) - setColor(row.getCell(4), lighthouseMetrics.firstContentfulPaint.complianceLevel) + row.getCell(2).value = analysis.lighthouseMetrics.firstContentfulPaint.displayValue + row.getCell(3).value = analysis.lighthouseMetrics.firstContentfulPaint.complianceLevel + row.getCell(4).value = analysis.lighthouseMetrics.firstContentfulPaint.score + setColor(row.getCell(3), analysis.lighthouseMetrics.firstContentfulPaint.complianceLevel) + setColor(row.getCell(4), analysis.lighthouseMetrics.firstContentfulPaint.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' } @@ -537,11 +543,11 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'Speed Index (s) (average)' - row.getCell(2).value = lighthouseMetrics.speedIndex.displayValue - row.getCell(3).value = lighthouseMetrics.speedIndex.complianceLevel - row.getCell(4).value = lighthouseMetrics.speedIndex.score - setColor(row.getCell(3), lighthouseMetrics.speedIndex.complianceLevel) - setColor(row.getCell(4), lighthouseMetrics.speedIndex.complianceLevel) + row.getCell(2).value = analysis.lighthouseMetrics.speedIndex.displayValue + row.getCell(3).value = analysis.lighthouseMetrics.speedIndex.complianceLevel + row.getCell(4).value = analysis.lighthouseMetrics.speedIndex.score + setColor(row.getCell(3), analysis.lighthouseMetrics.speedIndex.complianceLevel) + setColor(row.getCell(4), analysis.lighthouseMetrics.speedIndex.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' } @@ -558,11 +564,11 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'Total Blocking Time (ms) (average)' - row.getCell(2).value = lighthouseMetrics.totalBlockingTime.displayValue - row.getCell(3).value = lighthouseMetrics.totalBlockingTime.complianceLevel - row.getCell(4).value = lighthouseMetrics.totalBlockingTime.score - setColor(row.getCell(3), lighthouseMetrics.totalBlockingTime.complianceLevel) - setColor(row.getCell(4), lighthouseMetrics.totalBlockingTime.complianceLevel) + row.getCell(2).value = analysis.lighthouseMetrics.totalBlockingTime.displayValue + row.getCell(3).value = analysis.lighthouseMetrics.totalBlockingTime.complianceLevel + row.getCell(4).value = analysis.lighthouseMetrics.totalBlockingTime.score + setColor(row.getCell(3), analysis.lighthouseMetrics.totalBlockingTime.complianceLevel) + setColor(row.getCell(4), analysis.lighthouseMetrics.totalBlockingTime.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' } @@ -579,11 +585,11 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni row = sheet.getRow(rowIndex) row.getCell(1).value = 'Time to interactive (s) (average)' - row.getCell(2).value = lighthouseMetrics.interactive.displayValue - row.getCell(3).value = lighthouseMetrics.interactive.complianceLevel - row.getCell(4).value = lighthouseMetrics.interactive.score - setColor(row.getCell(3), lighthouseMetrics.interactive.complianceLevel) - setColor(row.getCell(4), lighthouseMetrics.interactive.complianceLevel) + row.getCell(2).value = analysis.lighthouseMetrics.interactive.displayValue + row.getCell(3).value = analysis.lighthouseMetrics.interactive.complianceLevel + row.getCell(4).value = analysis.lighthouseMetrics.interactive.score + setColor(row.getCell(3), analysis.lighthouseMetrics.interactive.complianceLevel) + setColor(row.getCell(4), analysis.lighthouseMetrics.interactive.complianceLevel) // draw border of the cell row.getCell(1).border = { left: { style: 'thick' }, @@ -648,9 +654,9 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni } row = sheet.getRow(rowIndex) - if (analysisW3c !== null) { + if (analysis.analysisW3c !== null) { row.getCell(1).value = 'Number of Infos' - row.getCell(2).value = analysisW3c.totalInfo + row.getCell(2).value = analysis.analysisW3c.totalInfo // formatting row.getCell(1).alignment = { wrapText: true } row.getCell(2).alignment = { wrapText: true } @@ -664,7 +670,7 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni } row = sheet.getRow(rowIndex) row.getCell(1).value = 'Number of Warnings' - row.getCell(2).value = analysisW3c.totalWarning + row.getCell(2).value = analysis.analysisW3c.totalWarning // formatting row.getCell(1).alignment = { wrapText: true } row.getCell(2).alignment = { wrapText: true } @@ -678,7 +684,7 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni } row = sheet.getRow(rowIndex) row.getCell(1).value = 'Number of Errors' - row.getCell(2).value = analysisW3c.totalError + row.getCell(2).value = analysis.analysisW3c.totalError // formatting row.getCell(1).alignment = { wrapText: true } row.getCell(2).alignment = { wrapText: true } @@ -692,7 +698,7 @@ function formatExcelSheet (urlName, index, workbook, projectName, analysisGreeni } row = sheet.getRow(rowIndex) row.getCell(1).value = 'Number of Fatal Errors' - row.getCell(2).value = analysisW3c.totalFatalError + row.getCell(2).value = analysis.analysisW3c.totalFatalError // draw border of the cell row.getCell(1).border = { left: { style: 'thick' }, @@ -751,5 +757,9 @@ function setColor (cell, grade) { } } +function checkAnalysisIsEmpty (analysis) { + return analysis.analysisGreenit === null && analysis.analysisW3c === null && analysis.lighthouseMetrics === null +} + const exportAuditService = new ExportAuditService() module.exports = exportAuditService diff --git a/EcoSonar-API/services/format/bestPracticesSorting.js b/EcoSonar-API/services/format/bestPracticesSorting.js index 0452edc..ccd97bc 100644 --- a/EcoSonar-API/services/format/bestPracticesSorting.js +++ b/EcoSonar-API/services/format/bestPracticesSorting.js @@ -1,5 +1,6 @@ const ecodesignMetric = require('../../utils/feature_importance_model.json') const quickWinsConfig = require('../../utils/quick_wins_configuration.json') + class BestPracticesSorting { } BestPracticesSorting.prototype.sortByHighestImpact = function (list) { @@ -12,7 +13,7 @@ BestPracticesSorting.prototype.sortByHighestImpact = function (list) { const complianceNA = {} for (const practice in ecodesignMetric) { for (const metric in ecodesignMetric[practice]) { - if (list.ecodesign[metric] !== undefined) { + if (list.ecodesign && list.ecodesign[metric] !== undefined) { if (list.ecodesign[metric].compliance === 'A') { complianceA[metric] = list.ecodesign[metric] list.ecodesign[metric] = undefined @@ -26,17 +27,12 @@ BestPracticesSorting.prototype.sortByHighestImpact = function (list) { } } } - const sizeComplianceNA = Object.keys(complianceNA).length - const sizeComplianceA = Object.keys(complianceA).length - if (sizeComplianceA !== 0) { - newList.ecodesign = jsonConcat(newList.ecodesign, complianceA) - } - if (sizeComplianceNA !== 0) { - newList.ecodesign = jsonConcat(newList.ecodesign, complianceNA) + addBestPracticesMissingFromHighestImpactModel(list, newList.ecodesign, complianceA, complianceNA) + if (Object.keys(newList.ecodesign).length === 0) { + newList.ecodesign = undefined } - addBestPracticesMissing(list, newList) return newList } @@ -69,7 +65,11 @@ BestPracticesSorting.prototype.sortByQuickWins = function (list) { bestPracticesWithDifficulty10) addBestPracticesMissing(list, bestPracticesWithDifficultySorted) - const bestPracticesSorted = Object.assign(bestPracticesWithDifficultySorted, bestPracticesA, bestPracticesNA) + let bestPracticesSorted = Object.assign(bestPracticesWithDifficultySorted, bestPracticesA, bestPracticesNA) + + if (Object.keys(bestPracticesSorted).length === 0) { + bestPracticesSorted = undefined + } return { ecodesign: bestPracticesSorted, @@ -91,7 +91,7 @@ BestPracticesSorting.prototype.sortByQuickWins = function (list) { const bpNA = [] const bpA = [] for (const practice in quickWinsConfig) { - if (list.ecodesign[practice] !== undefined && list.ecodesign[practice].compliance !== 'N.A' && list.ecodesign[practice].compliance !== 'A') { + if (list.ecodesign && list.ecodesign[practice] !== undefined && list.ecodesign[practice].compliance !== 'N.A' && list.ecodesign[practice].compliance !== 'A') { if (quickWinsConfig[practice].difficulty === 10) { sortingByIncreasingScore(bpWithDifficulty10, list.ecodesign, practice) } else if (quickWinsConfig[practice].difficulty === 9) { @@ -114,10 +114,10 @@ BestPracticesSorting.prototype.sortByQuickWins = function (list) { sortingByIncreasingScore(bpWithDifficulty1, list.ecodesign, practice) } list.ecodesign[practice] = undefined - } else if (list.ecodesign[practice] !== undefined && list.ecodesign[practice].compliance === 'N.A') { + } else if (list.ecodesign && list.ecodesign[practice] !== undefined && list.ecodesign[practice].compliance === 'N.A') { sortingByIncreasingScore(bpNA, list.ecodesign, practice) list.ecodesign[practice] = undefined - } else if (list.ecodesign[practice] !== undefined) { + } else if (list.ecodesign && list.ecodesign[practice] !== undefined) { sortingByIncreasingScore(bpA, list.ecodesign, practice) list.ecodesign[practice] = undefined } @@ -139,13 +139,6 @@ BestPracticesSorting.prototype.sortByQuickWins = function (list) { } } -function jsonConcat (json1, json2) { - for (const key in json2) { - json1[key] = json2[key] - } - return json1 -} - function sortingByIncreasingScore (bestPracticeWithDifficultyX, listEcoDesign, practice) { let i = 0 let namePractice = practice @@ -184,5 +177,25 @@ function addBestPracticesMissing (list, newList) { } } +function addBestPracticesMissingFromHighestImpactModel (list, newList, complianceA, complianceNA) { + for (const practice in list) { + for (const metric in list[practice]) { + if (list.ecodesign[metric] !== undefined && list.ecodesign[metric].compliance === 'A') { + complianceA[metric] = list.ecodesign[metric] + list.ecodesign[metric] = undefined + } else if (list.ecodesign[metric] !== undefined && list.ecodesign[metric].compliance === 'N.A') { + complianceNA[metric] = list.ecodesign[metric] + list.ecodesign[metric] = undefined + } else if (list.ecodesign[metric] !== undefined) { + newList[metric] = list.ecodesign[metric] + list.ecodesign[metric] = undefined + } + } + } + if (newList) { + Object.assign(newList, complianceA, complianceNA) + } +} + const bestPracticesSorting = new BestPracticesSorting() module.exports = bestPracticesSorting diff --git a/EcoSonar-API/services/format/formatGreenItAnalysis.js b/EcoSonar-API/services/format/formatGreenItAnalysis.js index f0a8ea8..2f7a98d 100644 --- a/EcoSonar-API/services/format/formatGreenItAnalysis.js +++ b/EcoSonar-API/services/format/formatGreenItAnalysis.js @@ -4,7 +4,7 @@ const formatCompliance = require('./formatCompliance') class FormatGreenItAnalysis {} FormatGreenItAnalysis.prototype.greenItUrlAnalysisFormatted = function (analysis) { - let formattedAnalysis + let formattedAnalysis = null try { formattedAnalysis = { domSize: { displayValue: analysis.domSize, complianceLevel: ecoIndexCalculationService.setScoreLetter('domSize', analysis.domSize) }, @@ -14,14 +14,14 @@ FormatGreenItAnalysis.prototype.greenItUrlAnalysisFormatted = function (analysis grade: analysis.grade } } catch (err) { - console.log(err) - console.log('GREENIT - error during the formatting of project analysis') + console.error(err) + console.error('GREENIT - error during the formatting of project analysis') } return formattedAnalysis } FormatGreenItAnalysis.prototype.greenItProjectLastAnalysisFormatted = function (res) { - let analysis + let analysis = null let j = 0 let count, domSize, nbRequest, responsesSize, responsesSizeUncompress, ecoIndex @@ -53,59 +53,66 @@ FormatGreenItAnalysis.prototype.greenItProjectLastAnalysisFormatted = function ( ecoIndex: Math.round(ecoIndex / count), grade: formatCompliance.getEcodesignGrade(ecoIndex / count) } - return analysis } catch (err) { - console.log(err) - console.log('GREENIT - error during the formatting of project analysis') + console.error(err) + console.error('GREENIT - error during the formatting of project analysis') } + return analysis } FormatGreenItAnalysis.prototype.formatDeploymentsForGraphs = function (deployments) { const duplicatedDeployments = [] - for (const i of deployments) { - // We filter deployments to find the values with the same date - const duplicatedValuesArray = deployments.filter((element) => compareFullDate(element.dateGreenAnalysis, i.dateGreenAnalysis)) - const sumElement = { - dateAnalysis: duplicatedValuesArray[0].dateGreenAnalysis, - domSize: 0, - nbRequest: 0, - responsesSize: 0, - ecoIndex: 0, - numberOfValues: 0 - } - - // We add up every element with the same date (only DD/MM/YYYY) in one (sumElement) - duplicatedValuesArray.forEach((element) => { - sumElement.domSize += element.domSize - sumElement.nbRequest += element.nbRequest - sumElement.responsesSize += element.responsesSize - sumElement.ecoIndex += element.ecoIndex - sumElement.numberOfValues++ - }) - duplicatedDeployments.push(sumElement) - } + let finalDeployment = [] + try { + for (const i of deployments) { + // We filter deployments to find the values with the same date + const duplicatedValuesArray = deployments.filter((element) => compareFullDate(element.dateGreenAnalysis, i.dateGreenAnalysis)) + const sumElement = { + dateAnalysis: duplicatedValuesArray[0].dateGreenAnalysis, + domSize: 0, + nbRequest: 0, + responsesSize: 0, + ecoIndex: 0, + numberOfValues: 0 + } - // Sanitizing duplicatedDeployments by removing twins - const finalDeployment = getUniqueListByDate(duplicatedDeployments, 'dateAnalysis') + // We add up every element with the same date (only DD/MM/YYYY) in one (sumElement) + duplicatedValuesArray.forEach((element) => { + sumElement.domSize += element.domSize + sumElement.nbRequest += element.nbRequest + sumElement.responsesSize += element.responsesSize + sumElement.ecoIndex += element.ecoIndex + sumElement.numberOfValues++ + }) + duplicatedDeployments.push(sumElement) + } - function getUniqueListByDate (arr, key) { - return [...new Map(arr.map(item => [item[key], item])).values()] - } + // Sanitizing duplicatedDeployments by removing twins + finalDeployment = getUniqueListByDate(duplicatedDeployments, 'dateAnalysis') - // Finally we calculate the average for each date - for (const i of finalDeployment) { - i.domSize = Math.round(i.domSize / i.numberOfValues) - i.nbRequest = Math.round(i.nbRequest / i.numberOfValues) - i.responsesSize = Math.round(i.responsesSize / i.numberOfValues) - i.ecoIndex = Math.round(i.ecoIndex / i.numberOfValues) - delete i.numberOfValues + // Finally we calculate the average for each date + for (const i of finalDeployment) { + i.domSize = Math.round(i.domSize / i.numberOfValues) + i.nbRequest = Math.round(i.nbRequest / i.numberOfValues) + i.responsesSize = Math.round(i.responsesSize / i.numberOfValues) + i.ecoIndex = Math.round(i.ecoIndex / i.numberOfValues) + delete i.numberOfValues + } + } catch (error) { + console.error(error) + console.error('GREENIT - error during the formatting of project analysis') } - function compareFullDate (firstDate, secondDate) { - return (firstDate.getDate() === secondDate.getDate() && firstDate.getMonth() === secondDate.getMonth() && firstDate.getFullYear() === secondDate.getFullYear()) - } return finalDeployment } +function getUniqueListByDate (arr, key) { + return [...new Map(arr.map(item => [item[key], item])).values()] +} + +function compareFullDate (firstDate, secondDate) { + return (firstDate.getDate() === secondDate.getDate() && firstDate.getMonth() === secondDate.getMonth() && firstDate.getFullYear() === secondDate.getFullYear()) +} + const formatGreenItAnalysis = new FormatGreenItAnalysis() module.exports = formatGreenItAnalysis diff --git a/EcoSonar-API/services/format/formatLighthouseAnalysis.js b/EcoSonar-API/services/format/formatLighthouseAnalysis.js index dd3ff65..2dd5f6f 100644 --- a/EcoSonar-API/services/format/formatLighthouseAnalysis.js +++ b/EcoSonar-API/services/format/formatLighthouseAnalysis.js @@ -1,8 +1,9 @@ const formatCompliance = require('./formatCompliance') + class FormatLighthouseAnalysis {} FormatLighthouseAnalysis.prototype.lighthouseUrlAnalysisFormatted = function (analysis) { - let formattedAnalysis + let formattedAnalysis = null try { formattedAnalysis = { performance: { displayValue: analysis.performance.score, complianceLevel: formatCompliance.getEcodesignGrade(analysis.performance.score) }, @@ -40,14 +41,14 @@ FormatLighthouseAnalysis.prototype.lighthouseUrlAnalysisFormatted = function (an } } } catch (err) { - console.log(err) - console.log('LIGHTHOUSE - error during the formatting of project analysis') + console.error(err) + console.error('LIGHTHOUSE - error during the formatting of project analysis') } return formattedAnalysis } FormatLighthouseAnalysis.prototype.lighthouseProjectLastAnalysisFormatted = function (res) { - let analysis + let analysis = null let j = 0 let count, performance, dateAnalysis, accessibility, largestContentfulPaint, cumulativeLayoutShift, firstContentfulPaint, speedIndex, totalBlockingTime, interactive @@ -145,106 +146,108 @@ FormatLighthouseAnalysis.prototype.lighthouseProjectLastAnalysisFormatted = func } } } - return analysis } catch (err) { - console.log(err) - console.log('LIGHTHOUSE - error during the formatting of project analysis') + console.error(err) + console.error('LIGHTHOUSE - error during the formatting of project analysis') } + return analysis + function calculateAverageScore (score, toFixParam) { return (score / count).toFixed(toFixParam) } } FormatLighthouseAnalysis.prototype.lighthouseAnalysisFormattedDeployments = function (res) { - let j = 0 - const deployments = [] - - let formattedMetrics + let deployments = [] try { - while (j < res.length) { - formattedMetrics = { - performanceScore: res[j].performance.score, - accessibilityScore: res[j].accessibility.score, - dateAnalysis: res[j].dateLighthouseAnalysis, - largestContentfulPaint: res[j].largestContentfulPaint.score, - cumulativeLayoutShift: res[j].cumulativeLayoutShift.score, - firstContentfulPaint: res[j].firstContentfulPaint.score, - speedIndex: res[j].speedIndex.score, - totalBlockingTime: res[j].totalBlockingTime.score, - interactive: res[j].interactive.score + deployments = res.map((el) => { + return { + performanceScore: el.performance.score, + accessibilityScore: el.accessibility.score, + dateAnalysis: el.dateLighthouseAnalysis, + largestContentfulPaint: el.largestContentfulPaint.score, + cumulativeLayoutShift: el.cumulativeLayoutShift.score, + firstContentfulPaint: el.firstContentfulPaint.score, + speedIndex: el.speedIndex.score, + totalBlockingTime: el.totalBlockingTime.score, + interactive: el.interactive.score } - - deployments[j] = formattedMetrics - - j++ - } - return this.formatDeploymentsForGraphs(deployments) + }) + deployments = this.formatDeploymentsForGraphs(deployments) } catch (err) { - console.log(err) - console.log('LIGHTHOUSE - error during the formatting of project analysis') + console.error(err) + console.error('LIGHTHOUSE - error during the formatting of project analysis') } + return deployments } FormatLighthouseAnalysis.prototype.formatDeploymentsForGraphs = function (deployments) { const duplicatedDeployments = [] + let finalDeployment = [] - for (const i of deployments) { - // We filter deployments to find the values with the same date - const duplicatedValuesArray = deployments.filter((element) => compareFullDate(element.dateAnalysis, i.dateAnalysis)) - const sumElement = { - performanceScore: 0, - accessibilityScore: 0, - dateAnalysis: duplicatedValuesArray[0].dateAnalysis, - largestContentfulPaint: 0, - cumulativeLayoutShift: 0, - firstContentfulPaint: 0, - speedIndex: 0, - totalBlockingTime: 0, - interactive: 0, - numberOfValues: 0 - } + try { + for (const i of deployments) { + // We filter deployments to find the values with the same date + const duplicatedValuesArray = deployments.filter((element) => compareFullDate(element.dateAnalysis, i.dateAnalysis)) + const sumElement = { + performanceScore: 0, + accessibilityScore: 0, + dateAnalysis: duplicatedValuesArray[0].dateAnalysis, + largestContentfulPaint: 0, + cumulativeLayoutShift: 0, + firstContentfulPaint: 0, + speedIndex: 0, + totalBlockingTime: 0, + interactive: 0, + numberOfValues: 0 + } - // We add up every element with the same date (only DD/MM/YYYY) in one (sumElement) - duplicatedValuesArray.forEach((element) => { - sumElement.performanceScore += element.performanceScore - sumElement.accessibilityScore += element.accessibilityScore - sumElement.largestContentfulPaint += element.largestContentfulPaint - sumElement.cumulativeLayoutShift += element.cumulativeLayoutShift - sumElement.firstContentfulPaint += element.firstContentfulPaint - sumElement.speedIndex += element.speedIndex - sumElement.totalBlockingTime += element.totalBlockingTime - sumElement.interactive += element.interactive - sumElement.numberOfValues++ - }) + // We add up every element with the same date (only DD/MM/YYYY) in one (sumElement) + duplicatedValuesArray.forEach((element) => { + sumElement.performanceScore += element.performanceScore + sumElement.accessibilityScore += element.accessibilityScore + sumElement.largestContentfulPaint += element.largestContentfulPaint + sumElement.cumulativeLayoutShift += element.cumulativeLayoutShift + sumElement.firstContentfulPaint += element.firstContentfulPaint + sumElement.speedIndex += element.speedIndex + sumElement.totalBlockingTime += element.totalBlockingTime + sumElement.interactive += element.interactive + sumElement.numberOfValues++ + }) + + duplicatedDeployments.push(sumElement) + } - duplicatedDeployments.push(sumElement) + // Sanitizing duplicatedDeployments + finalDeployment = getUniqueListByDate(duplicatedDeployments, 'dateAnalysis') + + // Finally we calculate the average for each date + for (const i of finalDeployment) { + i.performanceScore = Math.round(i.performanceScore / i.numberOfValues) + i.accessibilityScore = Math.round(i.accessibilityScore / i.numberOfValues) + i.largestContentfulPaint = Math.round(i.largestContentfulPaint / i.numberOfValues) + i.cumulativeLayoutShift = Math.round(i.cumulativeLayoutShift / i.numberOfValues) + i.firstContentfulPaint = Math.round(i.firstContentfulPaint / i.numberOfValues) + i.speedIndex = Math.round(i.speedIndex / i.numberOfValues) + i.totalBlockingTime = Math.round(i.totalBlockingTime / i.numberOfValues) + i.interactive = Math.round(i.interactive / i.numberOfValues) + delete i.numberOfValues + } + } catch (err) { + console.error(err) + console.error('LIGHTHOUSE - error during the formatting of project analysis') } - // Sanitizing duplicatedDeployments - const finalDeployment = getUniqueListByDate(duplicatedDeployments, 'dateAnalysis') - - function getUniqueListByDate (arr, key) { - return [...new Map(arr.map(item => [item[key], item])).values()] - } + return finalDeployment +} - // Finally we calculate the average for each date - for (const i of finalDeployment) { - i.performanceScore = Math.round(i.performanceScore / i.numberOfValues) - i.accessibilityScore = Math.round(i.accessibilityScore / i.numberOfValues) - i.largestContentfulPaint = Math.round(i.largestContentfulPaint / i.numberOfValues) - i.cumulativeLayoutShift = Math.round(i.cumulativeLayoutShift / i.numberOfValues) - i.firstContentfulPaint = Math.round(i.firstContentfulPaint / i.numberOfValues) - i.speedIndex = Math.round(i.speedIndex / i.numberOfValues) - i.totalBlockingTime = Math.round(i.totalBlockingTime / i.numberOfValues) - i.interactive = Math.round(i.interactive / i.numberOfValues) - delete i.numberOfValues - } +function getUniqueListByDate (arr, key) { + return [...new Map(arr.map(item => [item[key], item])).values()] +} - function compareFullDate (firstDate, secondDate) { - return (firstDate.getDate() === secondDate.getDate() && firstDate.getMonth() === secondDate.getMonth() && firstDate.getFullYear() === secondDate.getFullYear()) - } - return finalDeployment +function compareFullDate (firstDate, secondDate) { + return (firstDate.getDate() === secondDate.getDate() && firstDate.getMonth() === secondDate.getMonth() && firstDate.getFullYear() === secondDate.getFullYear()) } const formatLighthouseAnalysis = new FormatLighthouseAnalysis() diff --git a/EcoSonar-API/services/format/formatW3cAnalysis.js b/EcoSonar-API/services/format/formatW3cAnalysis.js index 03ce10a..c2b2ce2 100644 --- a/EcoSonar-API/services/format/formatW3cAnalysis.js +++ b/EcoSonar-API/services/format/formatW3cAnalysis.js @@ -1,5 +1,6 @@ const formatCompliance = require('./formatCompliance') const metricsW3c = require('../../utils/metricsW3c.json') + class FormatW3cAnalysis {} /** @@ -14,28 +15,22 @@ class FormatW3cAnalysis {} * @returns a formatted deployment grouped by date to be used in the graph */ FormatW3cAnalysis.prototype.w3cAnalysisFormattedDeployments = function (deployments) { - let j = 0 - const formattedDeployments = [] - let formattedMetrics + let formattedDeployments = [] try { - while (j < deployments.length) { - // For each category of error we subtract a value from the score depending on how many of this error type are present - formattedMetrics = { - score: deployments[j].score, - dateAnalysis: deployments[j].dateW3cAnalysis, - w3cBestPractices: deployments[j].w3cBestPractices + formattedDeployments = deployments.map((el) => { + return { + score: el.score, + dateAnalysis: el.dateW3cAnalysis, + w3cBestPractices: el.w3cBestPractices } - - formattedDeployments[j] = formattedMetrics - - j++ - } - return this.formatDeploymentsForGraphs(formattedDeployments) + }) + formattedDeployments = this.formatDeploymentsForGraphs(formattedDeployments) } catch (error) { - console.log(error) - console.log('W3C - error during the formatting of project analysis') + console.error(error) + console.error('W3C - error during the formatting of project analysis') } + return formattedDeployments } /** @@ -46,40 +41,49 @@ FormatW3cAnalysis.prototype.w3cAnalysisFormattedDeployments = function (deployme FormatW3cAnalysis.prototype.formatDeploymentsForGraphs = function (formattedDeployments) { const duplicatedDeployments = [] let totalw3cPractices = [] + let finalDeployment = [] - for (const i of formattedDeployments) { - // We filter deployments to find the values with the same date - const duplicatedValuesArray = formattedDeployments.filter((element) => compareFullDate(element.dateAnalysis, i.dateAnalysis)) - for (const value of duplicatedValuesArray) { - if (value.w3cBestPractices !== undefined) { - for (const practice of value.w3cBestPractices) { - totalw3cPractices.push(practice) + try { + for (const i of formattedDeployments) { + // We filter deployments to find the values with the same date + const duplicatedValuesArray = formattedDeployments.filter((element) => compareFullDate(element.dateAnalysis, i.dateAnalysis)) + for (const value of duplicatedValuesArray) { + if (value.w3cBestPractices !== undefined) { + for (const practice of value.w3cBestPractices) { + totalw3cPractices.push(practice) + } } } - } - totalw3cPractices = formatW3c(totalw3cPractices) - const score = this.calculateScore(totalw3cPractices) - duplicatedDeployments.push({ score, dateAnalysis: duplicatedValuesArray[0].dateAnalysis }) - } - // Sanitizing duplicatedDeployments - const finalDeployment = getUniqueListByDate(duplicatedDeployments, 'dateAnalysis') - function getUniqueListByDate (arr, key) { - return [...new Map(arr.map((item) => [item[key], item])).values()] - } - function compareFullDate (firstDate, secondDate) { - return firstDate.getDate() === secondDate.getDate() && firstDate.getMonth() === secondDate.getMonth() && firstDate.getFullYear() === secondDate.getFullYear() + totalw3cPractices = formatW3c(totalw3cPractices) + const score = this.calculateScore(totalw3cPractices) + duplicatedDeployments.push({ score, dateAnalysis: duplicatedValuesArray[0].dateAnalysis }) + } + // Sanitizing duplicatedDeployments + finalDeployment = getUniqueListByDate(duplicatedDeployments, 'dateAnalysis') + } catch (error) { + console.error(error) + console.error('W3C - error during the formatting of project analysis') } + return finalDeployment } +function getUniqueListByDate (arr, key) { + return [...new Map(arr.map((item) => [item[key], item])).values()] +} + +function compareFullDate (firstDate, secondDate) { + return firstDate.getDate() === secondDate.getDate() && firstDate.getMonth() === secondDate.getMonth() && firstDate.getFullYear() === secondDate.getFullYear() +} + /** * * @param {*} latestW3cAnalysis the latest W3C analysis stored in the collection * @returns a formatted analysis to be merged in accessibility item */ FormatW3cAnalysis.prototype.w3cLastAnalysisFormatted = function (latestW3cAnalysis) { - const w3c = { totalInfo: 0, totalWarning: 0, totalError: 0, totalFatalError: 0, score: 0 } + let w3c = null let w3cMetricArray = [] let score = 0 let totalInfo = 0 @@ -93,10 +97,8 @@ FormatW3cAnalysis.prototype.w3cLastAnalysisFormatted = function (latestW3cAnalys w3cMetricArray.push(metric) } } - w3cMetricArray = formatW3c(w3cMetricArray) score = this.calculateScore(w3cMetricArray) - for (const practice of w3cMetricArray) { if (practice.type === 'info') totalInfo += 1 if (practice.type === 'warning') totalWarning += 1 @@ -104,19 +106,20 @@ FormatW3cAnalysis.prototype.w3cLastAnalysisFormatted = function (latestW3cAnalys if (practice.type === 'fatal error') totalFatalError += 1 } - // Setting the returned object - w3c.score = Math.round(score) - w3c.grade = formatCompliance.getAccessibilityGrade(w3c.score) - w3c.dateAnalysis = latestW3cAnalysis[0].dateW3cAnalysis - w3c.totalWarning = totalWarning - w3c.totalError = totalError - w3c.totalFatalError = totalFatalError - w3c.totalInfo = totalInfo - return w3c + w3c = { + totalInfo, + totalWarning, + totalError, + totalFatalError, + score: Math.round(score), + grade: formatCompliance.getAccessibilityGrade(score), + dateAnalysis: latestW3cAnalysis[0].dateW3cAnalysis + } } catch (error) { - console.log(error) - console.log('W3C - error during the formatting of project analysis') + console.error(error) + console.error('W3C - error during the formatting of project analysis') } + return w3c } /** @@ -179,7 +182,8 @@ function formatW3c (errorsList) { } return errorsListWithoutDuplicat } catch (err) { - console.log('W3C - Error during the deletion of duplicate errors for w3c analysis') + console.error(err) + console.error('W3C - Error during the deletion of duplicate errors for w3c analysis') } } const formatW3cAnalysis = new FormatW3cAnalysis() diff --git a/EcoSonar-API/services/greenit-analysis/analyseService.js b/EcoSonar-API/services/greenit-analysis/analyseService.js index 3b27cdd..ab559e9 100644 --- a/EcoSonar-API/services/greenit-analysis/analyseService.js +++ b/EcoSonar-API/services/greenit-analysis/analyseService.js @@ -23,7 +23,6 @@ async function analyse (urlList, autoscroll, projectName) { console.log('Your EcoSonar project is using user journey to audit your website, GreenIT analysis will be made into different Chromium browser for right cookies configuration') reports = await launchAllAnalysisOnDifferentBrowser(browserArgs, urlList, projectName, autoscroll) } else { - console.log('Your EcoSonar project is not using user journey to audit your website, GreenIT analysis will be made into the same Chromium Browser') reports = await launchAllAnalysisOnSameBrowser(browserArgs, urlList, projectName, autoscroll) } return reports @@ -46,12 +45,13 @@ async function launchAllAnalysisOnDifferentBrowser (browserArgs, urlList, projec try { const loginSucceeded = await authenticationService.loginIfNeeded(browser, projectName) if (loginSucceeded) { - // analyse each page report = await createGreenITReports(browser, projectName, [url], autoscroll) reports = reports.concat(report) + } else { + console.warn('Could not log in, audit for greenit-analysis is skipped') } } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) + console.error('\x1b[31m%s\x1b[0m', error) } finally { await closeBrowser(browser) } @@ -77,6 +77,8 @@ async function launchAllAnalysisOnSameBrowser (browserArgs, urlList, projectName if (loginSucceeded) { // analyse each page reports = await createGreenITReports(browser, projectName, urlList, autoscroll) + } else { + console.warn('Could not log in, audit for greenit-analysis is skipped') } } catch (error) { console.error('\x1b[31m%s\x1b[0m', error) @@ -94,7 +96,7 @@ async function closeBrowser (browser) { } else { return Promise.resolve() } - })).catch((error) => console.error('\x1b[31m%s\x1b[0m', error.message)) + })).catch((error) => console.error('\x1b[31m%s\x1b[0m', error)) await browser.close() } diff --git a/EcoSonar-API/services/greenit-analysis/greenit-analysis.js b/EcoSonar-API/services/greenit-analysis/greenit-analysis.js index 6ce8620..64eedc8 100644 --- a/EcoSonar-API/services/greenit-analysis/greenit-analysis.js +++ b/EcoSonar-API/services/greenit-analysis/greenit-analysis.js @@ -95,8 +95,8 @@ async function analyseURL (browser, projectName, url, options, autoscroll) { let harObj let userJourney await userJourneyService.getUserFlow(projectName, url) - .then((userflow) => { - userJourney = userflow + .then((result) => { + userJourney = result }).catch((error) => { console.log(error.message) }) @@ -105,7 +105,6 @@ async function analyseURL (browser, projectName, url, options, autoscroll) { console.log('GREENIT Analysis - Page requires user journey') } else { ({ page, harObj } = await launchPageWithoutUserJourney(browser, url, autoscroll)) - console.log('GREENIT Analysis - Page does not require user journey') } try { @@ -155,7 +154,7 @@ async function analyseURL (browser, projectName, url, options, autoscroll) { page.close() result.success = true } catch (error) { - console.log('\x1b[31m%s\x1b[0m', 'Error on URL ' + url) + console.error('\x1b[31m%s\x1b[0m', 'Error on URL ' + url) console.error('\x1b[31m%s\x1b[0m', error) result.success = false } diff --git a/EcoSonar-API/services/lighthouse/lighthouse.js b/EcoSonar-API/services/lighthouse/lighthouse.js index 36dfb5c..e31c48c 100644 --- a/EcoSonar-API/services/lighthouse/lighthouse.js +++ b/EcoSonar-API/services/lighthouse/lighthouse.js @@ -41,11 +41,12 @@ module.exports = { const loginSucceeded = await authenticationService.loginIfNeeded(browser, projectName) if (loginSucceeded) { for (const [index, url] of urlList.entries()) { + await browser.newPage() // prevent browser to close before ending all pages analysis try { console.log('Lighthouse Analysis launched for url ' + url) await userJourneyService.getUserFlow(projectName, url) - .then((userflow) => { - userJourney = userflow + .then((result) => { + userJourney = result }).catch((error) => { console.log(error.message) }) @@ -57,10 +58,12 @@ module.exports = { console.log('Lighthouse Analysis ended for url ' + url) results[index] = { ...lighthouseResults.lhr, url } } catch (error) { - console.log('LIGHTHOUSE ANALYSIS - An error occured when auditing ' + url) + console.error('LIGHTHOUSE ANALYSIS - An error occured when auditing ' + url) console.error('\x1b[31m%s\x1b[0m', error) } } + } else { + console.warn('Could not log in, audit for lighthouse analysis is skipped') } } catch (error) { console.error('\x1b[31m%s\x1b[0m', error) diff --git a/EcoSonar-API/services/loginProxyConfigurationService.js b/EcoSonar-API/services/loginProxyConfigurationService.js index ba7bf71..538c05c 100644 --- a/EcoSonar-API/services/loginProxyConfigurationService.js +++ b/EcoSonar-API/services/loginProxyConfigurationService.js @@ -6,36 +6,28 @@ class LoginProxyConfigurationService {} LoginProxyConfigurationService.prototype.insertLoginCredentials = async function (projectName, loginCredentials) { let projectSettingsRegistered = null - let systemError = null - const succesMessage = 'INSERT LOGIN CONFIGURATION - Success' + let systemError = false + await projectsRepository.getProjectSettings(projectName) .then((projectSettings) => { projectSettingsRegistered = projectSettings - }).catch((error) => { - if (error instanceof SystemError) { - systemError = new SystemError() - } + }).catch(() => { + systemError = true }) - if (projectSettingsRegistered === null) { + if (!systemError && projectSettingsRegistered === null) { await projectsRepository.createLoginConfiguration(projectName, loginCredentials) - .then(() => { - console.log(succesMessage) - }) .catch(() => { - systemError = new SystemError() - }) - } else { - await projectsRepository.updateLoginConfiguration(projectName, projectSettingsRegistered.procedure, loginCredentials) - .then(() => { - console.log(succesMessage) + systemError = true }) + } else if (!systemError) { + await projectsRepository.updateLoginConfiguration(projectName, loginCredentials) .catch(() => { - systemError = new SystemError() + systemError = true }) } return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) + if (systemError) { + reject(new SystemError()) } else { resolve() } @@ -44,36 +36,28 @@ LoginProxyConfigurationService.prototype.insertLoginCredentials = async function LoginProxyConfigurationService.prototype.insertProxyConfiguration = async function (projectName, proxy) { let projectSettingsRegistered = null - let systemError = null - const succesMessage = 'INSERT PROXY CONFIGURATION - Success' + let systemError = false + await projectsRepository.getProjectSettings(projectName) .then((projectSettings) => { projectSettingsRegistered = projectSettings - }).catch((error) => { - if (error instanceof SystemError) { - systemError = new SystemError() - } + }).catch(() => { + systemError = true }) - if (projectSettingsRegistered === null) { + if (!systemError && projectSettingsRegistered === null) { await projectsRepository.createProxyConfiguration(projectName, proxy) - .then(() => { - console.log(succesMessage) - }) .catch(() => { - systemError = new SystemError() - }) - } else { - await projectsRepository.updateProxyConfiguration(projectName, projectSettingsRegistered.procedure, proxy) - .then(() => { - console.log(succesMessage) + systemError = true }) + } else if (!systemError) { + await projectsRepository.updateProxyConfiguration(projectName, proxy) .catch(() => { - systemError = new SystemError() + systemError = true }) } return new Promise((resolve, reject) => { - if (systemError !== null) { - reject(systemError) + if (systemError) { + reject(new SystemError()) } else { resolve() } @@ -86,7 +70,8 @@ LoginProxyConfigurationService.prototype.getLoginCredentials = async function (p const username = process.env.ECOSONAR_ENV_AUTHENTICATION_USERNAME || '' const password = process.env.ECOSONAR_ENV_AUTHENTICATION_PASSWORD || '' let loginInformations = {} - let error = null + let error = false + if (configSettings === 'env' && authenticationUrl !== '' && username !== '' && password !== '') { loginInformations = { authentication_url: authenticationUrl, @@ -114,13 +99,13 @@ LoginProxyConfigurationService.prototype.getLoginCredentials = async function (p } } }) - .catch((errorRepository) => { - error = errorRepository + .catch(() => { + error = true }) } return new Promise((resolve, reject) => { - if (error !== null) { - reject(error) + if (error) { + reject(new SystemError()) } else if (Object.entries(loginInformations).length === 0) { reject(new Error('Your project does not have login saved.')) } else { @@ -134,7 +119,8 @@ LoginProxyConfigurationService.prototype.getProxyConfiguration = async function const ipAddress = process.env.ECOSONAR_ENV_PROXY_IP_ADDRESS || '' const port = process.env.ECOSONAR_ENV_PROXY_PORT || '' let proxyInformations = {} - let error = null + let error = false + if (configSettings === 'env' && ipAddress !== '' && port !== '') { proxyInformations = { ipAddress, @@ -155,13 +141,13 @@ LoginProxyConfigurationService.prototype.getProxyConfiguration = async function proxyInformations = result.proxy } }) - .catch((errorRepository) => { - error = errorRepository + .catch(() => { + error = true }) } return new Promise((resolve, reject) => { - if (error !== null) { - reject(error) + if (error) { + reject(new SystemError()) } else if (Object.entries(proxyInformations).length === 0) { reject(new Error('Your project does not have proxy configuration saved.')) } else { @@ -171,21 +157,59 @@ LoginProxyConfigurationService.prototype.getProxyConfiguration = async function } LoginProxyConfigurationService.prototype.deleteLoginCredentials = async function (projectName) { - const result = await projectsRepository.getProjectSettings(projectName) - if (result === null) { - throw new Error('Project not found') - } else { - projectsRepository.deleteLoginCredentials(projectName, result.procedure, result.proxy) + let projectRegistered = null + let systemError = false + + await projectsRepository.getProjectSettings(projectName) + .then((result) => { + projectRegistered = result + }) + .catch(() => { + systemError = true + }) + if (!systemError && projectRegistered === null) { + return Promise.reject(new Error('Project not found')) + } else if (!systemError) { + projectsRepository.deleteLoginCredentials(projectName, projectRegistered.procedure, projectRegistered.proxy) + .catch(() => { + systemError = true + }) } + return new Promise((resolve, reject) => { + if (systemError) { + reject(new SystemError()) + } else { + resolve() + } + }) } LoginProxyConfigurationService.prototype.deleteProxyConfiguration = async function (projectName) { - const result = await projectsRepository.getProjectSettings(projectName) - if (result === null) { - throw new Error('Project not found') - } else { - projectsRepository.deleteProxyConfiguration(projectName, result.procedure, result.login) + let projectRegistered = null + let systemError = false + + await projectsRepository.getProjectSettings(projectName) + .then((result) => { + projectRegistered = result + }) + .catch(() => { + systemError = true + }) + if (!systemError && projectRegistered === null) { + return Promise.reject(new Error('Project not found')) + } else if (!systemError) { + projectsRepository.deleteProxyConfiguration(projectName, projectRegistered.procedure, projectRegistered.login) + .catch(() => { + systemError = true + }) } + return new Promise((resolve, reject) => { + if (systemError) { + reject(new SystemError()) + } else { + resolve() + } + }) } const loginproxyConfigurationService = new LoginProxyConfigurationService() diff --git a/EcoSonar-API/services/procedureService.js b/EcoSonar-API/services/procedureService.js index 972d96b..6d10045 100644 --- a/EcoSonar-API/services/procedureService.js +++ b/EcoSonar-API/services/procedureService.js @@ -1,36 +1,27 @@ const projectsRepository = require('../dataBase/projectsRepository') -const urlsProjectRepository = require('../dataBase/urlsProjectRepository') +const SystemError = require('../utils/SystemError') class ProcedureService { } ProcedureService.prototype.saveProcedure = async function (projectName, selectedProcedure) { - // selected procedure can be equal to 'quick wins', 'highest impact', 'smart impact', 'score impact' - let projectExist + let project = null + let systemError = false + await projectsRepository.getProjectSettings(projectName) - .then((result) => { - projectExist = result - }).catch(() => { - projectExist = null - }) - let allUrls = [] - if (projectExist === null) { - allUrls = await urlsProjectRepository.findAll(projectName, true) - } + .then((result) => { project = result }) + .catch(() => { systemError = true }) + return new Promise((resolve, reject) => { - if (projectExist !== null) { + if (!systemError && project !== null) { projectsRepository.updateProjectProcedure(projectName, selectedProcedure) .then(() => resolve()) .catch((error) => reject(error)) + } else if (!systemError) { + projectsRepository.createProcedure(projectName, selectedProcedure) + .then(() => resolve()) + .catch((error) => reject(error)) } else { - if (allUrls.length > 0) { - projectsRepository.createProcedure(projectName, selectedProcedure) - .then(() => resolve()) - .catch((error) => reject(error)) - } else { - const errorMessage = 'Project not found' - console.error(errorMessage) - reject(new Error(errorMessage)) - } + reject(new SystemError()) } }) } @@ -40,7 +31,7 @@ ProcedureService.prototype.getProcedure = async function (projectName) { projectsRepository.getProjectSettings(projectName) .then((existingProject) => { if (existingProject === null || existingProject.procedure === undefined) { - reject(new Error('No procedure found for project ' + projectName)) + resolve({ procedure: '' }) } resolve({ procedure: existingProject.procedure }) }).catch((err) => { diff --git a/EcoSonar-API/services/projectService.js b/EcoSonar-API/services/projectService.js index bb1d3fe..4875861 100644 --- a/EcoSonar-API/services/projectService.js +++ b/EcoSonar-API/services/projectService.js @@ -7,13 +7,12 @@ const greenItRepository = require('../dataBase/greenItRepository') const bestPracticesRepository = require('../dataBase/bestPracticesRepository') const urlsProjectRepository = require('../dataBase/urlsProjectRepository') const tempurlsProjectRepository = require('../dataBase/tempurlsProjectRepository') -const scores = ['ecoIndex', 'perfScore', 'accessScore', 'w3cScore'] class ProjectService { } /** * get an average of all score for all projects of the database of last analysis - * @param {date} Date limit date of analysis + * @param {string} date limit date of analysis * @returns nbr of projects and an average for each score on the database at each date */ ProjectService.prototype.getAllInformationsAverage = async function (date) { @@ -22,6 +21,7 @@ ProjectService.prototype.getAllInformationsAverage = async function (date) { .then((result) => { const resultformatted = { nbProjects: result.nbProjects, ecoIndex: null, perfScore: null, accessScore: null, w3cScore: null } const scoreNbProject = { ecoIndex: null, perfScore: null, accessScore: null, w3cScore: null } + const scores = ['ecoIndex', 'perfScore', 'accessScore', 'w3cScore'] Object.keys(result.projects).forEach(project => { for (const scoreType of scores) { if (resultformatted[scoreType] !== null) { @@ -40,13 +40,73 @@ ProjectService.prototype.getAllInformationsAverage = async function (date) { }) resolve(resultformatted) }).catch((err) => { - reject(new Error(err)) + reject(err) }) }) } -function selectRightAnalysisByDateAndUrl (searchDate, projectsAnalysis, urlFieldName) { - const allAnalysisPerUrl = [] +/** + * get informations about all project of the database on last analysis + * @param {string} date limit date of analysis + * @param {Object} sortBy content to sort projects: {"type": "", "order": "" } + * @param {string} filterName filter on a string + * @param {Object} filterScore filter content on a score: {"cat": "", "score": , "select": "" } + * @returns all the informations for each project on the database at the defined date + */ +ProjectService.prototype.getAllProjectInformations = async function (date, sortBy, filterName, filterScore) { + let analysisPerProject = {} + let resultWithFilters = { nbProjects: null, projects: {} } + + try { + date = validateAndConvertDate(date) + } catch (err) { + return Promise.reject(err) + } + + try { + analysisPerProject = await retrieveAnalysisService.getAllProjectScoresAverage(filterName) + } catch (err) { + return Promise.reject(err) + } + + return new Promise((resolve, reject) => { + try { + for (const analysis of analysisPerProject) { + if (analysis.lighthouse.length > 0 || analysis.greenIt.length > 0 || analysis.w3c > 0) { + const lighthouseAnalysis = selectRightAnalysisByDateAndUrl(date, analysis.lighthouse, 'idUrlLighthouse', 'dateLighthouseAnalysis') + const greenItAnalysis = selectRightAnalysisByDateAndUrl(date, analysis.greenIt, 'idUrlGreen', 'dateGreenAnalysis') + const w3cAnalysis = selectRightAnalysisByDateAndUrl(date, analysis.w3c, 'idUrlW3c', 'dateW3cAnalysis') + + if (Object.keys(greenItAnalysis).length !== 0 || Object.keys(lighthouseAnalysis).length !== 0 || Object.keys(w3cAnalysis).length !== 0) { + let allUrls = [...(Object.keys(greenItAnalysis).length !== 0 ? Object.keys(greenItAnalysis) : []), ...(Object.keys(lighthouseAnalysis).length !== 0 ? Object.keys(lighthouseAnalysis) : []), ...(Object.keys(w3cAnalysis).length ? Object.keys(w3cAnalysis) : [])] + allUrls = Array.from(new Set(allUrls.map(JSON.stringify))) + + const projectInfos = { + ecoIndex: getFieldScore(greenItAnalysis, 'ecoIndex'), + perfScore: getFieldScore2(lighthouseAnalysis, 'performance', 'score'), + accessScore: getFieldScore2(lighthouseAnalysis, 'accessibility', 'score'), + w3cScore: getFieldScore(w3cAnalysis, 'score'), + nbUrl: allUrls.length, + dateAnalysis: getDateAnalysis(lighthouseAnalysis, greenItAnalysis, w3cAnalysis) + } + resultWithFilters.projects[analysis.name] = projectInfos + } + } + } + if (filterScore !== null) { + resultWithFilters = filterByScore(resultWithFilters, filterScore.cat, filterScore.score, filterScore.select) + } + resultWithFilters.nbProjects = Object.keys(resultWithFilters.projects).length ?? 0 + resolve(sortProjects(resultWithFilters, sortBy)) + } catch (err) { + console.error(err) + reject(new Error(err.message)) + } + }) +} + +function selectRightAnalysisByDateAndUrl (searchDate, projectsAnalysis, urlFieldName, dateFieldName) { + const allAnalysisPerUrl = {} const groupedAnalysisByIdKeys = projectsAnalysis.reduce((acc, obj) => { if (!acc[obj[urlFieldName]]) { acc[obj[urlFieldName]] = [] @@ -55,20 +115,20 @@ function selectRightAnalysisByDateAndUrl (searchDate, projectsAnalysis, urlField return acc }, {}) Object.keys(groupedAnalysisByIdKeys).forEach(id => { - const retainedAnalysis = filterPerDate(searchDate, groupedAnalysisByIdKeys[id]) + const retainedAnalysis = filterPerDate(searchDate, groupedAnalysisByIdKeys[id], dateFieldName) allAnalysisPerUrl[id] = retainedAnalysis }) return allAnalysisPerUrl } -function filterPerDate (searchDate, projectsAnalysis) { - const allDates = Object.keys(projectsAnalysis) +function filterPerDate (searchDate, projectsAnalysis, dateFieldName) { + const allDates = projectsAnalysis.map(analysis => analysis[dateFieldName]) const allDatesInRange = searchDate === null ? allDates : allDates.filter(date => new Date(date) <= searchDate) if (allDatesInRange.length === 0) return null const selectedDate = allDatesInRange.reduce((a, b) => new Date(a) > new Date(b) ? a : b) - return projectsAnalysis[selectedDate] + return projectsAnalysis.find(analysis => analysis[dateFieldName].getTime() === selectedDate.getTime()) } function filterByScore (projectsList, filterCategory, filterLevel, filterDirection) { @@ -86,6 +146,7 @@ function sortProjects (resultList, sortParams) { if (!sortParams) return resultList const { type, order } = sortParams + const scores = ['ecoIndex', 'perfScore', 'accessScore', 'w3cScore'] let sortedProjects = {} if (type === 'name') { @@ -93,7 +154,7 @@ function sortProjects (resultList, sortParams) { } else if (scores.includes(type)) { sortedProjects = sortByScore(resultList.projects, type, order) } else { - console.error('sort type does not exist') + console.error('Sort type does not exist, no sorting applied') return resultList } @@ -120,48 +181,60 @@ function sortByScore (projects, type, order) { } function validateAndConvertDate (dateToValidate) { - return new Promise((resolve, reject) => { - if (dateToValidate !== null) { - const regex = /^\d{4}-\d{2}-\d{2}$/ - if (regex.test(dateToValidate)) { - resolve(new Date(dateToValidate)) - } else { - reject(new Error('Bad date format: YYYY-MM-DD')) - } + if (dateToValidate !== null) { + const regex = /^\d{4}-\d{2}-\d{2}$/ + if (regex.test(dateToValidate)) { + return new Date(dateToValidate) } else { - resolve(null) + throw new Error('Bad date format: YYYY-MM-DD') } - }) + } else { + return null + } } function getFieldScore (analysis, fieldToSum) { + let sumScore = 0 if (!analysis) { return null } - const countUrls = Object.keys(analysis).length + let countUrls = Object.keys(analysis).length ?? 0 if (countUrls === 0) { return null } - let sumScore = 0 for (const url in analysis) { - sumScore += analysis[url][fieldToSum] + if (analysis[url] !== null) { + sumScore += analysis[url][fieldToSum] + } else { + countUrls-- + } + } + if (countUrls === 0) { + return null // all analysis were empty } - return Math.round(sumScore / countUrls) + return parseFloat((sumScore / countUrls).toFixed(2)) } function getFieldScore2 (analysis, fieldToSum1, fieldToSum2) { if (!analysis) { return null } - const countUrls = Object.keys(analysis).length + let countUrls = Object.keys(analysis).length if (countUrls === 0) { return null } let sumScore = 0 for (const url in analysis) { - sumScore += analysis[url][fieldToSum1][fieldToSum2] + if (analysis[url] !== null) { + sumScore += analysis[url][fieldToSum1][fieldToSum2] + } else { + countUrls-- + } } - return Math.round(sumScore / countUrls) + if (countUrls === 0) { + return null // all analysis were empty + } + return parseFloat((sumScore / countUrls).toFixed(2)) } function getDateAnalysis (lighthouseAnalysis, greenItAnalysis, w3cAnalysis) { @@ -186,78 +259,6 @@ function getDateAnalysis (lighthouseAnalysis, greenItAnalysis, w3cAnalysis) { return null } -/** - * get informations about all project of the database on last analysis - * @param {date} date limit date of analysis - * @param {sortBy} object content to sort projects: {"type": "", "order": "" } - * @param {filterName} string filter on a string - * @param {filterScore} object filter content on a score: {"cat": "", "score": , "select": "" } - * @returns all the informations for each project on the database at each date - */ -ProjectService.prototype.getAllProjectInformations = async function (date, sortBy, filterName, filterScore) { - let error = null - try { - date = await validateAndConvertDate(date) - } catch (err) { - error = err - } - let AnalysisPerProject = {} - if (error === null) { - try { - AnalysisPerProject = await retrieveAnalysisService.getProjectScoresAverageAll(filterName, date) - } catch (err) { - error = err - } - if (error === null) { - return new Promise((resolve, reject) => { - let resultwithfilter = { nbProjects: null, projects: {} } - try { - for (const analysis of AnalysisPerProject) { - if (analysis.lighthouse.length > 0 || analysis.greenIt.length > 0 || analysis.w3c > 0) { - const lighthouseAnalysis = selectRightAnalysisByDateAndUrl(date, analysis.lighthouse, 'idUrlLighthouse') - const greenItAnalysis = selectRightAnalysisByDateAndUrl(date, analysis.greenIt, 'idUrlGreen') - const w3cAnalysis = selectRightAnalysisByDateAndUrl(date, analysis.w3c, 'idUrlW3c') - - let projectInfos = {} - - if (greenItAnalysis !== null || lighthouseAnalysis !== null || w3cAnalysis !== null) { - let allUrls = [...(greenItAnalysis !== null ? Object.keys(greenItAnalysis) : []), ...(lighthouseAnalysis !== null ? Object.keys(lighthouseAnalysis) : []), ...(w3cAnalysis !== null ? Object.keys(w3cAnalysis) : [])] - allUrls = Array.from(new Set(allUrls.map(JSON.stringify))) - - projectInfos = { - ecoIndex: getFieldScore(greenItAnalysis, 'ecoIndex'), - perfScore: getFieldScore2(lighthouseAnalysis, 'performance', 'score'), - accessScore: getFieldScore2(lighthouseAnalysis, 'accessibility', 'score'), - w3cScore: getFieldScore(w3cAnalysis, 'score'), - nbUrl: allUrls.length, - dateAnalysis: getDateAnalysis(lighthouseAnalysis, greenItAnalysis, w3cAnalysis) - } - resultwithfilter.projects[analysis.name] = projectInfos - } - } - } - } catch (err) { - console.error(err) - reject(new SystemError(err)) - } - if (error !== null) { - reject(new SystemError()) - } else { - if (filterScore !== null) { - resultwithfilter = filterByScore(resultwithfilter, filterScore.cat, filterScore.score, filterScore.select) - } - resultwithfilter.nbProjects = Object.keys(resultwithfilter.projects).length - resolve(sortProjects(resultwithfilter, sortBy)) - } - }) - } else { - return Promise.reject(new Error(error)) - } - } else { - return Promise.reject(new Error(error)) - } -} - /** * Delete all part the project (project, urls and analysis) * @param {string} projectName name of the project to delete @@ -265,17 +266,16 @@ ProjectService.prototype.getAllProjectInformations = async function (date, sortB ProjectService.prototype.deleteProject = async function (projectName) { let urlsProjects = [] let systemError = false - try { - await urlsProjectRepository.findAll(projectName, true) - .then((result) => { - urlsProjects = result.map((e) => e.idKey) - }) - } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) - systemError = true - } + + await urlsProjectRepository.findAll(projectName) + .then((result) => { + urlsProjects = result.map((e) => e.idKey) + }).catch(() => { + systemError = true + }) + if (systemError) { - Promise.reject(new SystemError()) + return Promise.reject(new SystemError()) } try { await lighthouseRepository.deleteProject(urlsProjects) @@ -286,7 +286,7 @@ ProjectService.prototype.deleteProject = async function (projectName) { await tempurlsProjectRepository.deleteProject(projectName) await projectsRepository.deleteProjectPerProjectName(projectName) } catch (error) { - console.error('\x1b[31m%s\x1b[0m', error.message) + console.error(error) systemError = true } return new Promise((resolve, reject) => { diff --git a/EcoSonar-API/services/retrieveAnalysisService.js b/EcoSonar-API/services/retrieveAnalysisService.js index 3f30af4..7a035e5 100644 --- a/EcoSonar-API/services/retrieveAnalysisService.js +++ b/EcoSonar-API/services/retrieveAnalysisService.js @@ -1,7 +1,7 @@ const greenItRepository = require('../dataBase/greenItRepository') const lighthouseRepository = require('../dataBase/lighthouseRepository') const w3cRepository = require('../dataBase/w3cRepository') -const projectsRepository = require('../dataBase/projectsRepository') +const urlsProjectRepository = require('../dataBase/urlsProjectRepository') const formatLighthouseAnalysis = require('./format/formatLighthouseAnalysis') const SystemError = require('../utils/SystemError') const formatGreenItAnalysis = require('./format/formatGreenItAnalysis') @@ -10,82 +10,139 @@ const formatW3cAnalysis = require('./format/formatW3cAnalysis') class RetrieveAnalysisService { } /** - * Get an analysis (GreenIt & Lighthouse) from a given project and URL + * Get an analysis (GreenIt & Lighthouse & W3C) from a given project and URL * @param {string} projectName * @param {string} urlName * @returns {Object} Returns a formatted analysis */ - RetrieveAnalysisService.prototype.getUrlAnalysis = async function (projectName, urlName) { - let greenitAnalysisDeployment - let lighthouseResultDeployment - let w3cAnalysisDeployment - let w3cAnalysisLastAnalysis - let lighthouseResultLastAnalysis - let greenitAnalysisLastAnalysis - let errorRetrievedGreenItAnalysis = null - let errorRetrievedLighthouseAnalysis = null - let errorRetrievedW3cAnalysis = null + let urlProject = [] + let systemError = false + let greenitAnalysisDeployment = [] + let lighthouseResultDeployment = [] + let w3cAnalysisDeployment = [] + let w3cAnalysisLastAnalysis = null + let lighthouseResultLastAnalysis = null + let greenitAnalysisLastAnalysis = null + + await urlsProjectRepository.findUrl(projectName, urlName) + .then((result) => { urlProject = result }) + .catch(() => { systemError = true }) + + if (urlProject.length > 0) { + await w3cRepository + .findAnalysisUrl(urlProject[0].idKey) + .then((result) => { + if (result.length > 0) { + const lastIndex = result.length - 1 + const lastAnalysis = [{ + idUrlW3c: result[lastIndex].idUrlW3c, + dateW3cAnalysis: result[lastIndex].dateW3cAnalysis, + score: result[lastIndex].score, + w3cBestPractices: result[lastIndex].w3cBestPractices + }] + w3cAnalysisLastAnalysis = formatW3cAnalysis.w3cLastAnalysisFormatted(lastAnalysis) - // Fetching analysis for each tool - await w3cRepository - .findAnalysisUrl(projectName, urlName) - .then((result) => { - w3cAnalysisDeployment = result.deployments - w3cAnalysisLastAnalysis = result.w3cLastAnalysis - }) - .catch((err) => { - console.error(err) - errorRetrievedW3cAnalysis = err - w3cAnalysisDeployment = [] - w3cAnalysisLastAnalysis = null - }) + const deployments = result.map((deployment) => { + return { + idUrlW3c: deployment.idUrlW3c, + dateW3cAnalysis: deployment.dateW3cAnalysis, + score: deployment.score, + w3cBestPractices: deployment.w3cBestPractices + } + }) + w3cAnalysisDeployment = formatW3cAnalysis.w3cAnalysisFormattedDeployments(deployments) + } + }) + .catch(() => { + systemError = true + }) - await greenItRepository - .findAnalysisUrl(projectName, urlName) - .then((result) => { - greenitAnalysisDeployment = result.deployments - greenitAnalysisLastAnalysis = formatGreenItAnalysis.greenItUrlAnalysisFormatted(result.lastAnalysis) - }) - .catch((err) => { - console.error(err) - errorRetrievedGreenItAnalysis = err - greenitAnalysisDeployment = [] - greenitAnalysisLastAnalysis = null - }) - await lighthouseRepository - .findAnalysisUrl(projectName, urlName) - .then((result) => { - lighthouseResultDeployment = result.deployments - lighthouseResultLastAnalysis = formatLighthouseAnalysis.lighthouseUrlAnalysisFormatted(result.lastAnalysis) - }) - .catch((err) => { - console.error(err) - errorRetrievedLighthouseAnalysis = err - lighthouseResultDeployment = [] - lighthouseResultLastAnalysis = null - }) + await greenItRepository + .findAnalysisUrl(urlProject[0].idKey) + .then((result) => { + if (result.length > 0) { + const lastIndex = result.length - 1 + const lastAnalysis = { + domSize: result[lastIndex].domSize, + nbRequest: result[lastIndex].nbRequest, + responsesSize: result[lastIndex].responsesSize, + ecoIndex: result[lastIndex].ecoIndex, + grade: result[lastIndex].grade + } + greenitAnalysisLastAnalysis = formatGreenItAnalysis.greenItUrlAnalysisFormatted(lastAnalysis) + const deployments = result.map((deployment) => { + return { + dateGreenAnalysis: deployment.dateGreenAnalysis, + domSize: deployment.domSize, + nbRequest: deployment.nbRequest, + responsesSize: deployment.responsesSize, + ecoIndex: deployment.ecoIndex + } + }) + greenitAnalysisDeployment = formatGreenItAnalysis.formatDeploymentsForGraphs(deployments) + } + }) + .catch(() => { + systemError = true + }) + + await lighthouseRepository + .findAnalysisUrl(urlProject[0].idKey) + .then((result) => { + if (result.length > 0) { + const lastIndex = result.length - 1 + const lastAnalysis = { + dateLighthouseAnalysis: result[lastIndex].dateLighthouseAnalysis, + performance: result[lastIndex].performance, + accessibility: result[lastIndex].accessibility, + cumulativeLayoutShift: result[lastIndex].cumulativeLayoutShift, + largestContentfulPaint: result[lastIndex].largestContentfulPaint, + firstContentfulPaint: result[lastIndex].firstContentfulPaint, + speedIndex: result[lastIndex].speedIndex, + totalBlockingTime: result[lastIndex].totalBlockingTime, + interactive: result[lastIndex].interactive + } + lighthouseResultLastAnalysis = formatLighthouseAnalysis.lighthouseUrlAnalysisFormatted(lastAnalysis) + const deployments = result.map((deployment) => { + return { + dateAnalysis: deployment.dateLighthouseAnalysis, + performanceScore: deployment.performance.score, + accessibilityScore: deployment.accessibility.score, + cumulativeLayoutShift: deployment.cumulativeLayoutShift.score, + largestContentfulPaint: deployment.largestContentfulPaint.score, + firstContentfulPaint: deployment.firstContentfulPaint.score, + speedIndex: deployment.speedIndex.score, + totalBlockingTime: deployment.totalBlockingTime.score, + interactive: deployment.interactive.score + } + }) + lighthouseResultDeployment = formatLighthouseAnalysis.formatDeploymentsForGraphs(deployments) + } + }) + .catch(() => { + systemError = true + }) + } - // Creating the response content return new Promise((resolve, reject) => { - if (errorRetrievedGreenItAnalysis instanceof SystemError || errorRetrievedLighthouseAnalysis instanceof SystemError || errorRetrievedW3cAnalysis instanceof SystemError) { + if (systemError) { reject(new SystemError()) - } else if (errorRetrievedGreenItAnalysis !== null && errorRetrievedLighthouseAnalysis !== null && errorRetrievedW3cAnalysis !== null) { - reject(new Error('No analysis found for url ' + urlName + ' in project ' + projectName)) - } - const analysis = { - deployments: { - greenit: greenitAnalysisDeployment, - lighthouse: lighthouseResultDeployment, - w3c: w3cAnalysisDeployment - }, - lastAnalysis: { - greenit: greenitAnalysisLastAnalysis, - lighthouse: lighthouseResultLastAnalysis, - w3c: w3cAnalysisLastAnalysis + } else { + const analysis = { + deployments: { + greenit: greenitAnalysisDeployment, + lighthouse: lighthouseResultDeployment, + w3c: w3cAnalysisDeployment + }, + lastAnalysis: { + greenit: greenitAnalysisLastAnalysis, + lighthouse: lighthouseResultLastAnalysis, + w3c: w3cAnalysisLastAnalysis + } } + resolve(analysis) } - resolve(analysis) }) } @@ -96,94 +153,88 @@ RetrieveAnalysisService.prototype.getUrlAnalysis = async function (projectName, */ RetrieveAnalysisService.prototype.getProjectAnalysis = async function (projectName) { + let urlsIdKey = [] + let systemError = false let greenitAnalysisDeployments = [] let lighthouseAnalysisDeployments = [] let w3cAnalysisDeployment = [] - let greenitLastAnalysis, lighthouseProjectLastAnalysis, w3cProjectLastAnalysis - let catchLighthouse = null - let catchGreenit = null - let catchW3c = null - let errRetrievedAnalysisGreenit = null - let errRetrievedLighthouseAnalysis = null - let errRetrievedW3cAnalysis = null + let greenitLastAnalysis = null + let lighthouseProjectLastAnalysis = null + let w3cProjectLastAnalysis = null - await greenItRepository - .findAnalysisProject(projectName) - .then((res) => { - if (res.deployments.length !== 0) { - greenitAnalysisDeployments = formatGreenItAnalysis.formatDeploymentsForGraphs(res.deployments) - greenitLastAnalysis = formatGreenItAnalysis.greenItProjectLastAnalysisFormatted(res.lastAnalysis) - } else { - greenitLastAnalysis = null - greenitAnalysisDeployments = [] - errRetrievedAnalysisGreenit = 'GET ANALYSIS PROJECT - No greenit analysis found for project ' + projectName - } - }) - .catch((err) => { - console.error(err) - catchGreenit = err - }) - await lighthouseRepository - .findAnalysisProject(projectName) - .then((res) => { - if (res.deployments.length !== 0) { - // deployments - lighthouseAnalysisDeployments = formatLighthouseAnalysis.lighthouseAnalysisFormattedDeployments(res.deployments) + await urlsProjectRepository.findAll(projectName) + .then((result) => { urlsIdKey = result.map((el) => el.idKey) }) + .catch(() => { systemError = true }) - // lastAnalysis - lighthouseProjectLastAnalysis = formatLighthouseAnalysis.lighthouseProjectLastAnalysisFormatted(res.lastAnalysis) - } else { - errRetrievedLighthouseAnalysis = 'GET ANALYSIS PROJECT - No lighthouse Analysis found for project ' + projectName - lighthouseAnalysisDeployments = [] - lighthouseProjectLastAnalysis = null - } - }) - .catch((err) => { - console.error(err) - catchLighthouse = err - }) - - await w3cRepository.findAnalysisProject(projectName).then((res) => { - if (res.deployments.length !== 0) { - w3cAnalysisDeployment = formatW3cAnalysis.w3cAnalysisFormattedDeployments(res.deployments) + if (urlsIdKey.length > 0) { + await greenItRepository + .findAnalysisProject(urlsIdKey) + .then((result) => { + if (result.length > 0) { + const dateLastAnalysis = result[result.length - 1].dateGreenAnalysis + const lastAnalysis = result.filter((greenitAnalysis) => greenitAnalysis.dateGreenAnalysis.getTime() === dateLastAnalysis.getTime()) + greenitLastAnalysis = formatGreenItAnalysis.greenItProjectLastAnalysisFormatted(lastAnalysis) + greenitAnalysisDeployments = formatGreenItAnalysis.formatDeploymentsForGraphs(result) + } + }) + .catch(() => { + systemError = true + }) + await lighthouseRepository + .findAnalysisProject(urlsIdKey) + .then((result) => { + if (result.length > 0) { + const dateLastAnalysis = result[result.length - 1].dateLighthouseAnalysis + const lastAnalysis = result.filter( + (deployment) => + deployment.dateLighthouseAnalysis.getTime() === + dateLastAnalysis.getTime() + ) + lighthouseProjectLastAnalysis = formatLighthouseAnalysis.lighthouseProjectLastAnalysisFormatted(lastAnalysis) + lighthouseAnalysisDeployments = formatLighthouseAnalysis.lighthouseAnalysisFormattedDeployments(result) + } + }) + .catch(() => { + systemError = true + }) - // lastAnalysis - w3cProjectLastAnalysis = formatW3cAnalysis.w3cLastAnalysisFormatted(res.lastAnalysis) - } else { - errRetrievedW3cAnalysis = 'GET ANALYSIS PROJECT - No W3C Analysis found for project ' + projectName - w3cAnalysisDeployment = [] - w3cProjectLastAnalysis = null - } - }) - .catch((err) => { - console.error(err) - catchW3c = err - }) + await w3cRepository.findAnalysisProject(urlsIdKey) + .then((result) => { + if (result.length > 0) { + const dateLastAnalysis = result[result.length - 1].dateW3cAnalysis + const lastAnalysis = result.filter( + (deployment) => + deployment.dateW3cAnalysis.getTime() === + dateLastAnalysis.getTime() + ) + w3cProjectLastAnalysis = formatW3cAnalysis.w3cLastAnalysisFormatted(lastAnalysis) + w3cAnalysisDeployment = formatW3cAnalysis.w3cAnalysisFormattedDeployments(result) + } + }) + .catch(() => { + systemError = true + }) + } return new Promise((resolve, reject) => { - if (catchGreenit instanceof SystemError || catchLighthouse instanceof SystemError || catchW3c instanceof SystemError) { + if (systemError) { reject(new SystemError()) - } else if (catchGreenit !== null || catchLighthouse !== null || catchW3c !== null) { - reject(new Error('GET ANALYSIS PROJECT - error during generation of ' + projectName + ' analysis')) - } - - if (errRetrievedLighthouseAnalysis && errRetrievedAnalysisGreenit && errRetrievedW3cAnalysis) reject(new Error('GET ANALYSIS PROJECT - No Analysis found for project ' + projectName)) - - // Creating the response content - const allAnalysis = { - allowW3c: process.env.ECOSONAR_ENV_ALLOW_EXTERNAL_API, - deployments: { - greenit: greenitAnalysisDeployments, - lighthouse: lighthouseAnalysisDeployments, - w3c: w3cAnalysisDeployment - }, - lastAnalysis: { - greenit: greenitLastAnalysis, - lighthouse: lighthouseProjectLastAnalysis, - w3c: w3cProjectLastAnalysis + } else { + const analysis = { + allowW3c: process.env.ECOSONAR_ENV_ALLOW_EXTERNAL_API || 'false', + deployments: { + greenit: greenitAnalysisDeployments, + lighthouse: lighthouseAnalysisDeployments, + w3c: w3cAnalysisDeployment + }, + lastAnalysis: { + greenit: greenitLastAnalysis, + lighthouse: lighthouseProjectLastAnalysis, + w3c: w3cProjectLastAnalysis + } } + resolve(analysis) } - resolve(allAnalysis) }) } @@ -206,18 +257,19 @@ function regroupUrlIdKeyByProjectName (projects) { /** * Get the average of scores (EcoIndex & Performance & Accessibility) from all projects at a range of date * @param {string} filterName by default equal to null, if stirng is not null allow to filter project by their name - * @returns {Object} Returns the formatted average scores + * @returns {Array} Returns the formatted list of projects with analysis for each type of audit */ -RetrieveAnalysisService.prototype.getProjectScoresAverageAll = async function (filterName = null) { +RetrieveAnalysisService.prototype.getAllProjectScoresAverage = async function (filterName = null) { const result = [] - let error = null + let systemError = false try { const allLighthouseAnalysis = await lighthouseRepository.findAllAnalysis() const allgreenITAnalysis = await greenItRepository.findAllAnalysis() const allW3CAnalysis = await w3cRepository.findAllAnalysis() - let projects = await projectsRepository.findAllProjectsNames(filterName) + let projects = await urlsProjectRepository.findAllProjectsNames(filterName) projects = regroupUrlIdKeyByProjectName(projects) + for (const project of projects) { const analysisOfProjectLighthouse = groupByProject(project.IdKeys, 'idUrlLighthouse', allLighthouseAnalysis) const analysisOfProjectGreenIt = groupByProject(project.IdKeys, 'idUrlGreen', allgreenITAnalysis) @@ -230,10 +282,10 @@ RetrieveAnalysisService.prototype.getProjectScoresAverageAll = async function (f }) } } catch (err) { - error = err + systemError = true } return new Promise((resolve, reject) => { - if (error !== null) { + if (systemError) { reject(new SystemError()) } else { resolve(result) @@ -247,83 +299,94 @@ RetrieveAnalysisService.prototype.getProjectScoresAverageAll = async function (f * @returns {Object} Returns the formatted scores for the given project */ RetrieveAnalysisService.prototype.getProjectScores = async function (projectName) { - let ecoIndex = 0 - let accessScore = 0 - let perfScore = 0 - let w3cScore = 0 - let catchLighthouse = null - let catchGreenit = null - let catchW3c = null - let errRetrievedAnalysisGreenit = null - let errRetrievedLighthouseAnalysis = null - let errRetrievedW3cAnalysis = null + let urlsIdKey = [] + let systemError = false + let ecoIndex = null + let accessScore = null + let perfScore = null + let w3cScore = null + + await urlsProjectRepository.findAll(projectName) + .then((result) => { urlsIdKey = result.map((el) => el.idKey) }) + .catch(() => { systemError = true }) - await greenItRepository - .findScoreProject(projectName) - .then((res) => { - if (res.scores !== null) { - for (const score of res.scores) { - ecoIndex += score.ecoIndex + if (urlsIdKey.length > 0) { + await greenItRepository + .findScoreProject(urlsIdKey) + .then((res) => { + if (res.length > 0) { + const dateLastAnalysis = res[res.length - 1].dateGreenAnalysis + const lastAnalysis = res.filter((greenitAnalysis) => greenitAnalysis.dateGreenAnalysis.getTime() === dateLastAnalysis.getTime()) + ecoIndex = 0 + for (const score of lastAnalysis) { + ecoIndex += score.ecoIndex + } + ecoIndex = ecoIndex / lastAnalysis.length + } else { + console.log('Greenit - no greenit analysis found for ' + projectName) } - ecoIndex = ecoIndex / res.scores.length - } else { - ecoIndex = null - console.log('GET ECOSONAR PROJECT SCORES - No greenit analysis found for project ' + projectName) - errRetrievedAnalysisGreenit = 'No greenit analysis found for project ' + projectName - } - }) - .catch((err) => { - ecoIndex = null - catchGreenit = err - }) - await lighthouseRepository - .findScoreProject(projectName) - .then((res) => { - if (res.scores !== null) { - for (const score of res.scores) { - accessScore += score.accessibility.score - perfScore += score.performance.score + }) + .catch(() => { + systemError = true + }) + + await lighthouseRepository + .findScoreProject(urlsIdKey) + .then((res) => { + if (res.length > 0) { + const dateLastAnalysis = res[res.length - 1].dateLighthouseAnalysis + const lastAnalysis = res.filter( + (deployment) => + deployment.dateLighthouseAnalysis.getTime() === + dateLastAnalysis.getTime() + ) + accessScore = 0 + perfScore = 0 + for (const score of lastAnalysis) { + accessScore += score.accessibility.score + perfScore += score.performance.score + } + accessScore = accessScore / lastAnalysis.length + perfScore = perfScore / lastAnalysis.length + } else { + console.log('No lighthouse Analysis found for project ' + projectName) } - accessScore = accessScore / res.scores.length - perfScore = perfScore / res.scores.length - } else { - accessScore = null - perfScore = null - console.log('GET ECOSONAR PROJECT SCORES - No lighthouse Analysis found for project ' + projectName) - errRetrievedLighthouseAnalysis = 'No lighthouse Analysis found for project ' + projectName - } - }) - .catch((err) => { - accessScore = null - perfScore = null - catchLighthouse = err - }) + }) + .catch(() => { + systemError = true + }) - await w3cRepository.findAnalysisProject(projectName).then((res) => { - if (res.deployments.length !== 0) { - const w3cProjectLastAnalysis = formatW3cAnalysis.w3cLastAnalysisFormatted(res.lastAnalysis) - w3cScore = w3cProjectLastAnalysis.score - } else { - w3cScore = null - console.log('GET ECOSONAR PROJECT SCORES - No W3C Analysis found for project ' + projectName) - errRetrievedW3cAnalysis = 'No W3C Analysis found for project ' + projectName - } - }) - .catch((err) => { - w3cScore = null - catchW3c = err - }) + await w3cRepository.findAnalysisProject(urlsIdKey) + .then((res) => { + if (res.length > 0) { + const dateLastAnalysis = res[res.length - 1].dateW3cAnalysis + const lastAnalysis = res.filter( + (deployment) => + deployment.dateW3cAnalysis.getTime() === + dateLastAnalysis.getTime() + ) + const w3cProjectLastAnalysis = formatW3cAnalysis.w3cLastAnalysisFormatted(lastAnalysis) + w3cScore = w3cProjectLastAnalysis.score + } else { + console.log('No W3C Analysis found for project ' + projectName) + } + }) + .catch(() => { + systemError = true + }) + } return new Promise((resolve, reject) => { - if (catchGreenit instanceof SystemError || catchLighthouse instanceof SystemError || catchW3c instanceof SystemError) { + if (systemError) { reject(new SystemError()) - } else if (errRetrievedLighthouseAnalysis !== null && errRetrievedAnalysisGreenit !== null && errRetrievedW3cAnalysis !== null) reject(new Error('No Analysis found for project ' + projectName)) - resolve({ - ecoIndex: ecoIndex !== null ? Math.round(ecoIndex) : null, - perfScore: perfScore !== null ? Math.round(perfScore) : null, - accessibilityScore: accessScore !== null ? Math.round(accessScore) : null, - w3cScore: w3cScore !== null ? Math.round(w3cScore) : null - }) + } else { + resolve({ + ecoIndex: ecoIndex !== null ? Math.round(ecoIndex) : null, + perfScore: perfScore !== null ? Math.round(perfScore) : null, + accessibilityScore: accessScore !== null ? Math.round(accessScore) : null, + w3cScore: w3cScore !== null ? Math.round(w3cScore) : null + }) + } }) } diff --git a/EcoSonar-API/services/retrieveBestPracticesService.js b/EcoSonar-API/services/retrieveBestPracticesService.js index adcb1b1..aa07b19 100644 --- a/EcoSonar-API/services/retrieveBestPracticesService.js +++ b/EcoSonar-API/services/retrieveBestPracticesService.js @@ -5,6 +5,9 @@ const w3cRepository = require('../dataBase/w3cRepository') const formatW3cBestPractices = require('./format/formatW3cBestPractices') const bestPracticesSorting = require('./format/bestPracticesSorting') const projectsRepository = require('../dataBase/projectsRepository') +const urlsProjectRepository = require('../dataBase/urlsProjectRepository') +const SystemError = require('../utils/SystemError') + class RetrieveBestPracticesService { } /** @@ -13,69 +16,85 @@ class RetrieveBestPracticesService { } * @returns {Object} Returns the formatted best practices for the given project */ RetrieveBestPracticesService.prototype.getProjectAnalysis = async function (projectName) { - // Fetching W3C analysis in W3CS collection - let w3cAnalysis - await w3cRepository - .findAnalysisProject(projectName) - .then((result) => { - if (result.length === 0) { - console.log('GET BEST PRACTICES PROJECT - no W3C analysis found for project ' + projectName) - } else { - w3cAnalysis = result - } - }) - .catch((err) => { - console.log(err) - }) + let urlsIdKey = [] + let accessibility = {} + let bestPractices = [] + let bestPracticesForProject = {} + let systemError = false let procedure = '' - await projectsRepository.getProjectSettings(projectName).then((result) => { - procedure = result.procedure - }).catch(() => { - console.log('Best Practices is returned with default procedure score impact') - }) - return new Promise((resolve, reject) => { - bestPracticesRepository.findAll(projectName) - .then((reports) => { - if (reports.length === 0) { - console.log('GET BEST PRACTICES PROJECT- no best practices analysis found for project ' + projectName) - reject(new Error('No best practices analysis has been launched for project ' + projectName)) - } else { - let res = {} - const greenIt = formatGreenItReports.returnFormattedGreenIt(reports) - const lighthousePerformance = formatLighthouseBestPractices.returnFormattedPerformance(reports) - const ecoDesign = Object.assign(greenIt, lighthousePerformance) - - // Filtering averageScore depending of they are numeric values or string ('N.A') - let numbersAverageScorePerf = Object.fromEntries(Object.entries(ecoDesign).filter((element) => typeof element[1].averageScore === 'number')) - const nonNumbersAverageScorePerf = Object.fromEntries(Object.entries(ecoDesign).filter((element) => typeof element[1].averageScore !== 'number')) - numbersAverageScorePerf = Object.fromEntries(Object.entries(numbersAverageScorePerf).sort((a, b) => a[1].averageScore - b[1].averageScore)) - res.ecodesign = Object.assign(numbersAverageScorePerf, nonNumbersAverageScorePerf) - res.dateAnalysisBestPractices = reports[0].dateAnalysisBestPractices - let accessibility = formatLighthouseBestPractices.returnFormattedAccessibility(reports) - - // Check if there is a W3C Analysis as user can disable this analysis with environment variable - if (w3cAnalysis.deployments.length > 0) { - accessibility = Object.assign(accessibility, formatW3cBestPractices.returnFormattedW3c(w3cAnalysis.lastAnalysis)) - } - - // Filtering averageScore depending of they are numeric values or string ('N.A') - let numbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore === 'number')) - const nonNumbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore !== 'number')) - numbersAverageScore = Object.fromEntries(Object.entries(numbersAverageScore).sort((a, b) => a[1].averageScore - b[1].averageScore)) - res.accessibility = Object.assign(numbersAverageScore, nonNumbersAverageScore) - - // sorting - if (procedure === 'highestImpact') { - res = bestPracticesSorting.sortByHighestImpact(res) - } else if (procedure === 'quickWins') { - res = bestPracticesSorting.sortByQuickWins(res) - } - - resolve(res) + + await urlsProjectRepository.findAll(projectName) + .then((result) => { urlsIdKey = result.map((el) => el.idKey) }) + .catch(() => { systemError = true }) + + if (urlsIdKey.length > 0) { + await projectsRepository.getProjectSettings(projectName) + .then((result) => { + if (result === null) { + console.log('Best Practices is returned with default procedure score impact') + } + procedure = result.procedure + }).catch(() => { + console.log('Best Practices is returned with default procedure score impact') + }) + + await w3cRepository + .findAnalysisProject(urlsIdKey) + .then((result) => { + if (result.length > 0) { + const dateLastAnalysis = result[result.length - 1].dateW3cAnalysis + const lastAnalysis = result.filter((deployment) => deployment.dateW3cAnalysis.getTime() === dateLastAnalysis.getTime()) + accessibility = formatW3cBestPractices.returnFormattedW3c(lastAnalysis) + bestPracticesForProject.dateAnalysisBestPractices = dateLastAnalysis } - }).catch((err) => { - reject(err) }) + .catch(() => { systemError = true }) + + await bestPracticesRepository.findBestPracticesForProject(urlsIdKey) + .then((result) => { + if (result.length > 0) { + const dateLastAnalysis = result[result.length - 1].dateAnalysisBestPractices + bestPracticesForProject.dateAnalysisBestPractices = dateLastAnalysis + bestPractices = result.filter((deployment) => deployment.dateAnalysisBestPractices.getTime() === dateLastAnalysis.getTime()) + } + }).catch(() => { + systemError = true + }) + + if (bestPractices.length > 0) { + const greenIt = formatGreenItReports.returnFormattedGreenIt(bestPractices) + const lighthousePerformance = formatLighthouseBestPractices.returnFormattedPerformance(bestPractices) + const ecoDesign = Object.assign(greenIt, lighthousePerformance) + + // Filtering averageScore depending of they are numeric values or string ('N.A') + let numbersAverageScorePerf = Object.fromEntries(Object.entries(ecoDesign).filter((element) => typeof element[1].averageScore === 'number')) + const nonNumbersAverageScorePerf = Object.fromEntries(Object.entries(ecoDesign).filter((element) => typeof element[1].averageScore !== 'number')) + numbersAverageScorePerf = Object.fromEntries(Object.entries(numbersAverageScorePerf).sort((a, b) => a[1].averageScore - b[1].averageScore)) + bestPracticesForProject.ecodesign = Object.assign(numbersAverageScorePerf, nonNumbersAverageScorePerf) + accessibility = Object.assign(accessibility, formatLighthouseBestPractices.returnFormattedAccessibility(bestPractices)) + } + + if (Object.keys(accessibility).length > 0) { + // Filtering averageScore depending of they are numeric values or string ('N.A') + let numbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore === 'number')) + const nonNumbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore !== 'number')) + numbersAverageScore = Object.fromEntries(Object.entries(numbersAverageScore).sort((a, b) => a[1].averageScore - b[1].averageScore)) + bestPracticesForProject.accessibility = Object.assign(numbersAverageScore, nonNumbersAverageScore) + } + + if (procedure === 'highestImpact') { + bestPracticesForProject = bestPracticesSorting.sortByHighestImpact(bestPracticesForProject) + } else if (procedure === 'quickWins') { + bestPracticesForProject = bestPracticesSorting.sortByQuickWins(bestPracticesForProject) + } + } + + return new Promise((resolve, reject) => { + if (systemError) { + reject(new SystemError()) + } else { + resolve(bestPracticesForProject) + } }) } @@ -85,54 +104,98 @@ RetrieveBestPracticesService.prototype.getProjectAnalysis = async function (proj * @param {url} urlName * @returns {Object} Returns the formatted best practices for the given url */ -RetrieveBestPracticesService.prototype.getUrlBestPractices = function (projectName, urlName) { - return new Promise((resolve, reject) => { - // Fetching W3C analysis in W3CS collection - let w3cAnalysisForUrl - w3cRepository - .find(projectName, urlName) - .then((result) => { - if (result.length === 0) { - console.log(`GET BEST PRACTICES URL - no W3C analysis found for url ${urlName} into ${projectName}`) - } else { - w3cAnalysisForUrl = result - } - }) - .catch((err) => { - console.log(err.message) - }) +RetrieveBestPracticesService.prototype.getUrlBestPractices = async function (projectName, urlName) { + let lastBestPracticesForUrl = {} + let urlProjectKey + let w3cAnalysisForUrl + let bestPractices + let accessibility = {} + let systemError = false + let procedure = '' - bestPracticesRepository.find(projectName, urlName) - .then((reports) => { - if (reports.length === 0) { - console.log(`GET BEST PRACTICES URL - no best practices analysis found for url ${urlName} into ${projectName}`) - reject(new Error(`No best practices analysis has been launched for url ${urlName} into ${projectName}`)) - } else { - const res = {} - const greenIt = formatGreenItReports.returnFormattedGreenIt(reports) - const lighthousePerformance = formatLighthouseBestPractices.returnFormattedPerformance(reports) - const ecoDesign = Object.assign(greenIt, lighthousePerformance) - res.ecodesign = Object.fromEntries(Object.entries(ecoDesign).sort((a, b) => a[1].averageScore - b[1].averageScore)) - let accessibility = formatLighthouseBestPractices.returnFormattedAccessibility(reports) - res.dateAnalysisBestPractices = reports[0].dateAnalysisBestPractices - - // Check if there is a W3C Analysis as user can disable this analysis with environment variable - if (w3cAnalysisForUrl) { - accessibility = Object.assign(accessibility, formatW3cBestPractices.returnFormattedW3c(w3cAnalysisForUrl)) - } - - // Filtering averageScore depeding of they are numeric values or string ('N.A') - let numbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore === 'number')) - const nonNumbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore !== 'number')) - numbersAverageScore = Object.fromEntries(Object.entries(numbersAverageScore).sort((a, b) => a[1].averageScore - b[1].averageScore)) - res.accessibility = Object.assign(numbersAverageScore, nonNumbersAverageScore) - res.accessibility = Object.fromEntries(Object.entries(res.accessibility).sort((a, b) => a[1].averageScore - b[1].averageScore)) - - resolve(res) - } - }).catch((err) => { - reject(err) - }) + await urlsProjectRepository.findUrl(projectName, urlName) + .then((result) => { + if (result.length > 0) { + urlProjectKey = result[0].idKey + } + }) + .catch(() => { + systemError = true + }) + if (!urlProjectKey || systemError) { + return Promise.reject(new SystemError()) + } + await projectsRepository.getProjectSettings(projectName) + .then((result) => { + if (result === null) { + console.log('Best Practices is returned with default procedure score impact') + } + procedure = result.procedure + }).catch(() => { + console.log('Best Practices is returned with default procedure score impact') + }) + + await w3cRepository + .findAnalysisUrl(urlProjectKey) + .then((result) => { + if (result.length > 0) { + const lastIndex = result.length - 1 + w3cAnalysisForUrl = [{ + idUrlW3c: result[lastIndex].idUrlW3c, + dateW3cAnalysis: result[lastIndex].dateW3cAnalysis, + score: result[lastIndex].score, + w3cBestPractices: result[lastIndex].w3cBestPractices + }] + accessibility = formatW3cBestPractices.returnFormattedW3c(w3cAnalysisForUrl) + lastBestPracticesForUrl.dateAnalysisBestPractices = w3cAnalysisForUrl[0].dateW3cAnalysis + } + }) + .catch(() => { + systemError = true + }) + + await bestPracticesRepository.findBestPracticesForUrl(urlProjectKey) + .then((reports) => { + bestPractices = reports + }).catch(() => { + systemError = true + }) + + if (bestPractices.length > 0) { + const greenIt = formatGreenItReports.returnFormattedGreenIt(bestPractices) + const lighthousePerformance = formatLighthouseBestPractices.returnFormattedPerformance(bestPractices) + const ecoDesign = Object.assign(greenIt, lighthousePerformance) + + // Filtering averageScore depending of they are numeric values or string ('N.A') + let numbersAverageScorePerf = Object.fromEntries(Object.entries(ecoDesign).filter((element) => typeof element[1].averageScore === 'number')) + const nonNumbersAverageScorePerf = Object.fromEntries(Object.entries(ecoDesign).filter((element) => typeof element[1].averageScore !== 'number')) + numbersAverageScorePerf = Object.fromEntries(Object.entries(numbersAverageScorePerf).sort((a, b) => a[1].averageScore - b[1].averageScore)) + lastBestPracticesForUrl.ecodesign = Object.assign(numbersAverageScorePerf, nonNumbersAverageScorePerf) + + accessibility = Object.assign(accessibility, formatLighthouseBestPractices.returnFormattedAccessibility(bestPractices)) + lastBestPracticesForUrl.dateAnalysisBestPractices = bestPractices[0].dateAnalysisBestPractices + } + + if (Object.keys(accessibility).length > 0) { + // Filtering averageScore depeding of they are numeric values or string ('N.A') + let numbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore === 'number')) + const nonNumbersAverageScore = Object.fromEntries(Object.entries(accessibility).filter((element) => typeof element[1].averageScore !== 'number')) + numbersAverageScore = Object.fromEntries(Object.entries(numbersAverageScore).sort((a, b) => a[1].averageScore - b[1].averageScore)) + lastBestPracticesForUrl.accessibility = Object.assign(numbersAverageScore, nonNumbersAverageScore) + } + + if (procedure === 'highestImpact') { + lastBestPracticesForUrl = bestPracticesSorting.sortByHighestImpact(lastBestPracticesForUrl) + } else if (procedure === 'quickWins') { + lastBestPracticesForUrl = bestPracticesSorting.sortByQuickWins(lastBestPracticesForUrl) + } + + return new Promise((resolve, reject) => { + if (systemError) { + reject(new SystemError()) + } else { + resolve(lastBestPracticesForUrl) + } }) } diff --git a/EcoSonar-API/services/urlConfigurationService.js b/EcoSonar-API/services/urlConfigurationService.js index 037a1c9..343f08d 100644 --- a/EcoSonar-API/services/urlConfigurationService.js +++ b/EcoSonar-API/services/urlConfigurationService.js @@ -1,5 +1,9 @@ const tempUrlsProjectRepository = require('../dataBase/tempurlsProjectRepository') const urlsProjectRepository = require('../dataBase/urlsProjectRepository') +const greenItRepository = require('../dataBase/greenItRepository') +const lighthouseRepository = require('../dataBase/lighthouseRepository') +const bestPracticesRepository = require('../dataBase/bestPracticesRepository') +const w3cRepository = require('../dataBase/w3cRepository') const SystemError = require('../utils/SystemError') class UrlConfigurationService { @@ -13,11 +17,8 @@ class UrlConfigurationService { */ UrlConfigurationService.prototype.getAll = function (projectName) { return new Promise((resolve, reject) => { - urlsProjectRepository.findAll(projectName, false) + urlsProjectRepository.findAll(projectName) .then((results) => { - if (results.length === 0) { - reject(new Error('Your project has no url assigned into EcoSonar. You must at least add one url if you want to analyse ecodesign practices.')) - } const resultatsFormatted = results.map((res) => res.urlName) resolve(resultatsFormatted) }) @@ -30,7 +31,7 @@ UrlConfigurationService.prototype.getAll = function (projectName) { /** * @param {String} projectName is the name of the project on wich we try to insert urls - * @param {*} urlList is the list of the URLs to be inserted + * @param {*} urlToBeAdded is the list of the URLs to be inserted * This function will do 2 checks : * 1 - Verify into database if URL isn't already registered * 2- Verify that every URLs in the list is different @@ -40,46 +41,45 @@ UrlConfigurationService.prototype.getAll = function (projectName) { * URLs are trimmed to avoid issues with copy-paste adding whitespace and tab charactes * @reject in case of error, the function reject error type and description */ -UrlConfigurationService.prototype.insert = async function (projectName, urlList) { - // Initializing parameters - +UrlConfigurationService.prototype.insert = async function (projectName, urlToBeAdded) { let systemError = false let urlAlreadyAddedInProject = [] let errorRegexp = [] - // Retrieving URLs in database for project - await urlsProjectRepository.findAll(projectName, true) - .then((urlListResult) => { urlAlreadyAddedInProject = urlListResult.map((res) => res.urlName) }) + + await urlsProjectRepository.findAll(projectName) + .then((urls) => { urlAlreadyAddedInProject = urls.map((res) => res.urlName) }) .catch((error) => { if (error instanceof SystemError) { systemError = true } }) - const { errorArray, notInsertedArray } = verifyNoDuplication(urlList, urlAlreadyAddedInProject) + const { errorArray, notInsertedArray } = verifyNoDuplication(urlToBeAdded, urlAlreadyAddedInProject) - if (notInsertedArray.length === 0 && !systemError) { - urlsProjectRepository.insertAll(projectName, urlList) + if (!systemError && notInsertedArray.length === 0) { + urlsProjectRepository.insertAll(projectName, urlToBeAdded) .catch((error) => { if (error instanceof SystemError) { systemError = true + } else { + errorRegexp = error } - errorRegexp = error }) } - if (notInsertedArray.length === 0 && !systemError && errorRegexp.length === 0) { - systemError = await removeTemporaryUrlsThatWereSaved(projectName, urlList) + if (!systemError && notInsertedArray.length === 0 && errorRegexp.length === 0) { + systemError = await removeTemporaryUrlsThatWereSaved(projectName, urlToBeAdded) } return new Promise((resolve, reject) => { if (notInsertedArray.length > 0) { - console.log('URL CONFIGURATION SERVICE - Some urls are duplicated') + console.error('URL CONFIGURATION SERVICE - Some urls are duplicated') reject(errorArray) } else if (errorRegexp.length > 0) { - console.log('URL CONFIGURATION SERVICE - Some urls are invalid') + console.error('URL CONFIGURATION SERVICE - Some urls are invalid') reject(errorRegexp) } else if (systemError) { - console.log('URL CONFIGURATION SERVICE - An error occured when reaching the database') + console.error('URL CONFIGURATION SERVICE - An error occured when reaching the database') reject(new SystemError()) } else { resolve() @@ -87,14 +87,15 @@ UrlConfigurationService.prototype.insert = async function (projectName, urlList) }) } -function verifyNoDuplication (urlList, urlAlreadyAddedInProject) { +function verifyNoDuplication (urlToBeAdded, urlAlreadyAddedInProject) { const errorArray = [] const notInsertedArray = [] let index = 0 - while (index < urlList.length) { - const newList = urlList.filter((url) => url.trim() === urlList[index].trim()) - if (urlAlreadyAddedInProject.includes(urlList[index].trim()) || newList.length > 1) { - notInsertedArray.push(urlList[index].trim()) + while (index < urlToBeAdded.length) { + const urlToBeChecked = urlToBeAdded[index].trim() + const listWithDuplicates = urlToBeAdded.filter((url) => url.trim() === urlToBeChecked) + if (urlAlreadyAddedInProject.includes(urlToBeChecked) || listWithDuplicates.length > 1) { + notInsertedArray.push(urlToBeChecked) errorArray[index] = 'URL was duplicated or already inserted' } else { errorArray[index] = '' @@ -131,11 +132,32 @@ async function removeTemporaryUrlsThatWereSaved (projectName, urlList) { * Delete a url into a project */ UrlConfigurationService.prototype.delete = async function (projectName, urlName) { - return new Promise((resolve, reject) => { - urlsProjectRepository.delete(projectName, urlName) - .then((res) => { resolve(res) }) - .catch((error) => { reject(error) }) - }) + let systemError = false + let urlToDelete = [] + + await urlsProjectRepository.findAll(projectName) + .then((result) => { + urlToDelete = result.filter((e) => e.urlName === urlName) + }).catch(() => { + systemError = true + }) + + if (!systemError && urlToDelete.length > 0) { + try { + await lighthouseRepository.deleteAnalysisFromUrl(urlToDelete) + await greenItRepository.deleteAnalysisFromUrl(urlToDelete) + await w3cRepository.deleteAnalysisFromUrl(urlToDelete) + await bestPracticesRepository.deleteAnalysisFromUrl(urlToDelete) + await urlsProjectRepository.deleteUrl(urlToDelete) + return Promise.resolve() + } catch (error) { + return Promise.reject(new SystemError()) + } + } else if (systemError) { + return Promise.reject(new SystemError()) + } else { + return Promise.reject(new Error(urlName + ' in ' + projectName + ' not found')) + } } const urlConfigurationService = new UrlConfigurationService() diff --git a/EcoSonar-API/services/userJourneyService.js b/EcoSonar-API/services/userJourneyService.js index bb3b68f..13f8184 100644 --- a/EcoSonar-API/services/userJourneyService.js +++ b/EcoSonar-API/services/userJourneyService.js @@ -3,6 +3,7 @@ const PuppeteerHar = require('puppeteer-har') const { clickOnElement, waitForSelectors, applyChange } = require('../utils/playSelectors') const urlsProjectRepository = require('../dataBase/urlsProjectRepository') const viewPortParams = require('../utils/viewportParams') +const SystemError = require('../utils/SystemError') class UserJourneyService { } @@ -50,14 +51,14 @@ UserJourneyService.prototype.playUserJourney = async function (url, browser, use await applyChange(step.value, element) break case 'scroll' : - await userJourneyService.scrollUntilPercentage(page, step.distancePercentage) + await userJourneyService.scrollUntil(page, step.distancePercentage, step.selectors) break default: break } } catch (error) { - console.log('USER JOURNEY : An error occured when launching user flow for url ' + url + ' in step ' + step.type) - console.log(error.message) + console.error('USER JOURNEY : An error occured when launching user flow for url ' + url + ' in step ' + step.type) + console.error(error) } } await page.waitForNavigation() @@ -92,7 +93,7 @@ UserJourneyService.prototype.playUserFlowLighthouse = async function (url, brows await applyChange(step.value, element) break case 'scroll' : - await userJourneyService.scrollUntilPercentage(targetPage, step.distancePercentage) + await userJourneyService.scrollUntil(targetPage, step.distancePercentage, step.selectors) break default: break @@ -105,57 +106,103 @@ UserJourneyService.prototype.playUserFlowLighthouse = async function (url, brows } UserJourneyService.prototype.insertUserFlow = async function (projectName, url, userFlow) { - const urlsProject = await urlsProjectRepository.getUserFlow(projectName, url) - if (urlsProject === null) { - console.log('UPDATE USER FLOW - Url not found') - throw new Error('Url not found') - } else { - await urlsProjectRepository.insertUserFlow(urlsProject, userFlow) - .then(() => { - console.log('UPDATE USER FLOW - Success') + let urlProject = null + let systemError = false + + await urlsProjectRepository.getUserFlow(projectName, url) + .then((result) => { + urlProject = result + }) + .catch(() => { + systemError = true + }) + if (!systemError && urlProject === null) { + return Promise.reject(new Error('Url not found')) + } else if (!systemError) { + await urlsProjectRepository.insertUserFlow(urlProject, userFlow) + .catch(() => { + systemError = true }) } + return new Promise((resolve, reject) => { + if (systemError) { + reject(new SystemError()) + } else { + resolve() + } + }) } UserJourneyService.prototype.getUserFlow = async function (projectName, url) { - const urlsProject = await urlsProjectRepository.getUserFlow(projectName, url) return new Promise((resolve, reject) => { - if (urlsProject === null || urlsProject.userFlow === undefined) { - console.log('GET USER FLOW - Url flow not found') - reject(new Error('The page to audit does not have any user flow saved into database.')) - } else { - resolve(Object.fromEntries(urlsProject.userFlow)) - } + urlsProjectRepository.getUserFlow(projectName, url) + .then((result) => { + if (result === null || result.userFlow === undefined) { + console.log('GET USER FLOW - Url flow not found') + reject(new Error('The page to audit does not have any user flow saved into database.')) + } else { + resolve(Object.fromEntries(result.userFlow)) + } + }) + .catch((error) => { + reject(error) + }) }) } UserJourneyService.prototype.deleteUserFlow = async function (projectName, url) { - const urlsProject = await urlsProjectRepository.getUserFlow(projectName, url) - if (urlsProject === null) { - console.log('UPDATE USER FLOW - Url not found') - throw new Error('Url not found') - } else { + let urlProject = null + let systemError = false + + await urlsProjectRepository.getUserFlow(projectName, url) + .then((result) => { + urlProject = result + }) + .catch(() => { + systemError = true + }) + if (!systemError && urlProject === null) { + return Promise.reject(new Error('Url not found')) + } else if (!systemError) { urlsProjectRepository.deleteUserFlow(projectName, url) + .catch(() => { + systemError = true + }) } + return new Promise((resolve, reject) => { + if (systemError) { + reject(new SystemError()) + } else { + resolve() + } + }) } -UserJourneyService.prototype.scrollUntilPercentage = async function (page, distancePercentage) { +UserJourneyService.prototype.scrollUntil = async function (page, distancePercentage, selectors = null) { console.log('AUTOSCROLL - autoscroll has started') - await page.evaluate(async (percentage) => { - await new Promise((resolve, _reject) => { - let totalHeight = 0 - const distance = 100 - const scrollHeight = document.body.scrollHeight * percentage / 100 - const timer = setInterval(() => { - window.scrollBy(0, distance) - totalHeight += distance - if (totalHeight >= scrollHeight) { - clearInterval(timer) - resolve() - } - }, 100) - }) - }, distancePercentage) + if (distancePercentage) { + await page.evaluate(async (percentage) => { + await new Promise((resolve, _reject) => { + let totalHeight = 0 + const distance = 100 + const scrollHeight = document.body.scrollHeight * percentage / 100 + const timer = setInterval(() => { + window.scrollBy(0, distance) + totalHeight += distance + if (totalHeight >= scrollHeight) { + clearInterval(timer) + resolve() + } + }, 100) + }) + }, distancePercentage) + } else if (selectors !== null) { + await page.evaluate((selector) => { + const element = document.querySelector(selector[0]) + const y = element.getBoundingClientRect().top + window.scrollY + window.scrollTo({ top: y - 100 }) + }, selectors) + } console.log('AUTOSCROLL - Autoscroll has ended ') } diff --git a/EcoSonar-API/utils/enumAudits.js b/EcoSonar-API/utils/enumAudits.js index 5acc67f..80a7e36 100644 --- a/EcoSonar-API/utils/enumAudits.js +++ b/EcoSonar-API/utils/enumAudits.js @@ -76,6 +76,7 @@ EnumAudits.prototype.performanceNamesToReturn = function () { usesLongCacheTtl: 'uses-long-cache-ttl', usesResponsiveImages: 'uses-responsive-images', offscreenImages: 'offscreen-images', + unminifiedJavascript: 'unminified-javascript', unusedCssRules: 'unused-css-rules', unusedJavascript: 'unused-javascript', usesOptimizedImages: 'uses-optimized-images', @@ -83,13 +84,12 @@ EnumAudits.prototype.performanceNamesToReturn = function () { usesTextCompression: 'uses-text-compression', usesHttp2: 'uses-http2', efficientAnimatedContent: 'efficient-animated-content', + duplicatedJavascript: 'duplicated-javascript', legacyJavascript: 'legacy-javascript', totalByteWeight: 'total-byte-weight', noDocumentWrite: 'no-document-write', layoutShiftElements: 'layout-shift-elements', - usesPassiveEventListeners: 'uses-passive-event-listeners', - unminifiedJavascript: 'unminified-javascript', - duplicatedJavascript: 'duplicated-javascript' + usesPassiveEventListeners: 'uses-passive-event-listeners' } } diff --git a/EcoSonar-API/utils/playSelectors.js b/EcoSonar-API/utils/playSelectors.js index ff3e856..768fb39 100644 --- a/EcoSonar-API/utils/playSelectors.js +++ b/EcoSonar-API/utils/playSelectors.js @@ -30,6 +30,12 @@ async function waitForSelectors (selectors, frame, options) { async function waitForSelector (selector, frame, options) { let element = null + const firstSelector = selector[0] + if (selector.length === 1 && firstSelector.lastIndexOf('*') === firstSelector.length - 1 && firstSelector.indexOf('#') === 0) { + const idStartsWith = firstSelector.substring(1, firstSelector.length - 2) + return await frame.waitForSelector(`[id^="${idStartsWith}"]`) + } + for (let i = 0; i < selector.length; i++) { const part = selector[i] if (part.startsWith('aria')) { diff --git a/EcoSonar-API/utils/quick_wins_configuration.json b/EcoSonar-API/utils/quick_wins_configuration.json index c306089..71cfb7b 100644 --- a/EcoSonar-API/utils/quick_wins_configuration.json +++ b/EcoSonar-API/utils/quick_wins_configuration.json @@ -29,7 +29,9 @@ "bootupTime":{"difficulty": 7}, "fontDisplay":{"difficulty": 2}, "thirdPartySummary":{"difficulty": 7}, + "thirdPartyFacades":{"difficulty": 6}, "lcpLazyLoaded":{"difficulty": 4}, + "nonCompositedAnimations":{"difficulty": 6}, "domSize":{"difficulty": 8}, "usesLongCacheTtl":{"difficulty": 8}, "usesResponsiveImages":{"difficulty": 2}, @@ -48,5 +50,6 @@ "totalByteWeight":{"difficulty": 8}, "noDocumentWrite":{"difficulty": 3}, "redirects":{"difficulty": 6}, + "layoutShiftElements":{"difficulty": 6}, "usesPassiveEventListeners":{"difficulty": 4} } diff --git a/EcoSonar-SonarQube/README.md b/EcoSonar-SonarQube/README.md index 5f7d26e..dfe60b8 100644 --- a/EcoSonar-SonarQube/README.md +++ b/EcoSonar-SonarQube/README.md @@ -1,5 +1,16 @@ # Plugin SonarQube EcoSonar +## Summary + +- [Introduction](#introduction) +- [Getting Started](#getting-started) + - [Prerequisites](#prerequisites) + - [Build the EcoSonar SonarQube Plugin](#build) + - [Install Sonarqube Plugins (EcoSonar + Ecocode) manually](#install) + + + + ## Introduction This plugin aims to embed EcoSonar Audits, Recommendations as well as Configuration. @@ -9,8 +20,12 @@ It fulfills three purposes : - static code analysis with green coding rules implemented by EcoCode project - add EcoSonar audit reports directly into Sonarqube projet User Interface + + ## Getting Started + + ### Prerequisites - Sonarqube- minimum version 9.4 @@ -18,9 +33,11 @@ It fulfills three purposes : https://docs.sonarqube.org/latest/setup/install-cluster/ No constraint on the edition type. Please check with your infrastructure team which edition are you allowed to use. - Java : version 17 if Sonarqube version is 9.9 or above, otherwise version 11 -- Maven - 3.8.3 +- Maven minimum version 3.8.3 -### Build the SonarQube Plugin related to EcoSonar + + +### Build the EcoSonar SonarQube Plugin To build the plugin JAR file, first you need to retrieve the URL of the deployed server for EcoSonar API. Then run the following commands: @@ -41,6 +58,8 @@ mvn clean package -Durl=#EcoSonar-API-URL If you are running EcoSonar locally, EcoSonar-API-URL should be by default `http://localhost:3000`. + + ### Install Sonarqube Plugins (EcoSonar + Ecocode) manually 1. Copy the file located at the following path `EcoSonar-SonarQube/target/ecosonar-X-SNAPSHOT.jar`. diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/AnalysisPerUrlPanel.js b/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/AnalysisPerUrlPanel.js index 7fe3e5f..f5d70a8 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/AnalysisPerUrlPanel.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/AnalysisPerUrlPanel.js @@ -5,6 +5,9 @@ import GraphPanelForUrl from './GraphPanel/GraphPanelForUrl' import GreenItPanelPerUrl from './GreenItPanel/GreenItPanelPerUrl' import LightHousePanelPerUrl from './LighthousePanel/LighthousePanelPerUrl' import W3cPanelPerUrl from './W3cPanel/W3cPanelPerUrl' +import formatError from '../../format/formatError' +import errors from '../../utils/errors.json' + export default class AnalysisPerUrlPanel extends React.PureComponent { constructor (props) { super(props) @@ -63,7 +66,7 @@ export default class AnalysisPerUrlPanel extends React.PureComponent { }) getAnalysisUrlConfiguration(this.state.projectName, this.state.selectedUrl) .then((res) => { - if (res !== undefined) { + if (res !== undefined && res.lastAnalysis.greenit !== null && res.lastAnalysis.lighthouse !== null && res.lastAnalysis.w3c !== null && res.deployments.greenit.length !== 0 && res.deployments.lighthouse.length !== 0 && res.deployments.lighthouse.w3c !== 0) { this.setState({ greenItLastAnalysis: res.lastAnalysis.greenit, lighthouseLastAnalysis: res.lastAnalysis.lighthouse, @@ -84,12 +87,12 @@ export default class AnalysisPerUrlPanel extends React.PureComponent { speedIndexUrl: res.deployments.lighthouse.map((analysis) => [analysis.dateAnalysis, analysis.speedIndex]), totalBlockingTimeUrl: res.deployments.lighthouse.map((analysis) => [analysis.dateAnalysis, analysis.totalBlockingTime]) }) + } else { + this.setState({ error: formatError(errors.noAnalysisFoundForURL, this.state.projectName, this.state.selectedUrl), loading: false }) } }) .catch((result) => { - if (result instanceof Error) { - this.setState({ error: result.message, loading: false }) - } + this.setState({ error: result.message, loading: false }) }) } diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/EcoSonarAnalysisPage.js b/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/EcoSonarAnalysisPage.js index 1b5d57c..cf164f4 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/EcoSonarAnalysisPage.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_analysis_page/components/EcoSonarAnalysisPage.js @@ -69,7 +69,7 @@ export default class EcoSonarAnalysisPage extends React.PureComponent { initEcoSonarAnalysisPage (projectName) { getAnalysisForProjectConfiguration(projectName) .then((analysis) => { - if (analysis.deployments !== undefined) { + if (analysis !== undefined && analysis.lastAnalysis.greenit !== null && analysis.lastAnalysis.lighthouse !== null && analysis.lastAnalysis.w3c !== null && analysis.deployments.greenit.length !== 0 && analysis.deployments.lighthouse.length !== 0 && analysis.deployments.lighthouse.w3c !== 0) { const dateGreenitLastAnalysis = analysis.lastAnalysis.greenit !== null && analysis.lastAnalysis.greenit.dateAnalysis ? `${new Date(analysis.lastAnalysis.greenit.dateAnalysis).toDateString()} - ${new Date(analysis.lastAnalysis.greenit.dateAnalysis).toLocaleTimeString([], { hour12: false })} ` : null @@ -157,9 +157,7 @@ export default class EcoSonarAnalysisPage extends React.PureComponent { } }) .catch((result) => { - if (result instanceof Error) { - this.setState({ error: result.message, loading: false }) - } + this.setState({ error: result.message, loading: false }) }) getUrlsConfiguration(this.props.project.key) .then((urlList) => { diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Accordion.js b/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Accordion.js index b777bfa..225be4f 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Accordion.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Accordion.js @@ -1,7 +1,7 @@ import React from 'react' -import greenItData from '../Data/greenItData.json' -import lighthouseAccessibilityData from '../Data/lighthouseAccessibilityData.json' -import lighthousePerformanceData from '../Data/lighthousePerformanceData.json' +import greenItData from '../../../utils/bestPractices/greenItData.json' +import lighthouseAccessibilityData from '../../../utils/bestPractices/lighthouseAccessibilityData.json' +import lighthousePerformanceData from '../../../utils/bestPractices/lighthousePerformanceData.json' import AccordionItem from './AccordionItem' import formatW3cBestPractices from '../../../format/formatW3cBestPractices' import Procedure from './Procedure' diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Procedure.js b/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Procedure.js index 673d5d1..a7ab2bd 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Procedure.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/Accordion/Procedure.js @@ -6,12 +6,12 @@ export default function Procedure (props) { const [procedureName, setProcedureName] = useState('') useEffect(() => { - if (procedure === 'scoreImpact') { - setProcedureName('Score Impact') + if (procedure === 'quickWins') { + setProcedureName('Quick Wins') } else if (procedure === 'highestImpact') { setProcedureName('Highest Impact') } else { - setProcedureName('Quick Wins') + setProcedureName('Score Impact') } }) return ( diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/BestPracticesPage.js b/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/BestPracticesPage.js index 012d07d..90691d3 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/BestPracticesPage.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_bestpractices_page/components/BestPracticesPage.js @@ -5,6 +5,8 @@ import { getUrlsConfiguration } from './../../services/configUrlService' import ProcedureChoice from './Procedure/ProcedureChoice' import AccessibilityAlert from '../../utils/AccessibilityAlert' import BestPracticesBody from './BestPracticesBody' +import formatError from '../../format/formatError' +import errors from '../../utils/errors.json' export default function BestPracticesPage (props) { const [loading, setLoading] = useState(true) @@ -27,7 +29,11 @@ export default function BestPracticesPage (props) { setLoading(true) getProcedure(props.project.key) .then((procedure) => { - setSavedProcedure(procedure.procedure) + if (procedure.procedure === '') { + setSavedProcedure('scoreImpact') + } else { + setSavedProcedure(procedure.procedure) + } setEditProcedureMode(false) getUrlsConfiguration(props.project.key) .then((data) => { @@ -42,7 +48,11 @@ export default function BestPracticesPage (props) { }) getBestPractices(props.project.key) .then((data) => { - setResultData(data) + if (Object.keys(data).length === 0) { + setError(formatError(errors.noAnalysisLaunched, props.project.key)) + } else { + setResultData(data) + } setLoading(false) }) .catch((result) => { @@ -69,7 +79,11 @@ export default function BestPracticesPage (props) { if (event.target.value === 'All') { getBestPractices(props.project.key) .then((data) => { - setResultData(data) + if (Object.keys(data).length === 0) { + setError(formatError(errors.noAnalysisLaunched, props.project.key)) + } else { + setResultData(data) + } }) .catch((result) => { if (result instanceof Error) { @@ -82,7 +96,11 @@ export default function BestPracticesPage (props) { } else { getBestPracticesForUrl(props.project.key, event.target.value) .then((data) => { - setResultData(data) + if (Object.keys(data).length === 0) { + setError(formatError(errors.noAnalysisFoundForURL, props.project.key, event.target.value)) + } else { + setResultData(data) + } }) .catch((result) => { if (result instanceof Error) { @@ -127,7 +145,11 @@ export default function BestPracticesPage (props) { }) getBestPractices(props.project.key) .then((data) => { - setResultData(data) + if (Object.keys(data).length === 0) { + setError(formatError(errors.noAnalysisLaunched, props.project.key)) + } else { + setResultData(data) + } }) .catch((result) => { if (result instanceof Error) { @@ -144,6 +166,7 @@ export default function BestPracticesPage (props) { setLoading(false) }) } + function setResultData (data) { setBestPracticesEcodesign(data.ecodesign) diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/ConfigurationPage.js b/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/ConfigurationPage.js index d0a9fd4..c01b8d3 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/ConfigurationPage.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/ConfigurationPage.js @@ -4,6 +4,8 @@ import AddUrlForm from './AddUrlForm' import CrawlerPage from './Crawler/CrawlerPage' import DeleteUrlForm from './DeleteUrlForm' import UrlList from './UrlList' +import errors from '../../utils/errors.json' +import formatError from '../../format/formatError' export default class ConfigurationPage extends React.PureComponent { constructor () { @@ -26,7 +28,14 @@ export default class ConfigurationPage extends React.PureComponent { }) getUrlsConfiguration(this.props.project.key) .then((urls) => { - this.setState({ urls, loading: false }) + if (urls.length > 0) { + this.setState({ urls, loading: false }) + } else { + this.setState({ + loading: false, + error: formatError(errors.noUrlAssigned, this.props.project.key) + }) + } }) .catch((result) => { if (result instanceof Error) { diff --git a/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/Crawler/CrawlerPage.js b/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/Crawler/CrawlerPage.js index 80b8b97..8a713ff 100644 --- a/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/Crawler/CrawlerPage.js +++ b/EcoSonar-SonarQube/src/main/js/ecosonar_configuration_page/components/Crawler/CrawlerPage.js @@ -2,6 +2,8 @@ import React from 'react' import { insertUrlsConfiguration } from '../../../services/configUrlService' import CrawledUrlItem from './CrawledUrlItem' import { crawl, getCrawl } from '../../../services/crawlerService' +import errors from '../../../utils/errors.json' +import formatError from '../../../format/formatError' export default function CrawlerPage (props) { const { @@ -89,7 +91,11 @@ export default function CrawlerPage (props) { setCrawlerErrorMessage('') await getCrawl(projectName).then((response) => { setCrawlerLoading(false) - setCrawledUrls(response) + if (response.length > 0) { + setCrawledUrls(response) + } else { + setCrawlerErrorMessage(formatError(errors.errorCrawlingEmpty, projectName)) + } setCrawlerLaunched(false) }).catch((error) => { setCrawlerLoading(false) diff --git a/EcoSonar-SonarQube/src/main/js/services/bestpracticesService.js b/EcoSonar-SonarQube/src/main/js/services/bestpracticesService.js index c1b0189..7fb06fb 100644 --- a/EcoSonar-SonarQube/src/main/js/services/bestpracticesService.js +++ b/EcoSonar-SonarQube/src/main/js/services/bestpracticesService.js @@ -10,13 +10,8 @@ export function getBestPractices (projectName) { resolve(response.data) }) .catch((error) => { - if (error.response && error.response.status === 400) { - reject(new Error(formatError(errors.noAnalysisLaunched, projectName))) - } else { - console.error(error) - console.error('BEST PRACTICES SERVICE - GET : unknown error occured : ', error.message) - reject(new Error(formatError(errors.errorRetrievingBestPractices, projectName))) - } + console.error('BEST PRACTICES SERVICE - GET : unknown error occured : ', error.message) + reject(new Error(formatError(errors.errorRetrievingBestPractices, projectName))) }) }) } @@ -32,13 +27,8 @@ export function getBestPracticesForUrl (projectName, urlName) { resolve(response.data) }) .catch((error) => { - if (error.response && error.response.status === 400) { - reject(new Error(formatError(errors.noAnalysisFoundForURL, projectName, urlName))) - } else { - console.error(error) - console.error('BEST PRACTICES SERVICE - GET : unknown error occured : ', error.message) - reject(new Error(formatError(errors.errorRetrievingBestPractices, projectName))) - } + console.error('BEST PRACTICES SERVICE - GET : unknown error occured : ', error.message) + reject(new Error(formatError(errors.errorRetrievingBestPractices, projectName))) }) }) } diff --git a/EcoSonar-SonarQube/src/main/js/services/configUrlService.js b/EcoSonar-SonarQube/src/main/js/services/configUrlService.js index be4e87e..ead316d 100644 --- a/EcoSonar-SonarQube/src/main/js/services/configUrlService.js +++ b/EcoSonar-SonarQube/src/main/js/services/configUrlService.js @@ -30,14 +30,9 @@ export function getUrlsConfiguration (projectName) { console.log('CONFIG URL SERVICE - GET : ' + response.data.length + ' urls retrieved') resolve(response.data) }) - .catch((error) => { - if (error.response && error.response.status === 400) { - console.error('CONFIG URL SERVICE - GET : {} has no url registered', projectName) - reject(new Error(errors.noUrlAssigned)) - } else { - console.error('CONFIG URL SERVICE - GET : An error occured while retrieving URLs for project ' + projectName) - reject(new Error(formatError(errors.errorRetrievingURL, projectName))) - } + .catch(() => { + console.error('CONFIG URL SERVICE - GET : An error occured while retrieving URLs for project ' + projectName) + reject(new Error(formatError(errors.errorRetrievingURL, projectName))) }) }) } diff --git a/EcoSonar-SonarQube/src/main/js/services/crawlerService.js b/EcoSonar-SonarQube/src/main/js/services/crawlerService.js index 8774f34..e2747e7 100644 --- a/EcoSonar-SonarQube/src/main/js/services/crawlerService.js +++ b/EcoSonar-SonarQube/src/main/js/services/crawlerService.js @@ -25,13 +25,9 @@ export function getCrawl (projectNameReq) { resolve(response.data) }) .catch((error) => { - if (error.response && error.response.status === 400) { - reject(new Error(formatError(errors.errorCrawlingEmpty, projectNameReq))) - } else { - console.error(error) - console.error('CRAWLER SERVICE - unknown error occured : ', error.message) - reject(new Error(formatError(errors.errorGetCrawling, projectNameReq))) - } + console.error(error) + console.error('CRAWLER SERVICE - unknown error occured : ', error.message) + reject(new Error(formatError(errors.errorGetCrawling, projectNameReq))) }) }) } diff --git a/EcoSonar-SonarQube/src/main/js/services/ecoSonarService.js b/EcoSonar-SonarQube/src/main/js/services/ecoSonarService.js index 72023dc..94d396d 100644 --- a/EcoSonar-SonarQube/src/main/js/services/ecoSonarService.js +++ b/EcoSonar-SonarQube/src/main/js/services/ecoSonarService.js @@ -11,14 +11,9 @@ export function getAnalysisUrlConfiguration (projectName, urlName) { console.log('ECOSONAR SERVICE - POST : analysis retrieved') resolve(response.data) }) - .catch((error) => { - if (error.response && error.response.status === 400) { - console.warn('ECOSONAR SERVICE - POST : {} has no analysis registered', urlName) - reject(new Error(formatError(errors.noAnalysisFoundForURL, projectName, urlName))) - } else { - console.error('ECOSONAR SERVICE - POST : unknown error occured') - reject(new Error(formatError(errors.errorRetrievingAnalysisforURL, projectName, urlName))) - } + .catch(() => { + console.error('ECOSONAR SERVICE - POST : unknown error occured') + reject(new Error(formatError(errors.errorRetrievingAnalysisforURL, projectName, urlName))) }) }) } @@ -30,14 +25,9 @@ export function getAnalysisForProjectConfiguration (projectName) { console.log('GREENIT SERVICE - GET : analysis retrieved') resolve(response.data) }) - .catch((error) => { - if (error.response && error.response.status === 400) { - console.warn('ECOSONAR SERVICE - GET : {} has no analysis registered', projectName) - resolve({}) - } else { - console.error('ECOSONAR SERVICE - GET : unknown error occured') - reject(new Error(formatError(errors.errorRetrievingAnalysis, projectName))) - } + .catch(() => { + console.error('ECOSONAR SERVICE - GET : unknown error occured') + reject(new Error(formatError(errors.errorRetrievingAnalysis, projectName))) }) }) } diff --git a/EcoSonar-SonarQube/src/main/js/utils/bestPractices/greenItData.json b/EcoSonar-SonarQube/src/main/js/utils/bestPractices/greenItData.json new file mode 100644 index 0000000..0ce65d0 --- /dev/null +++ b/EcoSonar-SonarQube/src/main/js/utils/bestPractices/greenItData.json @@ -0,0 +1,146 @@ +{ + "addExpiresOrCacheControlHeaders": { + "title": "Add Expires or Cache-Control HTTP Headers", + "description": "You should reach 100% of resources cached.", + "correction": "
The Expires and Cache-Control headers determine how long a browser should keep a resource in its cache. You should therefore use them, and configure them correctly for CSS style sheets, JavaScript scripts and images.

Ideally, these elements should be kept as long as possible so that the browser does not request them again from the server. This saves HTTP requests, bandwidth and CPU power server-side.

1. Reduced Server Load: When Expires or Cache-Control headers are set, web browsers and intermediate caches store a copy of the website's resources locally. This means that subsequent visits or requests for the same resources can be fulfilled from the cache instead of hitting the web server every time. As a result, the server experiences reduced load and consumes less energy, contributing to overall resource efficiency.

2.Faster Page Load Times: Cached resources are served faster because they don't need to be fetched from the server each time. This leads to quicker page load times, which enhances user experience and encourages users to spend more time on the website. Faster load times also save energy for users who access the website from battery-powered devices like laptops and smartphones.

3.Lower Bandwidth Usage: By caching resources on the client side, there is a reduced need for data transfer between the server and the client. This leads to lower bandwidth consumption, which is particularly important for users with limited data plans or in regions with less robust internet infrastructure.

4.Efficient Use of Data Centers: Data centers, which host websites and web applications, consume significant amounts of energy. By reducing the number of requests to the data center through caching, there is a decrease in energy consumption and carbon emissions associated with data center operations.

5.Sustainable Browsing: Cached resources allow users to browse the web more sustainably. When users access a website with appropriate cache control headers, their devices download fewer resources, leading to reduced energy usage for their devices and a lower environmental impact associated with their online activities.

Here is a configuration example for Expires and Cache-Control headers for the Apache web server:

<IfModule mod_headers.c>
    <FilesMatch "\.(ico|jpe?g|png|gif|swf|css|gz)$">
        Header set Cache-Control "max-age=2592000, public"
    </FilesMatch>
    <FilesMatch  "\.(html|htm)$">
       Header set Cache-Control "max-age=7200, public"
    </FilesMatch>
 
</IfModule>


For example, if you use an Apache server, you can use the mod_expires module or the Header directive in your .htaccess. If you use WordPress, you can install a plugin like WP Rocket that automatically adds these headers for you. If you're using custom code to serve your website, you can add Expires or Cache-Control headers directly in your server-side code.

Government Regulation:
RGESN 6.3 : Does the digital service use caching mechanisms for all transferable content that it has control over?
Best practices n°75 from 115 bonnes pratiques d'écoconception web v4

See :
Cache Header
Cache-Control Headers
Expires Headers
", + "titleData": "{0}% of resources cached" + }, + "compressHttp": { + "title": "Compress ressources", + "description": "To get an A score, reach 100 % of compression ratio.", + "correction": "
You can compress the content of HTML pages to minimize bandwidth consumption between the client and the server.

1.Reduced Data Transfer: Compressed resources are smaller in size, resulting in reduced data transfer between web servers and clients (such as web browsers). This reduction in data transfer translates to lower bandwidth consumption, which is crucial in regions with limited internet infrastructure and for users on mobile devices with data limitations. Ultimately, less data transfer means lower energy consumption and a smaller carbon footprint associated with internet usage.

2.Faster Page Load Times: Smaller resource sizes lead to faster download times for website visitors. Quicker loading times enhance user experience, increase user satisfaction, and encourage users to spend more time on the website. Faster page loads also save energy for users accessing the website from battery-powered devices, as their devices can enter low-power states sooner.

3.Optimized Server Performance: Compressed resources reduce the load on web servers. Smaller file sizes mean servers can deliver content more efficiently to multiple users simultaneously. This optimization can lead to a reduced need for server infrastructure and lower energy consumption associated with server operations.

4.Efficient Data Center Operations: Data centers, which host websites and web applications, consume substantial amounts of energy. By compressing resources, the volume of data transmitted to and from data centers is reduced, contributing to more efficient data center operations and a smaller environmental impact.

All modern browsers (for smartphones, tablets, notebook and desktop computers) accept HTML compressed via gzip or Deflate. The easiest way to do so is to configure the web server so that it compresses the HTML data stream, either on-the-fly or automatically, as it leaves the server. This practice (on-the-fly compression) is only beneficial for a HTML data stream as it is constantly evolving. When possible, we recommend that you manually compress static resources (e.g. CSS and JavaScript libraries) all in one go.

With Apache, the Deflate and gzip compression methods offer considerable savings. A typical 26 KB HTML file is reduced to 6 KB after being compressed with gzip.

If your frontend framework is one of the following: React / Angular / Vue.js

If your front-end framework is React

Government Regulation;
RGESN 6.4 : Has the digital service implemented compression techniques for all transferable resources that it has control over?
Best practices n°76 from 115 bonnes pratiques d'écoconception web v4

See :
Http Compress
How to compress HTML code ?
", + "titleData": "{0}% of resources compressed" + }, + "domainsNumber": { + "title": "Limit the number of domains", + "description": "You should limit the number of domains to 3 per page.", + "correction": "
When a website or online service hosts a web page’s components across several domains, the browser must establish an HTTP connection with every single one. Once the HTML page has been retrieved, the browser calls the sources as it traverses the DOM (Document Object Model).

Some resources are essential for the page to work. If they are hosted on another domain which is slow, it may increase the page’s render time. You should therefore, when possible, group all resources on a single domain.

The only exception to this is for static resources (style sheets, images, etc.), which should be hosted on a separate domain to avoid sending one or multiple cookies for each browser GET HTTP request. This reduces response time and unnecessary bandwidth consumption.

For a corporate website with heavy traffic, it is better to have two domains: - the application server at www.domain.tld - the cookieless media server at media.domain.tld By doing so, you minimize the number of domains while also avoiding unnecessarily sending a cookie for each GET HTTP request for a static resource.

Government Regulation;
RGESN 6.10 : Does the digital service restrict the usage of user terminal sensors to only when needed by the service rather than continuously?

Best practices n°82 from '115 bonnes pratiques d'écoconception web v4'

See :
What is a domain number and how does it works
Minimize the number of domains
", + "titleData": "{0} domain(s) found per page in average" + }, + "dontResizeImageInBrowser": { + "title": "Don't resize image in browser", + "description": "There should be no image resized in browser in your web application. You are resizing an image if you are using the attributes HEIGHT and WIDTH in the HTML tag of the image.", + "correction": "
Do not resize images using HTML height and width attributes. Doing so sends images in their original size, wasting bandwidth and CPU power. A PNG-24 350 x 300 px image is 41 KB. If you resized the same image file using HTML and displayed it as a 70 x 60 px thumbnail, it would still be 41 KB, when it should be no more than 3 KB! Meaning 38 KB downloaded for nothing. The best solution is to resize images using software such as Photoshop, without using HTML. When content added by the website’s users has no specific added value, it is best to prevent them from being able to insert images using a WYSIWYG editor e.g., CKEditor.

Non Compliant :

<img src={LoadingIconPath} alt=”loading icon” width = 12px\" height = \"12px\" \/>
Compliant :

<img src={LoadingIconPath} alt=”loading icon” />


Government Regulation;
RGESN 5.2 Does the digital service offer image content whose level of compression is appropriate for the content and viewing context?

See :
How to resize image outside the browser
", + "titleData": "{0} image(s) resized in browser found in the whole project" + }, + "emptySrcTag": { + "title": "Avoid empty src tag", + "description": "You should have no empty src tags.", + "correction": "
If there is an image tag with an empty src attribute, the browser will call the directory in which the page is located, generating unnecessary, additional HTTP requests.

The following image tag will request the foo directory’s index file from the server:

<img src="" alt="">

for a page located at: http://domain.tld/foo/bar.html

See :
Delete image tags with empty src attributes
", + "titleData": "{0} empty src tags found in the whole project" + }, + "externalizeCss": { + "title": "Externalize css", + "description": "You should reach 0 inline stylesheets.", + "correction": "
Ensure that CSS files and JavaScript code are separate from the page’s HTML code, except for any configuration variables for JavaScript objects.

If you include CSS or JavaScript code in the body of the HTML file, and it is used for several pages (or even the whole website), then the code must be sent for each page requested by the user, therefore increasing the volume of data sent.

However, if the CSS and JavaScript code are in their own separate files, the browser can avoid requesting them again by storing them in its local cache.

1.Modularity and Reusability: External CSS allows developers to reuse styles across multiple pages or sections of a website. When styles are centralized in external files, changes and updates can be applied universally, reducing the need for duplicate code. This modularity promotes efficient code organization and reduces the overall size of the HTML documents, resulting in more sustainable and maintainable codebases.

2.Reduced Page Size: Externalizing CSS reduces the size of individual HTML pages. When CSS is embedded within the HTML document, it increases the file size, leading to more data transfer between the server and the browser. Smaller page sizes result in reduced bandwidth consumption, faster page load times, and a smaller carbon footprint associated with data transmission.

3.Browser Caching Efficiency: External CSS files are more likely to be cached by web browsers and intermediate caches (like proxy servers). Cached CSS files can be reused across multiple pages, reducing the need for redundant resource downloads and contributing to faster page loads and reduced server load.

4.Improved Maintainability: Separating CSS into external files makes it easier to manage and maintain the website's styles. Developers can work on the CSS files independently of the HTML content, promoting more efficient workflows and ensuring that style updates can be applied consistently across the entire website. Optimized Server Performance: External CSS reduces the size of HTML documents, leading to less data to transfer from the server to the client. This optimization results in improved server performance, reduced server load, and energy savings associated with data transmission.

5.Mobile Data Efficiency: Smaller HTML page sizes resulting from externalized CSS consume less data, which is particularly beneficial for users accessing websites on mobile devices with limited data plans. Reducing data usage on mobile devices contributes to a more eco-friendly browsing experience.
Non compliant :
<style type=\"text/css\" media=\"screen\">
p { color: #333, margin: 2px 0 }
/* All the website's CSS declarations */
</style>
Compliant :
<link href=\"css/styles.css\" rel=\"stylesheet\">



Best practices n°42 from '115 bonnes pratiques d'écoconception web v4'

See :
Externalize CSS files
How to create a css external stylesheet", + "titleData": "{0} inline stylesheet(s) found in the whole project" + }, + "externalizeJs": { + "title": "Externalize js", + "description": "You should have no inline JavaScript script in HTML code.", + "correction": "
Ensure that JavaScript code is separate from the page’s HTML code, except for any configuration variables for JavaScript objects. If you include JavaScript code in the body of the HTML file, and it is used for several pages (or even the whole website), then the code must be sent for each page requested by the user, therefore increasing the volume of data sent. However, if the JavaScript code is in his own separate file, the browser can avoid requesting them again by storing them in its local cache.
Non Compliant :
File 1

Avoid using script directly into HTML :
  • <script type=\"\"text\/javascript\"\">
    alert(\"\"Hello Jean ! \"\")
    <\/script>
  • <button onclick=alert('Hello Jeanne')>
    Say Hello Jeanne
    </button>

Compliant :
Instead use a JavaScript file where the function is defined :
  • script:
    function sayHello(name) {
    alert(\"\"Hello\"\" + name +\"\" ! \"\")
    }
  • <script type=\"\"text\/javascript\"\">
    sayHello(Jean)
    <\/script>



Best practices n°42 from '115 bonnes pratiques d'écoconception web v4'

See :
Externalize JS Files
Externalize JavaScript Files", + "titleData": "{0} inline javascripts found in the whole project" + }, + "httpError": { + "title": "Avoid HTTP request errors", + "description": "You should not have HTTP errors when loading your pages.", + "correction": "
Requests with HTTP errors consume resources unnecessarily.

1.User Experience (UX): HTTP errors, such as the commonly encountered 404 Not Found or 500 Internal Server Error, disrupt the user experience. When users encounter these errors, it can lead to frustration, confusion, and a negative perception of the website or service. By avoiding HTTP errors, you contribute to a smoother and more pleasant user experience, enhancing user satisfaction and retention.

2.Efficiency and Resource Conservation: When a web server returns an HTTP error, it consumes resources and bandwidth. Frequent errors can lead to unnecessary strain on the server infrastructure, resulting in higher energy consumption and potentially increased carbon footprint. By minimizing HTTP errors, you optimize server performance and contribute to resource conservation.

3.Reduced Data Transfer: HTTP errors generate additional data traffic as the server responds with error messages. Reducing the occurrence of errors helps decrease data transfer, which is particularly relevant for users with limited data plans or in regions with less robust internet infrastructure.

4.SEO and Organic Traffic: Frequent HTTP errors can negatively impact a website's search engine rankings and organic traffic. Search engines may penalize sites that consistently return errors, leading to lower visibility and reduced traffic. By avoiding errors, you improve your website's chances of ranking higher in search results, potentially attracting more visitors and minimizing the need for additional advertising efforts.

Best practices n°89 from '115 bonnes pratiques d'écoconception web v4'

See :
How to troubleshoot common http error code
", + "titleData": "{0} HTTP error(s) in the whole project" + }, + "httpRequests": { + "title": "Limit the number of HTTP requests", + "description": "A page’s download time client-side directly correlates to the number and size of files the browser must download. You should not have more than 25 requests to load one page of your application.", + "correction": "
For each file, the browser sends a GET HTTP to the server. It waits for the response, and then downloads the resource as soon as it is available. Depending on the type of web server you use, the more requests per page there are, the fewer pages the server can handle. Reducing the number of requests per page is key to reducing the number of HTTP servers needed to run the website, and consequently its environmental impact.

There are several ways to reduce the number of requests per page:
  • - Combine static files e.g., CSS and JavaScript libraries
  • - Use a CSS sprite to group the interface’s images
  • - Favor glyphs over images and, in general, vectors over bitmaps.
  • - Fill in the browser cache as much as possible.


Potential saving: reduced server load, thus minimizing the economic and environmental footprint by reducing the amount of equipment needed (from HTTP servers to application servers and RDBMS).

Best practices n°47 from '115 bonnes pratiques d'écoconception web v4'

Government Regulation:
RGESN 6.2 : Does the digital service have a limit of requests per screen?
Best practices n°47 from 115 bonnes pratiques d'écoconception web v4


See :
Limit HTTP Requests
", + "titleData": "{0} HTTP request(s) on average" + }, + "imageDownloadedNotDisplayed": { + "title": "Do not download unecessary image", + "description": "You should not request images from the server if they are not going to be displayed in your web application.", + "correction": "
Downloading images that will not necessarily be visible consumes resources unnecessarily. For example, images that are displayed only after a user action.

Government Regulation:
RGESN 5.2 Does the digital service offer image content whose level of compression is appropriate for the content and viewing context?
", + "titleData": "{0} image(s) downloaded but not displayed in the whole project" + }, + "jsValidate": { + "title": "Validate js", + "description": "You shouldn’t have JavaScript errors when launching your web application.", + "correction": "
JSLint is a JavaScript code quality tool that checks that the JavaScript syntax used will be understood by all browsers. The code produced thus complies with coding rules which enables interpreters to quickly and easily run the code. The CPU is therefore used for a shorter time.

  • Install eslint to analyse your code

  • npm install eslint --save-dev or yarn add -D eslint

  • Once installed, you can launch eslint project configuration
    npx eslint --init

  • The command prompt will guide you through the linter configuration adapted to your projet. The file name .eslintrc defines the linter configuration and can be modified according to your requirement.

  • To launch the linter analysis :
    eslint --ext .js .

  • To let the linter fix issues automatically :
    eslint --fix --ext .js .


Best practices n°43 from '115 bonnes pratiques d'écoconception web v4'

See :
Check JavaScript code
", + "titleData": "{0} JavaScript error(s) found in the whole project" + }, + "maxCookiesLength": { + "title": "Max cookies length", + "description": "Maximum size of your cookies should be the smallest possible as it is sent with each request. Your cookies should not be longer than 512 bytes.", + "correction": "
A cookie makes it possible to maintain a state between the internet user's browser and the remote web server thanks to identifiers. This text file is transferred in each http request. It is therefore necessary to optimize its size as much as possible and delete it as soon as its presence is no longer mandatory.

You can automatically delete a cookie when it is no longer useful, by specifying an expiry date, as follows:

Set-Cookie: user_myvariable=myvalue; expires=Wed, 12 Dec 2012 07:40:20 UTC

Best practices n°62 from 115 bonnes pratiques d'écoconception web v4

See :
Using HTTP cookies
", + "titleData": "Max cookies length = {0} Bytes, in the whole project" + }, + "minifiedCss": { + "title": "Minified css", + "description": "You should reach 100% of your CSS files minified.", + "correction": "
Minified CSS files are smaller in size, leading to reduced data transfer between the server and the client. Smaller file sizes mean lower bandwidth consumption, resulting in decreased carbon emissions associated with data transmission and more sustainable use of resources.

You can manually minify your CSS files by removing all comments from CSS code or removing any whitespace. Otherwise, you can use automated tools to do that for example CSS Minifier, Minify CSS or Yahoo’s YUI Compressor specialized filters to :
- remove comments and white spaces
- remove the last semi-colon
- remove extra semi-colons
- remove empty declarations
- remove units of measure when using 0 values and reduce multiple 0s into one
- remove 0 for values less than 1
- convert RGB colors into hex values and reduce 6-digit hex values to 3-digit values
- remove extra charsets
- optimize the alpha layer’s opacity values in Internet Explorer
- replace none with 0

CSS Preprocessors such Sass or Less often provide built-in ways to compile and minify CSS during the compilation process.

Government Regulation:
RGESN 6.4 : Has the digital service implemented compression techniques on all transferred resources under its control?

Best practices n°77 from 115 bonnes pratiques d'écoconception web v4

See :
CSS Minification
", + "titleData": "{0}% of minified stylesheet" + }, + "minifiedJs": { + "title": "Minified js", + "description": "You should reach 100% of your JS files minified.", + "correction": "
Minified CSS files are smaller in size, leading to reduced data transfer between the server and the client. Smaller file sizes mean lower bandwidth consumption, resulting in decreased carbon emissions associated with data transmission and more sustainable use of resources.

You can manually minify your CSS files by removing all comments from CSS code or removing any whitespace. Otherwise, you can use automated tools such JavaScript Minifier or UglifyJS or YUI Compressor to :
    - remove unnecessary white spaces
    - remove unnecessary line breaks
    - remove unnecessary semi-colons
    - shorten local variable names


This operation can be automated using Google Apache speed module
A standard 248 KB JavaScript file will be 97KB after being minified

JavaScript bundlers such as Webpack or Rollup provide built-in or plugin-based minification features.

Government Regulation:
RGESN 6.4 : Has the digital service implemented compression techniques on all transferred resources under its control?

Best practices n°77 from 115 bonnes pratiques d'écoconception web v4

See :
JavaScript minification
", + "titleData": "{0}% of minified JavaScript" + }, + "noCookieForStaticRessources": { + "title": "No cookie for static ressources", + "description": "You should have 0 static resources with cookies.", + "correction": "
Images, CSS stylesheets, and JavaScript files must be hosted on a cookie-free domain. This prevents the browser from sending a cookie for each resource ... when it is unnecessary. Indeed, although transferred in each http request, the cookie is useless for static content, since it is used to maintain a state between the Internet user's browser and the remote application server thanks to the identifiers contained in the text file..

It is therefore preferable to store this type of content on a specific domain name, for example static.domainname.com. For static resources, a cookie is unnecessary, so it unnecessarily consumes bandwidth. To avoid this, we can use a different domain for static resources or restrict the scope of cookies created.

Web Giants are using a dedicated domain to serve static ressources which does not require cookies. For example, Yahoo! uses the domain called yimg.com, Youtube ytimg.com and Amaon images-amazon.com

Government Regulation:
RGESN 6.11 : Does the digital service host the transferred static resources of which it is the issuer on the same domain?

Best practices n°81 from 115 bonnes pratiques d'écoconception web v4

See :
Serve static content from a cookieless domain
Why do you need a cookie-less domain
", + "titleData": "{0} static ressource(s) with cookie in the whole project" + }, + "noRedirect": { + "title": "Avoid redirect", + "description": "Redirections should be avoided as much as possible as they slow down response and drain resources unnecessarily.", + "correction": "
Each redirection consumes network bandwidth and server resources. By minimizing redirections, the overall resource usage can be reduced, leading to a more sustainable design that conserves resources.

To avoid redirections, you can :
- Choose the right URL structure
- Use relative URLs
- Update Internal Links
- Use canonical URLs
- Avoid Chain Redirections
- Avoid trailing slashes vs non-trailing slashes
- Update external links
- Use permanent 301 Redirects.

Best practices n°112 from '115 bonnes pratiques d'écoconception web v4'

See :
Avoid redirections
Avoid multiple page redirects
", + "titleData": "{0} redirect in the whole project" + }, + "optimizeBitmapImages": { + "title": "Optimize bitmap images", + "description": "You should optimize all your bitmap images.", + "correction": "", + "titleData": "{0} bitmap image to optimize in the whole project" + }, + "optimizeSvg": { + "title": "Optimize svg images", + "description": "All SVG images added into your web application should be optimized.", + "correction": "
SVG images are resolution-independent and can scale to any size without losing quality. By using SVG images, designers can create a single image asset that adapts to different screen sizes and resolutions. This eliminates the need for multiple image versions for various devices, reducing the number of resources needed and promoting a more efficient design. Svg images are less heavy than bitmap images, nevertheless they can be optimized and minified via tools (for example, svgo).

Government Regulation:
RGESN 5.2 Does the digital service offer image content whose level of compression is appropriate for the content and viewing context?

Best practices n°49 from 115 bonnes pratiques d'écoconception web v4

See :
Tools for optimizing SVG
", + "titleData": "{0} images to optimize in the whole project" + }, + "plugins": { + "title": "Do not use plugins", + "description": "You should use no plugin in your web application if possible.", + "correction": "
Avoid using plugins (Flash Player, Java and Silverlight virtual machines, etc.) because they can be a heavy drain on resources (CPU and RAM).

This is especially true with Adobe’s Flash Player, to such an extent that Apple decided to not install the technology on its mobile devices to maximize battery life. Favor standard technology such as HTML5 and ECMAScript.

Government Regulation;
RGESN 4.5 : Does the digital service allow users to decide on the activation of a third-party service?

See :
Limit plugins
", + "titleData": "{0} plugin found in the whole project" + }, + "printStyleSheet": { + "title": "Provide print stylesheet", + "description": "Each of your pages should have at least one print style sheet to get an A Score.", + "correction": "
In addition to the benefits for the user, this style sheet reduces the number of pages printed, and therefore indirectly minimizes the website’s ecological footprint. It should be as streamlined as possible and employ an ink-light typeface e.g., Century Gothic. Also consider hiding the header, footer, menu and sidebar, as well as deleting all images except those needed for content. This print style sheet makes for a cleaner print by trimming down what is displayed on the screen.
Compliant :
body {
background-color : #fff;
font-family : Serif;
font-size:15pt;
}
#page {
margin: 0;
border: none;
}
#banner, #menuright, #footer {
display: none;
}
h1#top {
margin: 0;
padding: 0;
text-indent: 0;
line-height: 25pt;
font-size: 25pt;
} (...)


Best practices n°31 from '115 bonnes pratiques d'écoconception web v4'

See :
Print Stylesheet
CSS Printer Friendly Pages
How to set up a print stylesheet
Print stylesheet guide
", + "titleData": "{0} print stylesheet found in the whole project" + }, + "socialNetworkButton": { + "title": "Do not use standards social button", + "description": "You should not use social media buttons.", + "correction": "
Social Network like Facebook, Twitter, Pinterest gives plugins to install on web page to get a share button and a like counter. These plugins consume unnecessary resources, it's better to put direct links.

Best practices n°59 from '115 bonnes pratiques d'écoconception web v4'
", + "titleData": "{0} standard(s) social button(s) found in the whole project" + }, + "styleSheets": { + "title": "Limit Stylesheet files", + "description": "You should have at most 2 stylesheets per page.", + "correction": "
Minimize the number of CSS files to reduce the number of HTTP requests. If several style sheets are used on all the website’s pages, concatenate them into one single file.

Some CMS and frameworks offer ways to do such optimization automatically. The HTTP server can also be configured to compress and reduce the size of style sheets.

With the Apache web server, simply add the following line in the .htaccess configuration file:
# compress css:
AddOutputFilterByType DEFLATE text/css

This instruction activates the Deflate mode which compresses all the style sheets between the server and the HTTP client.

Learn more about Deflate

Government Regulation;
RGESN 6.2 : Does the digital service adhere to a limit on the number of requests per screen?

Best practices n°35 from '115 bonnes pratiques d'écoconception web v4'
", + "titleData": "{0} stylesheet(s) found on average" + }, + "useETags": { + "title": "Use ETags", + "description": "ETags limit the number of server requests and avoid unnecessary use of bandwidth. At least 95 % of your resources should have ETags to have a B Score.", + "correction": "
An ETag is a signature attached to a server response. If the client requests a URL (HTML page, image, style sheet, etc.) whose ETag is identical to the one it already has, the web server will reply that it does not need to download the resource and that it should use the one it already possesses. Using ETags saves huge amounts of bandwidth.

Refer to the File Etag documentation for Apache:
Apache documentation on Etag

Government Regulation;
RGESN 6.3 : Does the digital service use caching mechanisms for all transferable content that it has control over?

See :
ETags
Use ETags Header
", + "titleData": "{0}% of resources with ETags " + }, + "useStandardTypefaces": { + "title": "Use Standard Typefaces", + "description": "You should reduce the size of custom fonts used.", + "correction": "
Use standard typefaces as they already exist on the user’s computer, and therefore do not need to be downloaded. This saves bandwidth and improves the website’s render time.

When possible, use typefaces such as :

  • Courrier New
  • Georgia
  • Arial
  • Comic
  • Impact
  • Tahoma
  • Trebuchet MS
  • Times New Roman
  • Verdana
  • Segoe UI


Government Regulation;
RGESN 4.10 : Does the digital service mainly use fonts from the operating system?

Best practices n°32 from '115 bonnes pratiques d'écoconception web v4'

See :
Use standard typefaces
List of typeface included with MacOS X
Revised Font Stack
", + "titleData": "{0} KB custom fonts found in the whole project" + } +} \ No newline at end of file diff --git a/EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthouseAccessibilityData.json b/EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthouseAccessibilityData.json new file mode 100644 index 0000000..e88ec49 --- /dev/null +++ b/EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthouseAccessibilityData.json @@ -0,0 +1,272 @@ +{ + "ariaAllowedAttr": { + "title": "`[aria-*]` attributes match their roles", + "description": "Lighthouse flags mismatches between ARIA roles and aria-* attributes.", + "correction": "
Each ARIA `role` supports a specific subset of `aria-*` attributes. Mismatching these invalidates the `aria-*` attributes. An ARIA role attribute can be added to an element to instruct assistive technologies to treat the element as something other than its native HTML element type. For example, an < a > element with role='button' is to be treated as a button, not a link.

Some ARIA property and state attributes are allowed only for certain ARIA roles. When an assistive technology encounters a mismatch between an element's role and its state or property attributes, it might ignore attributes or respond in an unexpected way. As a result, people who use assistive technologies might find the element difficult or impossible to use.

See :
[aria-*] attributes do not match their roles
aria-allowed-attr
", + "titleData": "{0} attribute(s) do not match their roles" + }, + "ariaCommandName": { + "title": "`button`, `link`, and `menuitem` elements have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies.", + "correction": "
When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. ARIA buttons, links, and menuitems are custom controls corresponding respectively to HTML < button >, < a >, and < menuitem > elements. An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type. When an ARIA button, link, or menuitem doesn't an accessible name, people who use assistive technologies have no way of knowing its purpose.

See :
ARIA items do not have accessible names
", + "titleData": "{0} element(s) have no accessible name" + }, + "ariaHiddenBody": { + "title": "`[aria-hidden=\"true\"]` is not present on the document ``", + "description": "Lighthouse flags pages whose element has an aria-hidden='true' attribute.", + "correction": "
Assistive technologies, like screen readers, work inconsistently when `aria-hidden='true'` is set on the document `< body >`. In some browsers, the attribute aria-hidden='true' hides an element and all its children from assistive technologies. Users can still use the keyboard to navigate to any focusable child elements in the , but their content is inaccessible to people who use assistive technologies. For example, screen readers are silent.

See :
[aria-hidden='true'] is present on the document < body >
aria-hidden-body
", + "titleData": "{0} element(s) have an hidden body" + }, + "ariaHiddenFocus": { + "title": "`[aria-hidden=\"true\"]` elements do not contain focusable descendents", + "description": "Lighthouse flags focusable elements that have parents with the aria-hidden='true' attribute.", + "correction": "
Focusable descendents within an `[aria-hidden='true']` element prevent those interactive elements from being available to users of assistive technologies like screen readers. In some browsers, the attribute aria-hidden='true' hides an element and all its children from assistive technologies. Users can still use the keyboard to navigate to any focusable child elements, but their content is inaccessible to people who use assistive technologies. For example, screen readers are silent. (An element is focusable if it can receive input focus via scripting, mouse interaction, or keyboard tabbing.)

See :
[aria-hidden='true'] elements contain focusable descendants
aria-hidden-focus
", + "titleData": "{0} element(s) contain focusable descendents" + }, + "ariaRequiredAttr": { + "title": "`[role]`s have all required `[aria-*]` attributes", + "description": "Lighthouse flags ARIA roles that don't have the required states and properties.", + "correction": "
Some ARIA roles have required attributes that describe the state of the element to screen readers.

See :
[role]s do not have all required [aria-*] attributes
aria-required-attr
", + "titleData": "{0} element(s) have no required attribute" + }, + "ariaRoles": { + "title": "`[role]` values are valid", + "description": "Lighthouse flags ARIA roles with invalid values.", + "correction":"
An ARIA role attribute can be added to an element to instruct assistive technologies to treat the element as something other than its native HTML element type. For example, an < a > element with role='button' will be treated as a button, not as a link.

When an assistive technology encounters an element whose role attribute has an invalid value, it might ignore the element or respond to it in an unexpected way. As a result, people who use assistive technologies might find the element difficult or impossible to detect or use.

See :
[role] values are not valid
aria-roles
", + "titleData": "{0} [role] value(s) are not valid" + }, + "ariaValidAttrValue": { + "title": "`[aria-*]` attributes have valid values", + "description": "Lighthouse flags ARIA attributes with invalid values.", + "correction": "
When an assistive technology encounters an element with an invalid ARIA attribute value, it might ignore the attribute or respond to it in an unexpected way.

As a result, people who use assistive technologies might find the element difficult or impossible to use.

See :
[aria-*] attributes do not have valid values
aria-valid-attr-value
", + "titleData": "{0} [aria-*] attribute(s) are not valid" + }, + "ariaValidAttr": { + "title": "`[aria-*]` attributes are valid and not misspelled", + "description": "Lighthouse flags invalid ARIA attributes.", + "correction": "
When an assistive technology encounters an element with an invalid ARIA attribute name, it might ignore the attribute or respond to it in an unexpected way. As a result, people who use assistive technologies might find the element difficult or impossible to use.

See :
[aria-*] attributes are not valid or misspelled
aria-valid-attr
", + "titleData": "{0} [aria-*] attribute(s) are not valid or misspelled" + }, + "bypass": { + "title": "The page contains a heading, skip link, or landmark region", + "description": "Lighthouse flags pages that don't provide a way to skip repetitive content.", + "correction": "
Web pages typically begin with blocks of content that repeat across multiple pages, such as banners and site navigation menus. A person who uses a mouse can visually skim past that repeated content and access a link or other control within the primary content with a single click.

Similarly, a bypass mechanism allows keyboard users to navigate directly to the page’s main content. Otherwise, reaching the primary content could require dozens of keystrokes. People with limited mobility could find this task difficult or painful, and people who use screen readers could find it tedious to listen as each repeated element is announced.

See :
The page does not contain a heading, skip link, or landmark region
bypass
", + "titleData": "At least one of the page does not contain a heading, skip link or landmark region", + "titleDataSuccess": "All pages contain a heading, skip line or landmark region" + }, + "colorContrast": { + "title": "Background and foreground colors don't have a sufficient contrast ratio.", + "description": "Lighthouse flags text whose background and foreground colors don't have a sufficiently high contrast ratio.", + "correction": "
Most people find it easier to read text when it has a sufficiently high contrast against its background. People with visual disabilities, low vision, limited color perception, or presbyopia are likely to find text unreadable when contrast is too low.

See :
Background and foreground colors do not have a sufficient contrast ratio
color-contrast
", + "titleData": "At least one page has background and foreground colors do not have a sufficient contrast ratio", + "titleDataSuccess": "Background and foreground colors have a sufficient contrast ratio" + }, + "documentTitle": { + "title": "Document has a `` element", + "description": "Lighthouse flags pages without a <title> element in the page's <head>.", + "correction": "<div class='correction-text'>Typically, the first thing a user learns about a web page is its title. The title is displayed in the browser tab and in search engine results, and it’s announced by assistive technologies as soon as a user navigates to a page. A descriptive page title helps everyone, especially users of assistive technologies, determine whether a page contains information relevant to their current needs.<br><br>See :<br><a target='_blank' href='https://web.dev/document-title/'>Document doesn't have a title element</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/document-title/'>document-title</a><br></div>", + "titleData": "{0} page(s) do not have a <title> element" + }, + "duplicateIdActive": { + "title": "`[id]` attributes on active, focusable elements are unique", + "description": "Lighthouse flags focusable elements that have duplicate ids.", + "correction": "<div class='correction-text'>When multiple active, focusable elements share the same id attribute, both scripting (such as JavaScript) and assistive technologies are likely to act only on the first and ignore the others. As a consequence, both functionality and accessibility can be degraded. (An element is focusable if it can receive input focus via scripting, mouse interaction, or keyboard tabbing. It’s active if it is not marked as disabled.)<br><br>See :<br><a target='_blank' href='https://web.dev/duplicate-id-active/'>[id] attributes on active, focusable elements are not unique</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/duplicate-id-active/'>duplicate-id-active</a><br></div>", + "titleData": "{0} [id] attribute(s) on active, focusable elements are not unique" + }, + "duplicateIdAria": { + "title": "ARIA IDs are unique", + "description": "Lighthouse flags elements that share an ID referred to by another element's aria-labelledby attribute.", + "correction": "<div class='correction-text'>Labels and ARIA relationship attributes (such as aria-controls, aria-labelledby, and aria-owns) depend on unique id values to identify specific UI components. When multiple elements in a web page share the same id value, assistive technologies are likely to recognize only the first, and ignore others.<br><br>See :<br><a target='_blank' href='https://web.dev/duplicate-id-aria'>ARIA IDs are not unique</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/duplicate-id-aria/'>duplicate-id-aria</a><br></div>", + "titleData": "{0} ARIA id(s) are not unique" + }, + "headingOrder": { + "title": "Heading elements appear in a sequentially-descending order", + "description": "Lighthouse flags pages whose headings skip one or more levels.", + "correction": "<div class='correction-text'>Properly ordered headings that do not skip levels convey the semantic structure of the page, making it easier to navigate and understand when using assistive technologies. <br><br>See :<br><a target='_blank' href='https://web.dev/heading-order/'>Heading elements are not in a sequentially-descending order</a><br></div>", + "titleData": "{0} heading element(s) are not in a sequentially-descending order" + }, + "htmlHasLang": { + "title": "`<html>` element has a `[lang]` attribute", + "description": "Lighthouse flags pages whose <html> element doesn't have a lang attribute.", + "correction": "<div class='correction-text'>When a web page’s primary language is programmatically identified, browsers and assistive technologies can render the text more accurately; screen readers can use the correct pronunciation; visual browsers can display the correct characters; media players can show captions correctly; and automated translation is enabled.<br><br>All users find it easier to understand the page’s content.<br><br>See :<br><a target='_blank' href='https://web.dev/html-has-lang/'><html> element does not have a [lang] attribute</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/html-has-lang/'>html-has-lang</a><br></div>", + "titleData": "{0} <html> element(s) does not have a [lang] attribute" + }, + "htmlLangValid": { + "title": "`<html>` element has a valid value for its `[lang]` attribute", + "description": "Lighthouse flags pages whose <html> element doesn't have a valid value for its lang attribute.", + "correction": "<div class='correction-text'>When a web page’s primary language is programmatically identified, browsers and assistive technologies can render the text more accurately; screen readers can use the correct pronunciation; visual browsers can display the correct characters; media players can show captions correctly; and automated translation is enabled.<br><br>All users find it easier to understand the page’s content.<br><br>See :<br><a target='_blank' href='https://web.dev/html-lang-valid/'><html> element does not have a valid value for its [lang] attribute</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/html-lang-valid/'>html-lang-valid</a><br></div>", + "titleData": "{0} <html> element(s) does not have a valid value for its [lang] attribute" + }, + "imageAlt": { + "title": "Image elements have `[alt]` attributes", + "description": "Lighthouse flags <img> elements that don't have alt attributes.", + "correction": "<div class='correction-text'>Because assistive technologies can’t interpret an image directly, they rely on alternative text to communicate the image's meaning to users. If an image has (non-empty) alternative text, the image is identified as meaningful, and its alternative text is presented to the user. If an image has an empty alt attribute, the image is identified as decorative and ignored. If an image has no alternative text at all, the image is presumed to be meaningful, and its filename is likely to be presented to the user.<br><br>See :<br><a target='_blank' href='https://web.dev/image-alt/'>Image elements do not have [alt] attributes</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/image-alt/'>image-alt</a><br></div>", + "titleData": "{0} image element(s) do not have [alt] attributes" + }, + "label": { + "title": "Form elements have associated labels", + "description": "Lighthouse flags form elements that don't have associated labels.", + "correction": "<div class='correction-text'>A form control is an interactive HTML element used for user input. Form controls include buttons, checkboxes, text fields, color pickers, and more.<br><br>An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by its name, not just by type (role).<br><br>When a form control doesn't have an accessible name, people who use assistive technologies have no way of knowing its specific purpose.<br><br>See :<br><a target='_blank' href='https://web.dev/label/'>Form elements do not have associated labels</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/label/'>label</a><br></div>", + "titleData": "{0} element(s) have no associated labels" + }, + "linkName": { + "title": "Links have a discernible name", + "description": "Lighthouse flags links that don't have discernible names.", + "correction": "<div class='correction-text'>An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type. When a link doesn’t have an accessible name, people who use assistive technologies have no way of knowing its purpose.<br><br>See :<br><a target='_blank' href='https://web.dev/link-name/'>Links do not have a discernible name </a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/link-name/'>link-name</a><br></div>", + "titleData": "{0} link(s) do not have a discernible name" + }, + "list": { + "title": "Lists contain only `<li>` elements and script supporting elements", + "description": "Lighthouse flags lists that contain content elements that shouldn't be in a list.", + "correction": "<div class='correction-text'>In a properly structured list, all content is contained within list items. Content includes text and other HTML elements. Certain non-content elements are also allowed.<br><br>When an assistive technology encounters a list that’s poorly structured or contains disallowed elements, it might respond in an unexpected way. As a result, people who use assistive technologies might find it difficult to interpret the list.<br><br>See :<br><a target='_blank' href='https://web.dev/list/'>Lists do not contain only < li > elements and script supporting elements (< script > and < template >)</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/list/'>list</a><br></div>", + "titleData": "{0} list(s) do not contain only <li> elements and script supporting elemnts (<script> and <template>) " + }, + "listItem": { + "title": "List items (`<li>`) are contained within `<ul>` or `<ol>` parent elements", + "description": "Lighthouse flags list items (<li>) that aren't contained in <ul> or <ol> parent elements.", + "correction": "<div class='correction-text'>In a properly structured list, all list items (< li > elements) are contained by a < ul >, < ol >, or < menu > parent element.<br><br>When an assistive technology encounters a list that’s poorly structured, it might respond in an unexpected way. As a result, people who use assistive technologies might find it difficult to interpret the list.<br><br> See :<br><a target='_blank' href='https://web.dev/listitem/'>List items (< li >) are not contained within < ul > or < ol > parent elements</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/listitem/'>listitem</a><br></div>", + "titleData": "{0} List item(s) <li> are not contained within <ul> or <ol> parent elements" + }, + "tabIndex": { + "title": "No element has a `[tabindex]` value greater than 0", + "description": "Lighthouse flags elements that have a tabindex value greater than 0.", + "correction": "<div class='correction-text'>A value greater than 0 implies an explicit navigation ordering. Although technically valid, this often creates frustrating experiences for users who rely on assistive technologies. <br><br>See :<br><a target='_blank' href='https://web.dev/tabindex/'>Some elements have a [tabindex] value greater than 0</a><br></div>", + "titleData": "{0} element(s) have a [tabindex] value greater than 0" + }, + "tdHeadersAttr": { + "title": "Td Headers Attributes", + "description": "Lighthouse flags tables that have more than one table header per column.", + "correction": "<div class='correction-text'>In a table, a header cell and a data cell are programmatically related if they are coded in a way that assistive technologies can accurately determine their relationship. When a data cell has a headers attribute that points to a cell in a different table, the programmatic relationship isn’t defined in a way that assistive technologies can recognize. As a result, assistive technology users can’t tell which header cell goes with a given data cell.<br><br>See :<br><a target='_blank' href='https://web.dev/td-headers-attr/'>Cells in a < table > element that use the [headers] attribute refer to an element ID not found within the same table</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/td-headers-attr/'>td-headers-attr</a><br></div>", + "titleData": "{0} cell(s) in a <table> element that use the [headers] attribute refer to an element id not found within the same table" + }, + "validLang": { + "title": "[lang] attributes have a valid value", + "description": "Lighthouse flags elements that have a lang attribute with an invalid value.", + "correction": "<div class='correction-text'>Sometimes a web page written in one language has a passage in a different language. When the language of such a passage is correctly identified (by a lang attribute on the containing element), browsers and assistive technologies can render the text more accurately; screen readers can use the correct pronunciation; visual browsers can display the correct characters; and media players can show captions correctly. All users find it easier to understand the content.<br><br>See :<br><a target='_blank' href='https://web.dev/valid-lang/'>[lang] attributes do not have a valid value</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/valid-lang/'>valid-lang</a><br></div>", + "titleData": "{0} element(s) do not have valid lang attribute" + }, + "ariaInputFieldName": { + "title": "ARIA input fields have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies.", + "correction": "<div class='correction-text'>When an input field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers.<br><br> See :<br><a target='_blank' href='https://web.dev/aria-name/'>ARIA items do not have accessible names</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-input-field-name/'>aria-input-field-name</a><br></div>", + "titleData": "{0} ARIA input field(s) do not have accessible names" + }, + "ariaMeterName": { + "title": "ARIA `meter` elements have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies", + "correction": "<div class='correction-text'>When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. An ARIA meter is a custom control corresponding to the HTML < meter > element. A meter represents either a scalar value within a known range, or a fractional value. For example, a meter might represent the unused portion of total storage capacity. An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type. When an ARIA meter doesn't an accessible name, people who use assistive technologies have no way of knowing its purpose.<br><br>See :<br><a target='_blank' href='https://web.dev/aria-name/'>ARIA items do not have accessible names</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-meter-name/'>aria-meter-name</a><br></div>", + "titleData": "{0} ARIA meter element(s) do not have accessible names" + }, + "ariaProgressbarName": { + "title": "ARIA `progressbar` elements have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies", + "correction": "<div class='correction-text'>When a `progressbar` element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. An ARIA progressbar is a custom control corresponding to the HTML < progress > element. A progressbar represents progress on a task that takes a long time to complete. An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type. When an ARIA progressbar doesn't an accessible name, people who use assistive technologies have no way of knowing its purpose.<br><br> See :<br><a target='_blank' href='https://web.dev/aria-name/'>ARIA items do not have accessible names</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-progressbar-name/'>aria-progress-bar-name</a><br></div>", + "titleData": "{0} ARIA progressbar element(s) do not have accessible names" + }, + "ariaRequiredChildren": { + "title": "ARIA Required children", + "description": "Lighthouse flags ARIA roles that don't have the required child roles.", + "correction": "<div class='correction-text'>An ARIA role attribute can be added to an element to instruct assistive technologies to treat the element as something other than its native HTML element type. For example, a < ul > element with role='listbox' is to be treated as a listbox control, not as a static list.<br><br>Some ARIA 'parent' roles identify composite controls that always include managed controls, identified by 'child' roles. For example, role='listbox' identifies a composite control that manages a set of managed controls identified by role='option'. People who use assistive technologies might find it difficult or impossible to use a composite control if its managed controls lack the required child role.<br><br> See :<br><a target='_blank' href='https://web.dev/aria-required-children/'>Elements with an ARIA [role] that require children to contain a specific [role] are missing some or all of those required children</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-required-children/'>aria-required-children</a><br></div>", + "titleData": "{0} element(s) have missing child roles" + }, + "ariaRequiredParent": { + "title": "`[role]`s are contained by their required parent element", + "description": "Lighthouse flags ARIA child roles that aren't contained by the required parent", + "correction": "<div class='correction-text'>An ARIA role attribute can be added to an element to instruct assistive technologies to treat the element as something other than its native HTML element type. For example, an < li > element with role='option' is to be treated as a selectable option in a listbox control, not as a static list item.<br><br>Some ARIA 'child' roles identify managed controls that are always part of a larger composite control, identified by a 'parent' role. For example, role='option' identifies a child control that is managed by a parent control identified by role='listbox'. People who use assistive technologies might find it difficult or impossible to use a child control if its managing control lacks the required parent role.<br><br>See :<br><a target='_blank' href='https://web.dev/aria-required-parent/'>[role]s are not contained by their required parent element</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-required-parent/'>aria-required-parent</a><br></div>", + "titleData": "{0} element(s) have missing parent roles" + }, + "ariaToggleFieldName": { + "title": "ARIA toggle fields have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies.", + "correction": "<div class='correction-text'>When a toggle field doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers. <br><br>See :<br><a target='_blank' href='https://web.dev/aria-name/'>ARIA items do not have accessible names</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-toggle-field-name/'>aria-toggle-field-name</a><br></div>", + "titleData": "Not all ARIA toggle fields have accessible names", + "titleDataSuccess": "ARIA toggle fields have accessible names" + }, + "ariaTooltipName": { + "title": "ARIA `tooltip` elements have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies.", + "correction": "<div class='correction-text'>An ARIA tooltip is a contextual popup with text describing an interface element. The tooltip typically becomes visible when the mouse hovers over, or focus is received by, the owning element. An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type. When an ARIA tooltip doesn't an accessible name, people who use assistive technologies have no way of knowing its purpose.<br><br>See :<br><a target='_blank' href='https://web.dev/aria-name/'>ARIA items do not have accessible names</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/aria-tooltip-name/'>aria-tooltip-name</a><br></div>", + "titleData": "Not all ARIA tooltip elements have accessible names", + "titleDataSuccess": "ARIA tooltip elements have accessible names" + }, + "ariaTreeitemName": { + "title": "ARIA `treeitem` elements have accessible names", + "description": "Lighthouse flags custom ARIA items whose names aren't accessible to assistive technologies.", + "correction": "<div class='correction-text'>When an element doesn't have an accessible name, screen readers announce it with a generic name, making it unusable for users who rely on screen readers.<br><br>See :<br><a target='_blank' href='https://web.dev/aria-name/'>ARIA items do not have accessible names</a><br></div>", + "titleData": "Not all ARIA treeitem elements have accessible names", + "titleDataSuccess": "ARIA treeitem elements have accessible names" + }, + "buttonName": { + "title": "Buttons have an accessible name", + "description": "Lighthouse flags buttons that don't have text content or an aria-label property.", + "correction": "<div class='correction-text'>An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type. When a button doesn’t have an accessible name, people who use assistive technologies have no way of knowing its purpose.<br><br>See :<br><a target='_blank' href='https://web.dev/button-name/'>Buttons do not have an accessible name</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/button-name/'>button-name</a><br></div>", + "titleData": "{0} button(s) do not have an accessible name" + }, + "definitionList": { + "title": "Definition List", + "description": "Lighthouse flags <dl> elements that don't contain properly ordered <dt> and <dd> groups, <script>, or <template> elements.", + "correction": "<div class='correction-text'>A definition list is a list of terms (words or phrases), and their definitions. A definition list can contain only certain element types, and it requires a specific structure.<br><br>When an assistive technology encounters a definition list that’s poorly structured or contains invalid elements, it might respond in an unexpected way. As a result, people who use assistive technologies might find it difficult to interpret the list.<br><br>See :<br><a target='_blank' href='https://web.dev/definition-list/'>< dl > do not contain only properly ordered < dt > and < dd > groups, < script >, or < template > elements</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/definition-list/'>definition-list</a><br></div>", + "titleData": " {0} `<dl>`'s don't contain only properly-ordered `<dt>` and `<dd>` groups, `<script>`, `<template>` or `<div>` elements " + }, + "dlItem": { + "title": "Definition list items are wrapped in `<dl>` elements", + "description": "Lighthouse reports when definition list items are not wrapped in <dl> elements.", + "correction": "<div class='correction-text'>A definition list is a list of terms (words or phrases), and their definitions. The < dt > and < dd > elements must be contained by a < dl > element.<br><br>When an assistive technology encounters a definition list that’s poorly structured, it might respond in an unexpected way. As a result, people who use assistive technologies might find it difficult to interpret the list.<br><br>See :<br><a target='_blank' href='https://web.dev/dlitem/'>Definition list items are not wrapped in < dl > elements</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/dlitem/'>dlitem</a><br></div>", + "titleData": "{0} definition list item(s) are not wrapped in <dl> elements" + }, + "formFieldMultipleLabels": { + "title": "No form fields have multiple labels", + "description": "Lighthouse flags form elements that have more than one label.", + "correction": "<div class='correction-text'>Form fields with multiple labels can be confusingly announced by assistive technologies like screen readers which use either the first, the last, or all of the labels. <br><br>See :<br><a target='_blank' href='https://web.dev/form-field-multiple-labels'>Form fields have multiple labels</a><br></div>", + "titleData": "{0} Form Field(s) have multiple labels" + }, + "frameTitle": { + "title": "`<frame>` or `<iframe>` elements have a title", + "description": "Lighthouse flags <frame> and <iframe> elements that don't have titles.", + "correction": "<div class='correction-text'>A < frame > or < iframe > is used to embed one HTML document within another. An accessible name is a word or phrase coded in a way that assistive technologies can associate it with a specific user interface object. Assistive technologies can then refer to the object by name, not just by type.<br><br>People with good vision can glance at a < frame > or < iframe > element to get a good idea of its content. People who use assistive technologies rely on the frame’s accessible name to determine whether it contains information relevant to their current needs.<br><br>See :<br><a target='_blank' href='https://web.dev/frame-title/'>< frame > or < iframe > elements do not have a title</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/frame-title/'>frame-title</a><br></div>", + "titleData": "{0} <frame> or <iframe> element(s) do not have a title" + }, + "inputImageAlt": { + "title": "`<input type=\"image\">` elements have `[alt]` text", + "description": "Lighthouse flags < input type='image' > elements that don't have alt text", + "correction": "<div class='correction-text'>An image button is an < input > element with type='image'. Alternative text is a word or phrase that (1) is coded in a way that assistive technologies can associate it with a specific non-text object, and (2) conveys the same information as the non-text object.<br><br>Because assistive technologies can’t interpret an image directly, they rely on alternative text to communicate the image button’s purpose. When an image button doesn’t have alternative text, people who use assistive technologies have no way of knowing its purpose.<br><br>See :<br><a target='_blank' href='https://web.dev/input-image-alt/'>< input type='image' > elements do not have [alt] text</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/input-image-alt/'>input-image-alt</a><br></div>", + "titleData": "{0} < input type='image' > element(s) do not have [alt] text" + }, + "metaRefresh": { + "title": "The document does not use `<meta http-equiv=\"refresh\">`", + "description": "Lighthouse flags pages that contain a <meta> tag with the http-equiv='refresh' attribute.", + "correction": "<div class='correction-text'>Using http-equiv='refresh' in a < meta > element causes a web page to refresh automatically at a specified time interval.<br><br>An automatic page refresh can be disorienting. If a refresh causes input focus to move unexpectedly back to its original state, it can be especially frustrating for people who use screen readers and other keyboard users.<br><br>See :<br><a target='_blank' href='https://web.dev/meta-refresh/'>The document uses < meta http-equiv='refresh' ></a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/meta-refresh/'>meta-refresh</a><br></div>", + "titleData": "At least one document uses <meta http-equiv='refresh'>", + "titleDataSuccess": "All documents do not use <meta http-equiv='refresh'>" + }, + "metaViewport": { + "title": "Meta Viewport", + "description": "Lighthouse flags pages that disable browser zooming.", + "correction": "<div class='correction-text'>Using content='user-scalable=no' in a < meta name='viewport' > element disables zooming in some browsers. Users are forced to view the text at the specified size.<br><br>Most people find it easier to read text when it is sufficiently large. People with visual disabilities, low vision, or limited color perception are likely to find text unreadable when it’s too small.<br><br>See :<br><a target='_blank' href='https://web.dev/meta-viewport/'>[user-scalable='no'] is used in the < meta name='viewport' > element or the [maximum-scale] attribute is less than 5</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/meta-viewport/'>meta-viewport</a><br></div>", + "titleData": "{0} `[user-scalable=\"no\"]` is used in the `<meta name=\"viewport\">` element and the `[maximum-scale]` attribute is not less than 5. " + }, + "objectAlt": { + "title": "`<object>` elements have `[alt]` text", + "description": "Lighthouse flags <object> elements that don't have alternative text.", + "correction": "<div class='correction-text'>An < object > element is used to embed multimedia content in a web page. It can also be used to embed one web page inside another.<br><br>Alternative text is a word or phrase that (1) is coded in a way that assistive technologies can associate it with a specific non-text object, and (2) conveys the same information as the non-text object.<br><br>Because assistive technologies can’t interpret objects directly, they rely on alternative text to communicate the meaning of non-text content to users.<br><br>See :<br><a target='_blank' href='https://web.dev/object-alt/'>< object > elements do not have alt text</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/object-alt/'>object-alt</a><br></div>", + "titleData": "{0} <object> element(s) do not have [alt] text" + }, + "thHasDataCells": { + "title": "<th> elements have data cells they describe.", + "description": "Lighthouse flags <th> elements and elements with [role='columnheader'/'rowheader'] that don't have the data cells they describe.", + "correction": "<div class='correction-text'>When people with good vision see a table with a row or column header that has no associated data cells, they can tell at a glance that the data is missing. People who use assistive technologies must explore a table deliberately to discover its contents; they are likely to have difficulty interpreting a table with missing data cells.<br><br>See :<br><a target='_blank' href='https://web.dev/th-has-data-cells/'>< th > elements and elements with [role='columnheader'/'rowheader'] do not have data cells they describe</a><br><a target='_blank' href='https://accessibilityinsights.io/info-examples/web/th-has-data-cells/'>th-has-data-cells</a><br></div>", + "titleData": "{0} <th> elements and elements with [role='columnheader'/'rowheader'] do not have the data cells they describe" + }, + "videoCaption": { + "title": "Video Caption", + "description": "Lighthouse flags <video> elements that are missing a <track> element with the attribute kind='captions'.", + "correction": "<div class='correction-text'>When a video provides a caption it is easier for deaf and hearing impaired users to access its information. <br><br>See :<br><a target='_blank' href='https://web.dev/video-caption/'>< video > elements do not contain a < track > element with [kind=\"captions\"]</a><br></div>", + "titleData": "{0} <video> element(s) have missing <track> element with the attribute kind='captions'" + }, + "accessKeys": { + "title": "`[accesskey]` values are unique", + "description": "Lighthouse flags pages with duplicate access keys.", + "correction": "<div class='correction-text'>Access keys let users quickly focus a part of the page. For proper navigation, each access key must be unique. <br><br> See :<br><a target='_blank' href='https://web.dev/accesskeys/'>[accesskey] values are not unique</a></div>", + "titleData": "{0} value(s) are not unique" + } +} \ No newline at end of file diff --git a/EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthousePerformanceData.json b/EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthousePerformanceData.json new file mode 100644 index 0000000..8eb3fae --- /dev/null +++ b/EcoSonar-SonarQube/src/main/js/utils/bestPractices/lighthousePerformanceData.json @@ -0,0 +1,169 @@ +{ + "viewport": { + "title": "Has a Viewport meta tag", + "description": "Lighthouse flags pages without a viewport meta tag.", + "correction": "<div class='correction-text'>The Viewport meta tag enables responsive design, which means the web page adapts and scales appropriately to fit different screen sizes, including smartphones, tablets, laptops, and desktop computers. Responsive design ensures that users don't need to zoom in or scroll horizontally to view content, resulting in a smoother user experience and reduced frustration..A `< meta name=\"viewport\" >` not only optimizes your app for mobile screen sizes, but also prevents a 300 millisecond delay to user input.<br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/1.6/'>RGESN 1.6 : Does the digital service adapt to different types of terminals display ?</a><br><br> See :<br><a target='_blank' href='https://web.dev/viewport/'>Does not have a < meta name=\"viewport\" > tag with width or initial-scale</a><br><a target='_blank' href='https://developer.mozilla.org/en-US/docs/Web/HTML/Viewport_meta_tag'>Viewport meta tag</a><br><a target='_blank' href='https://gtmetrix.com/use-a-meta-tag-with-width-or-initial-scale.html'>Lighthouse: Use a < meta name=\"viewport\" > tag with width or initial-scale</a></div>", + "titleData": "have missing `<meta name=\"viewport\">` tag", + "titleDataSuccess": "have viewport meta tag" + }, + "serverResponseTime": { + "title": "Initial server response time was short", + "description": "This audit fails when the browser waits more than 600 ms for the server to respond to the main document request.", + "correction": "<div class='correction-text'>Keep the server response time for the main document short because all other requests depend on it. <br> When a server responds quickly to user requests, it processes and delivers the requested web page or data more efficiently. A shorter response time means less time spent on data processing, which translates to lower energy consumption on the server-side. This is particularly important for websites with high traffic, as reducing the energy usage of servers can have a significant impact on overall carbon emissions associated with data centers and web hosting.<br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.3/'>RGESN 6.3 : Does the digital service use caching mechanisms for all transferred content under its control?</a><br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/7.1/'>RGESN 7.1 : Does the digital service use a server caching system for the most used data?</a><br><br> See :<br><a target='_blank' href='https://web.dev/time-to-first-byte/'>Reduce server response times (TTFB) </a><br><a target='_blank' href='https://gtmetrix.com/reduce-initial-server-response-time.html'>Lighthouse: Reduce initial server response time</a><br><a target='_blank' href='https://phoenixnap.com/kb/reduce-server-response-time'>7 Ways to Reduce Server Response Time</a> <br><a target='_blank' href='https://datadome.co/learning-center/how-to-reduce-server-response-time/'>8 Ways to Effectively Reduce Server Response Time</a></div>", + "titleData": "Root document took {0}ms on average" + }, + "mainthreadWorkBreakdown": { + "title": "Minimize main-thread work", + "description": "Lighthouse flags pages that keep the main thread busy for longer than 4 seconds during load.", + "correction": "<div class='correction-text'>The main thread is responsible for executing JavaScript and rendering web content in a web browser. When designers and developers focus on reducing main-thread work, they achieve the following benefits:<br><br> 1.Energy Efficiency: Main-thread work requires the device's CPU to process JavaScript and render the web page. By minimizing the amount of work done on the main thread, web applications become more energy-efficient. This is especially important for mobile devices and laptops with limited battery life, as reducing CPU usage directly translates to longer battery life and reduced energy consumption.<br><br>2.Faster Page Load Times: When the main thread is not overwhelmed with excessive work, web pages load more quickly. Faster page load times lead to a better user experience, reduced bounce rates, and increased user engagement. Additionally, faster loading pages consume less network bandwidth, contributing to lower data transmission and reduced energy consumption.<br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.8/'>RGESN 6.8 : Does the digital service avoid triggering the loading of unused assets and content for each feature? </a><br><br> See :<br><a target='_blank' href='https://web.dev/mainthread-work-breakdown/'>Minimize main thread work</a><br><a target='_blank' href='https://gtmetrix.com/minimize-main-thread-work.html'>Lighthouse: Minimize main-thread work</a><br><a target='_blank' href='https://touch.marfeel.com/resources/blog/how-do-i-minimize-main-thread-work'>How do I minimize main thread work?</a> <br><a target='_blank' href='https://aatifbandey.medium.com/reduce-main-thread-work-in-react-component-a90c9bc1d9b3'>How to minimize main thread work in React Component</a></div>", + "titleData": "{0}s on average" + }, + "bootupTime": { + "title": "Reduce JavaScript execution time", + "description": "Lighthouse shows a warning when JavaScript execution takes longer than 2 seconds. The audit fails when execution takes longer than 3.5 seconds.", + "correction": "<div class='correction-text'>JavaScript execution requires the device's CPU to process complex operations, which consumes energy. By reducing the execution time of JavaScript code, web applications become more energy-efficient, leading to lower power consumption and reduced carbon emissions associated with energy generation. <br>JavaScript execution time directly affects how quickly web pages load and become interactive. Optimizing JavaScript code helps minimize loading times, leading to a better user experience and reduced data usage. Faster page load times also contribute to lower data transmission, benefiting users with limited data plans and reducing the environmental impact of data transfer.<br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.8/)'>RGESN 6.8 : Does the digital service avoid triggering the loading of unused assets and content for each feature? </a><br><br> See :<br><a target='_blank' href='https://web.dev/bootup-time/'>Reduce JavaScript execution time</a><br><a target='_blank' href='https://gtmetrix.com/reduce-javascript-execution-time.html'>Lighthouse: Reduce JavaScript execution time</a><br><a target='_blank' href='https://wp-rocket.me/google-core-web-vitals-wordpress/reduce-javascript-execution-time/'>How to Reduce Javascript Execution Time</a> <br><a target='_blank' href='https://touch.marfeel.com/resources/blog/reduce-script-evaluation-time'>Reduce script evaluation time in 4 steps</a> </div>", + "titleData": "{0}s on average" + }, + "fontDisplay": { + "title": "Ensure text remains visible during webfont load", + "description": "Lighthouse flags any font URLs that may flash invisible text.", + "correction": "<div class='correction-text'>Fallback fonts are typically standard system fonts that are readily available on users' devices. By ensuring text remains visible during webfont loading, designers prioritize accessibility for all users, including those with slower internet connections or devices that might take longer to load custom fonts. This ensures that the content remains legible and usable for everyone, regardless of their access to the webfonts.<br><br> Leverage the font-display CSS feature to ensure text is user-visible while webfonts are loading. <br><br> See :<br><a target='_blank' href='https://web.dev/font-display/'>Ensure text remains visible during webfont load</a><br><a target='_blank' href='https://gtmetrix.com/ensure-text-remains-visible-during-webfont-load.html'>Lighthouse: Ensure text remains visible during webfont load</a><br><a target='_blank' href='https://wp-rocket.me/google-core-web-vitals-wordpress/ensure-text-remains-visible-webfont-load/'>How to Ensure Text Remains Visible During Webfont Load</a> </div>", + "titleData": "text are invisible during one of pages load", + "titleDataSuccess": "no text are invisible" + }, + "thirdPartySummary": { + "title": "Minimize third-party usage", + "description": "Reduce the presence of third-party code.", + "correction": "<div class='correction-text'>Third-party code can significantly impact load performance. Limit the number of redundant third-party providers and try to load third-party code after your page has primarily finished loading. <br>While some third-party services can be beneficial, reducing their usage offers several advantages from an ecodesign perspective: <br><br>1.Reduced Data Transfer: Third-party services often require additional data transfers between the user's device and external servers. Minimizing third-party usage means fewer requests to external servers, leading to reduced data transmission. This can help conserve bandwidth and lower the energy consumption associated with data transfer, particularly for users with limited data plans. <br><br>2.Improved Page Load Times: Third-party scripts and services can add extra weight to web pages, leading to slower loading times. By minimizing their usage, web pages become lighter and load more quickly, resulting in a better user experience and lower energy consumption. <br><br>3.Lower Server Load: Third-party services often rely on external servers to process data and deliver content. By reducing their usage, web servers experience less strain, leading to lower energy consumption in data centers and a reduced carbon footprint. <br><br>4.Enhanced Privacy and Security: Some third-party services may collect user data for tracking and advertising purposes, potentially compromising user privacy. Minimizing third-party usage can help protect user data and improve online security. <br><br>Government Regulation;<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/4.5/'>RGESN 4.5 : Does the digital service allow users to decide on the activation of a third-party service?</a><br><br> Best practices n°82 from '115 bonnes pratiques d'écoconception web v4'<br><br> See :<br><a target='_blank' href='https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/'>Loading Third-Party JavaScript</a><br><a target='_blank' href='https://gtmetrix.com/reduce-the-impact-of-third-party-code.html'>Lighthouse: Reduce the impact of third-party code</a><br><a target='_blank' href='https://nitropack.io/blog/post/reduce-the-impact-of-third-party-code'>Reduce the Impact of Third-Party Code </a> </div>", + "titleData": "Third-party code blocked the main thread for {0}ms on average" + }, + "thirdPartyFacades": { + "title": "Some third-party resources can be lazy loaded with a facade", + "description": "Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required.", + "correction": "<div class='correction-text'> Lazy loading refers to the practice of deferring the loading of non-essential resources until they are actually needed, while a facade is a simplified interface that acts as a placeholder for the actual resource. Some third-party embeds can be lazy loaded. Consider replacing them with a facade until they are required.Lazy loading ensures that resources are only loaded when they are actually needed, reducing unnecessary resource usage. This includes network resources, server processing, and client-side rendering, leading to improved resource efficiency.<br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.8/'>RGESN 6.8 : Does the digital service avoid triggering the loading of unused assets and content for each feature?</a><br><br> See :<br><a target='_blank' href='https://web.dev/third-party-facades/'>Lazy load third-party resources with facades</a><br><a target='_blank' href='https://gtmetrix.com/lazy-load-third-party-resources-with-facades.html#:~:text=Lazy%20loading%20your%20third-party,user%20interacts%20with%20the%20facade.'>Lighthouse: Lazy load third-party resources with facades</a><br><a target='_blank' href='https://docs.wp-rocket.me/article/1458-lazy-load-third-party-resources-with-facades'>Lazy load third-party resources with facades</a> </div>", + "titleData": "{0} facade alternative(s) available" + }, + "lcpLazyLoaded": { + "title": "Don't lazy load Largest Contentful Paint image", + "description": "Above-the-fold images that are lazily loaded render later in the page lifecycle, which can delay the largest contentful paint.", + "correction": "<div class='correction-text'>Lazy-loading is a technique to defer downloading a resource until it's needed, which conserves data and reduces network contention for critical assets. It became a web standard in 2019 and today loading='lazy' for images is supported by most major browsers. That sounds great, but is there such a thing as too much lazy loading? What we found is that lazy-loading can be an amazingly effective tool for reducing unneeded image bytes, but overuse can negatively affect performance. Concretely, our analysis shows that more eagerly loading images within the initial viewport—while liberally lazy-loading the rest—can give us the best of both worlds: fewer bytes loaded and improved Core Web Vitals. <br>The LCP image is usually the most significant visual element on a page, such as a hero image or a central part of the content. Users expect to see this image immediately when the page loads, and delaying its loading through lazy loading could negatively impact user experience. Prioritizing a smooth and complete visual experience is essential for retaining users and ensuring a positive engagement. The LCP image often provides context and understanding of the web page's content. If the image is delayed through lazy loading, users might not fully comprehend the page's purpose or message until the image loads. This can result in confusion and frustration, potentially leading users to leave the site.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.6/'>RGESN 6.6 : Does the digital service provide a progressive loading mechanism for graphics and media that require it?</a><br><br> See :<br><a target='_blank' href='https://web.dev/lcp-lazy-loading/'>The performance effects of too much lazy-loading</a><br><a target='_blank' href='https://gtmetrix.com/dont-lazy-load-lcp-image.html'>Lighthouse: Don't lazy load Largest Contentful Paint image</a> </div>", + "titleData": "At least one largest contentful image was lazy loaded", + "titleDataSuccess": "No largest contentful image was lazy loaded" + }, + "nonCompositedAnimations": { + "title": "Avoid non-composited animations", + "description": "Animations which are not composited can be janky and increase Cumulative Layout Shift.", + "correction": "<div class='correction-text'>Non-composited animations, also known as repaint-heavy animations, require frequent recalculations and rendering of elements, which can strain the device's CPU and graphics processor. This leads to increased energy consumption and reduced battery life, particularly on mobile devices. Animations which are not composited can be janky and increase CLS.<br><br> See :<br><a target='_blank' href='https://web.dev/non-composited-animations'>Avoid non-composited animations</a><br><a target='_blank' href='https://gtmetrix.com/avoid-non-composited-animations.html'>Lighthouse: Avoid non-composited animations</a> <br><a target='_blank' href='https://cocolyze.com/en/seo-glossary/non-composited-animations'>Non-composited animations</a> </div>", + "titleData": "{0} animated elements found" + }, + "domSize": { + "title": "Avoids an excessive DOM size", + "description": "Lighthouse flags pages with DOM trees that: \n Warns when the body element has more than ~800 nodes. \n Errors when the body element has more than ~1,400 nodes.\n Be careful EcoSonar rules are more strict : you should have less than 475 nodes to reach a B Score.", + "correction": "<div class='correction-text'>The DOM represents the structured representation of a web page's content, structure, and behavior in the browser. An excessively large DOM can negatively impact various aspects of a website's functionality and efficiency. Here's why avoiding an excessive DOM size is important: <br><br>1.Performance: A large DOM can lead to slower rendering times and longer page load times. When the browser has to process and render a complex DOM structure, it requires more computational resources and time, resulting in a suboptimal user experience. <br><br>2. Memory Usage: A large DOM consumes more memory, leading to increased memory usage by the browser. This can impact overall system performance and potentially cause websites to crash or slow down, affecting both user experience and energy efficiency. <br><br>3.Energy Efficiency: Rendering a large DOM requires additional CPU and GPU processing, leading to higher energy consumption. By reducing the DOM size, web pages become more energy-efficient, helping to minimize the environmental impact of browsing. <br><br>4.Mobile Performance: Mobile devices often have limited resources compared to desktop computers. An excessive DOM size can disproportionately impact mobile performance, leading to sluggishness, longer load times, and higher battery drain. <br><br>5.Search Engine Optimization (SEO): Search engines use website performance as a ranking factor. A large DOM can lead to slower load times, which may negatively impact search engine rankings, affecting the visibility and discoverability of a website.<br><br> Best practices n°12 from '115 bonnes pratiques d'écoconception web v4'<br><br> See :<br><a target='_blank' href='https://web.dev/dom-size/'>Avoid an excessive DOM size</a><br><a target='_blank' href='https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations'>Reduce the scope and complexity of style calculations</a> <br><a target='_blank' href='https://developers.google.com/speed/articles/reflow'>Minimizing browser reflow</a> </div>", + "titleData": "{0} elements on average" + }, + "usesLongCacheTtl": { + "title": "Serve static assets with an efficient cache policy", + "description": "Lighthouse flags all static resources that aren't cached.", + "correction": "<div class='correction-text'>Static assets include files like images, stylesheets, scripts, fonts, and other resources that don't change frequently. An efficient cache policy ensures that these assets are stored in the user's browser or on intermediary servers, reducing the need for repeated requests and resource-intensive data transfers.<br>A long cache lifetime can speed up repeat visits to your page.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.9/'>RGESN 6.9 : Does the digital service use client-side storage of some resources to avoid unnecessary network exchanges?</a><br><br> See :<br><a target='_blank' href='https://web.dev/uses-long-cache-ttl/'>Serve static assets with an efficient cache policy</a><br><a target='_blank' href='https://gtmetrix.com/serve-static-assets-with-an-efficient-cache-policy.html#:~:text=Serving%20static%20assets%20with%20an,CSS%2C%20JavaScript%2C%20and%20images.'>Lighthouse: Serve static assets with an efficient cache policy</a> <br><a target='_blank' href='https://wp-rocket.me/google-core-web-vitals-wordpress/serve-static-assets-with-an-efficient-cache-policy/'>How to Serve Assets With an Efficient Cache Policy on WordPress</a> </div>", + "titleData": "{0} resources found" + }, + "usesResponsiveImages": { + "title": "Properly size images", + "description": "The Opportunities section of your Lighthouse report lists all images in your page that aren't appropriately sized, along with the potential savings in kibibytes (KiB).", + "correction": "<div class='correction-text'>Serve images that are appropriately-sized to save cellular data and improve load time.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/5.2/'>RGESN 5.2 Does the digital service offer image content whose level of compression is appropriate for the content and viewing context?</a><br><br> See :<br><a target='_blank' href='https://web.dev/uses-responsive-images/'>Properly size images</a><br><a target='_blank' href='http://www.ecometer.org/rules/optimize-bitmaps.html'>Optimize bitmaps</a> <br><a target='_blank' href='https://gtmetrix.com/blog/how-to-properly-size-images/'>How to properly size images</a> </div>", + "titleData": "Potential savings of {0} KiB" + }, + "offscreenImages": { + "title": "Defer offscreen images (or lazy-loading)", + "description": "The Opportunities section of your Lighthouse report lists all offscreen or hidden images in your page along with the potential savings in kibibytes (KiB). Consider lazy-loading these images after all critical resources have finished loading to lower Time to Interactive.", + "correction": "<div class='correction-text'>Offscreen images are images that are not initially visible to the user when a web page loads. Deferment involves loading these images only when they are about to come into the user's viewport, ensuring a smoother and more resource-efficient browsing experience.<br> Consider lazy-loading offscreen and hidden images after all critical resources have finished loading to lower time to interactive.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.6/'>RGESN 6.6 : Le service numérique propose-t-il un mécanisme de chargement progressif pour les éléments graphiques et les médias le nécessitant ?</a><br><br> See :<br><a target='_blank' href='https://web.dev/offscreen-images/'>Defer offscreen images</a><br><a target='_blank' href='https://www.corewebvitals.io/pagespeed/fix-defer-offscreen-images-lighthouse'>Learn how to fix 'defer offscreen images'</a> <br><a target='_blank' href='https://gtmetrix.com/defer-offscreen-images.html'>Lighthouse: Defer offscreen images</a> <br><a target='_blank' href='https://wp-rocket.me/google-core-web-vitals-wordpress/defer-offscreen-images/'>How to Defer Offscreen Images</a> </div>", + "titleData": "Potential savings of {0} KiB" + }, + "unusedCssRules": { + "title": "Reduce unused CSS", + "description": "The Opportunities section of your Lighthouse report lists all stylesheets with unused CSS with a potential savings of 2 KiB or more. Remove the unused CSS to reduce unnecessary bytes consumed by network activity.", + "correction": "<div class='correction-text'>Reduce unused rules from stylesheets and defer CSS not used for above-the-fold content to decrease bytes consumed by network activity.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.8/'>RGESN 6.8 : Does the digital service avoid triggering the loading of unused assets and content for each feature?</a><br><br> See :<br><a target='_blank' href='https://web.dev/unused-css-rules/'>Remove unused CSS</a><br><a target='_blank' href='https://css-tricks.com/how-do-you-remove-unused-css-from-a-site/'>How Do You Remove Unused CSS From a Site?</a> <br><a target='_blank' href='https://blog.bitsrc.io/4-ways-to-remove-unused-css-647828ca629b'>4 Ways to Remove Unused CSS</a> </div>", + "titleData": "Potential savings of {0} KiB" + }, + "unusedJavascript": { + "title": "Reduce unused JavaScript", + "description": "Lighthouse flags every JavaScript file with more than 20 kibibytes of unused code.", + "correction": "<div class='correction-text'>Reduce unused JavaScript and defer loading scripts until they are required to decrease bytes consumed by network activity. <br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.8/'>RGESN 6.8 : Does the digital service avoid triggering the loading of unused assets and content for each feature?</a><br><br> See :<br><a target='_blank' href='https://web.dev/unused-javascript/'>Remove unused JavaScript </a><br><a target='_blank' href='https://www.erwinhofman.com/blog/a-lifehack-for-removing-unused-js-css-or-just-minifying/'>A Lifehack for removing unused JS/CSS.. or just unminify</a> <br><a target='_blank' href='https://mindsize.com/development/how-to-remove-unused-javascript/'>How to Remove Unused JavaScript</a> </div>", + "titleData": "Potential savings of {0} KiB" + }, + "usesOptimizedImages": { + "title": "Efficiently encode images", + "description": "The Opportunities section of your Lighthouse report lists all unoptimized images, with potential savings in kibibytes (KiB).", + "correction": "<div class='correction-text'>Smaller image file sizes require less data to be transferred from the server to the user's device. This conserves bandwidth, reduces data consumption, and minimizes the energy consumption associated with data transmission. <br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/5.2/'>RGESN 5.2 Does the digital service offer image content whose level of compression is appropriate for the content and viewing context?</a><br><br> See :<br><a target='_blank' href='https://web.dev/uses-optimized-images/'>Efficiently encode images</a><br><a target='_blank' href='https://gtmetrix.com/efficiently-encode-images.html'>Lighthouse: Efficiently encode images</a> </div>", + "titleData": "Potential savings of {0} KiB" + }, + "modernImageFormats": { + "title": "Serve images in modern formats", + "description": "The Opportunities section of your Lighthouse report lists all images in older image formats, showing potential savings gained by serving AVIF versions of those images.", + "correction": "<div class='correction-text'>Image formats like WebP and AVIF often provide better compression than PNG or JPEG, which means faster downloads and less data consumption. To serve images in modern formats, designers and developers can follow these practices: <br>1.Choose the Right Format: Assess the content and characteristics of each image to determine the most suitable modern image format. <br>2.Implement Browser Detection: Use techniques like feature detection to ensure that modern image formats are only served to browsers that support them. <br>3.Use Conversion Tools: Utilize conversion tools or online services to convert existing images to modern formats. <br>4.Implement Fallbacks: Provide fallback images in older formats for browsers that do not support modern formats. <br>5.Use Content Delivery Networks (CDNs): Many CDNs automatically serve images in optimized formats based on the user's browser and device capabilities. <br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/5.1/'>RGESN 5.1 : Does the digital service use a file format adapted to the content and viewing context of each image content?</a><br><br> See :<br><a target='_blank' href='https://web.dev/uses-webp-images/'>Serve images in modern formats</a><br><a target='_blank' href='https://sortable.com/how-to-guide/how-to-serve-next-gen-image-formats-in-modern-browsers/'>How to Serve Next-Gen Image Formats in Modern Browsers</a> <br><a target='_blank' href='https://www.smashingmagazine.com/2021/09/modern-image-formats-avif-webp/'>Using Modern Image Formats: AVIF And WebP</a></div>", + "titleData": "Potential savings of {0} KiB" + }, + "usesTextCompression": { + "title": "Enable text compression", + "description": "The Opportunities section of your Lighthouse report lists all text-based resources that aren't compressed.", + "correction": "<div class='correction-text'>Text-based resources should be served with compression (gzip, deflate or brotli) to minimize total network bytes.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.4/'>RGESN 6.4 : Has the digital service implemented compression techniques on all transferred resources under its control?</a><br><br> See :<br><a target='_blank' href='https://web.dev/uses-text-compression/'>Enable text compression</a><br><a target='_blank' href='https://gtmetrix.com/enable-text-compression.html'>Lighthouse: Enable text compression</a> <br><a target='_blank' href='https://blog.hubspot.com/website/gzip-compression'>How to Enable GZIP Compression for Faster Web Pages</a><br><a target='_blank' href='https://docs.wp-rocket.me/article/1403-enable-text-compression'>Enable Text Compression</a></div>", + "titleData": "Potential savings of {0} KiB" + }, + "usesHttp2": { + "title": "Use HTTP/2", + "description": "Lighthouse lists all resources not served over HTTP/2.", + "correction": "<div class='correction-text'>HTTP/2 is a modern protocol for transferring data between a web server and a user's browser. It introduces several features that enhance the efficiency of data transfer, resulting in faster loading times, improved user experience, and a more sustainable digital ecosystem. <br>HTTP/2 offers many benefits over HTTP/1.1, including binary headers and multiplexing. <br>HTTP/2 supports multiplexing, allowing multiple requests and responses to be sent and received concurrently over a single connection. This reduces the overhead associated with setting up multiple connections, leading to faster and more efficient data transfer.<br> HTTP/2 uses header compression techniques to reduce the size of request and response headers. This conserves bandwidth and minimizes the energy consumption associated with data transmission. <br><br><br>Regulation:<br> Best practices n°83 from '115 bonnes pratiques d'écoconception web v4'<br><br> See :<br><a target='_blank' href='https://web.dev/uses-http2'>Does not use HTTP/2 for all of its resources</a><br><a target='_blank' href='https://gtmetrix.com/use-http2-for-all-resources.html'>Lighthouse: Use HTTP/2 for all resources</a> <br><a target='_blank' href='https://sitebulb.com/hints/performance/use-http2-for-all-of-its-resources/'>Use HTTP/2 for all of its resources</a></div>", + "titleData": "{0} requests not served via HTTP/2" + }, + "efficientAnimatedContent": { + "title": "Use video formats for animated content", + "description": "The Opportunities section of your Lighthouse report lists all animated GIFs, along with estimated savings in seconds achieved by converting these GIFs to video.", + "correction": "<div class='correction-text'>Large GIFs are inefficient for delivering animated content. Consider using MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save network bytes.<br><br> See :<br><a target='_blank' href='https://web.dev/efficient-animated-content/'>Use video formats for animated content</a><br><a target='_blank' href='https://gtmetrix.com/use-video-formats-for-animated-content.html'>Lighthouse: Use video formats for animated content</a></div>", + "titleData": "Potential savings of {0} KiB" + }, + "legacyJavascript": { + "title": "Avoid serving legacy JavaScript to modern browsers", + "description": "Lighthouse identifies the polyfills and transforms that should not be present if using the module/nomodule pattern.", + "correction": "<div class='correction-text'>Polyfills and transforms enable legacy browsers to use new JavaScript features. However, many aren't necessary for modern browsers. For your bundled JavaScript, adopt a modern script deployment strategy using module/nomodule feature detection to reduce the amount of code shipped to modern browsers, while retaining support for legacy browsers.<br><br> See :<br><a target='_blank' href='https://gtmetrix.com/avoid-serving-legacy-javascript-to-modern-browsers.html#:~:text=Avoid%20serving%20legacy%20JavaScript%20code,to%20JavaScript%20programming%20and%20functionality.'>Lighthouse: Avoid serving legacy JavaScript to modern browsers</a><br><a target='_blank' href='https://philipwalton.com/articles/deploying-es2015-code-in-production-today/'>Deploying ES2015+ Code in Production Today</a></div>", + "titleData": "Potential savings of {0} KiB" + }, + "totalByteWeight": { + "title": "Avoid enormous network payloads", + "description": "Lighthouse shows the total size in kibibytes (KiB) of all resources requested by your page. The largest requests are presented first.", + "correction": "<div class='correction-text'>A network payload refers to the total amount of data that needs to be transferred between a server and a user's device to load a web page or application. Enormous network payloads, which result from large files and excessive data transfer, can lead to slow loading times, increased energy consumption, and a larger carbon footprint.<br><br>Government Regulation:<br> <a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.4/'>RGESN 6.4 : Has the digital service implemented compression techniques on all transferred resources under its control?</a><br><br> See :<br><a target='_blank' href='https://web.dev/total-byte-weight/'>Avoid enormous network payloads</a><br><a target='_blank' href='https://gtmetrix.com/avoid-enormous-network-payloads.html'>Lighthouse: Avoid enormous network payloads</a></div>", + "titleData": "Requests size was {0} KiB on average" + }, + "noDocumentWrite": { + "title": "Avoids document.write()", + "description": "Lighthouse flags calls to document.write() that weren't blocked by Chrome.", + "correction": "<div class='correction-text'>For users on slow connections, external scripts dynamically injected via `document.write()` can delay page load by tens of seconds. <br> document.write() is a JavaScript method that allows developers to dynamically insert content into a web page while it's being parsed. However, using document.write() can lead to rendering issues, slower page loads, and negatively impact both user experience and the environmental impact of web content delivery. <br><br>Government Regulation:<br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/4.1/'>RGESN 4.1 : Is the digital service usable via a low-speed connection?</a><br><br> See :<br><a target='_blank' href='https://web.dev/no-document-write/'>Uses document.write()</a><br><a target='_blank' href='https://developer.chrome.com/blog/removing-document-write/'>Intervening against document.write()</a></div>", + "titleData": "have at least one document.write()", + "titleDataSuccess": "have no document.write()" + }, + "layoutShiftElements": { + "title": "Avoid large layout shifts", + "description": "These DOM elements contribute most to the Cumulative Layout Shift of the page.", + "correction": "<div class='correction-text'>Large layout shifts can create a frustrating experience for your visitors as they make your page appear visually jarring, as page elements appear suddenly, move around, and affect how your visitors interact with the page. Avoiding large layout shifts is essential in creating a smooth and streamlined experience for your visitors. Regarding image dimensions, you should not be resizing image within your browser. Images should have by default the width and height that you want to set up.<br><br> See :<br><a target='_blank' href='https://gtmetrix.com/avoid-large-layout-shifts.html'>Lighthouse: Avoid large layout shifts</a><br><a target='_blank' href='https://web.dev/optimize-cls/'>Optimize Cumulative Layout Shift</a></div>", + "titleData": "{0} elements found" + }, + "usesPassiveEventListeners": { + "title": "Does not use passive listeners to improve scrolling performance", + "description": "Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance.", + "correction": "<div class='correction-text'> Passive event listeners are a technique used to make event handling more efficient, particularly for scrolling and touch interactions. By using passive event listeners, web developers can reduce the amount of work done by the browser during scroll interactions, leading to smoother performance. <br> Consider marking your touch and wheel event listeners as `passive` to improve your page's scroll performance.<br><br> See :<br><a target='_blank' href='https://web.dev/uses-passive-event-listeners/'>Use passive listeners to improve scrolling performance</a><br><a target='_blank' href='https://developer.chrome.com/blog/passive-event-listeners/'>Improving scroll performance with passive event listeners</a></div>", + "titleData": "at least one page does not have passive listeners", + "titleDataSuccess": "have passive listeners" + }, + "duplicatedJavascript": { + "title": "Remove duplicate modules in JavaScript bundles", + "description": "If the wasted bandwidth exceeds 1 KB, this audit triggers.", + "correction": "<div class='correction-text'>Remove large, duplicate JavaScript modules from bundles to reduce unnecessary bytes consumed by network activity. <br>To avoid serving legacy JavaScript to modern browsers, developers can follow these practices: <br>- Feature Detection: Use feature detection techniques to determine the capabilities of the user's browser before serving specific JavaScript code. <br>- Progressive Enhancement: Build your website's functionality using a progressive enhancement approach, where basic features are available to all users, while more advanced features are served to capable browsers. <br>- Use Modern APIs: Utilize modern JavaScript APIs and features that are well-supported by modern browsers. <br>- Browser Support Matrix: Maintain a browser support matrix that outlines the supported features and JavaScript capabilities of different browser versions.<br><br>Government Regulation:<br><br><a target='_blank' href='https://ecoresponsable.numerique.gouv.fr/publications/referentiel-general-ecoconception/critere/6.8/'>RGESN 6.8 : Does the digital service avoid triggering the loading of unused assets and content for each feature?</a><br><br> See :<br><a target='_blank' href='https://gtmetrix.com/remove-duplicate-modules-in-javascript-bundles.html'>Lighthouse: Remove duplicate modules in JavaScript bundles</a><br><a target='_blank' href='https://www.jakepusateri.com/blog/remove-webpack-duplicates/'>Reduce webpack bundle size by eliminating duplicated</a></div>", + "titleData": "Potential savings of {0} KiB" + }, + "unminifiedJavascript": { + "title": "Minify JavaScript", + "description": "The Opportunities section of your Lighthouse report lists all unminified JavaScript files, along with the potential savings in kibibytes (KiB) when these files are minified.", + "correction": "<div class='correction-text'>Minification is the process of removing unnecessary characters (such as white spaces, comments, and line breaks) from JS code without altering its functionality. Minifying JavaScript files can reduce payload sizes and script parse time.<br><br>Best practices n°77 from '115 bonnes pratiques d'écoconception web v4' <br><br> See :<br><a target='_blank' href='https://web.dev/unminified-javascript/'>Minifiy Javascript</a><br><a target='_blank' href='http://www.ecometer.org/rules/javascript-minification.html'>Minify Javascript files</a><br><a target='_blank' href='https://www.imperva.com/learn/performance/minification/'>Minification</a></div>", + "titleData": "Potential savings of {0} KiB" + } +} \ No newline at end of file diff --git a/README.md b/README.md index fddfc7f..01132e7 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Example of Architecture deployed on Azure: - MongoDB database - Private network: protects the data stored in the database and makes it only accessible to the specified services. - Subnet associated with the private network: connection between the database and the API -- Password Manager: store the password to access the database from the API and credentials used to audits pages requiring authentication +- Password Manager: store the password to access the database from the API <a name="installation"></a> @@ -68,7 +68,8 @@ Example of Architecture deployed on Azure: To install EcoSonar locally, you have two options: -1. Use Docker +1. Use Docker Compose + Run the following commands: ``` cd EcoSonar-SonarQube @@ -80,10 +81,10 @@ docker-compose build docker-compose up ``` -2. Launch each component seperately. +2. Launch each component separately. Follow instructions in both Readme file: -https://github.com/Accenture/EcoSonar/blob/main/EcoSonar-API/README.md -https://github.com/Accenture/EcoSonar/blob/main/EcoSonar-SonarQube/README.md +- https://github.com/Accenture/EcoSonar/blob/main/EcoSonar-API/README.md +- https://github.com/Accenture/EcoSonar/blob/main/EcoSonar-SonarQube/README.md <a name="ecocode-config"></a> @@ -91,7 +92,7 @@ https://github.com/Accenture/EcoSonar/blob/main/EcoSonar-SonarQube/README.md ## Ecocode Configuration For specific details on Ecocode, please look at their GitHub repository: https://github.com/green-code-initiative/ecoCode . -You will find here `https://github.com/Accenture/EcoSonar/tree/main/EcoSonar-SonarQube/ecocode` the EcoCode Sonarqube plugin that needs to be imported into your Sonarqube instance. +You will find here `https://github.com/Accenture/EcoSonar/tree/main/EcoSonar-SonarQube/ecocode` the EcoCode Sonarqube plugins that needs to be imported into your Sonarqube instance. To install the ecocode plugins, please follow instruction from EcoSonar SonarQube plugin : https://github.com/Accenture/EcoSonar/blob/main/EcoSonar-SonarQube/README.md When using Sonarqube as code analysis, a default Quality Profile is set up for each language. If you want to use EcoCode rules related to eco-design, you will have to: @@ -112,7 +113,7 @@ When using Sonarqube as code analysis, a default Quality Profile is set up for e ![EcoSonar Default Quality Profile](./images/ecosonar-default-quality-profile.webp) -Do the same setup for each languague you wish to use with Ecocode rules. +Do the same setup for each language you wish to use with Ecocode rules. <a name="audit"></a> diff --git a/images/delete-login-for-project.webp b/images/delete-login-for-project.webp index 688090a381cd9d2f2e74e780188c244e13d3aa85..ed2b3a41adc79fd9f04835a4be49f6fd71c18e05 100644 GIT binary patch literal 15070 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 literal 14548 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 diff --git a/images/delete-proxy-for-project.webp b/images/delete-proxy-for-project.webp index 37e424d89a19ea3316b1ea85e88967770d758020..7033aa68b143089e01bc6028036c46fe127357e7 100644 GIT binary patch literal 14780 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 literal 14694 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 TOaTyLx40z+boT-BTA=?2ZE_dA diff --git a/images/get-all-scores-projects.webp b/images/get-all-scores-projects.webp index 7c1a8c62e3f86c2881d3efc491a8ff522d39f54e..695ba877131a0bbb801ef8f1951383ffb0dd621f 100644 GIT binary patch literal 31794 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%0A^WpiKMI8FOP@nGq7iL` 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 literal 29772 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 F008S4SEv90 diff --git a/images/get-average-all-scores-projects.webp b/images/get-average-all-scores-projects.webp index 45185cb32e0cf7a3ca2fad174d6d3f44463e6370..c920920d971b03012c6195e97a72080a5cdd4b50 100644 GIT binary patch literal 22684 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 literal 17336 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 YtAS_5pW}GR35NSUhL;+e&7iDM0J>h|7ytkO diff --git a/images/get-crawler-result.webp b/images/get-crawler-result.webp index 003af81bb44cb8f96e84615703c0fbab0f6c91f7..98c726d2789b5536d3950f3d50844932c6056ff3 100644 GIT binary patch literal 13420 zcmcJV1#lkAa;U}3%nTM;%=C*{7BgGS%*@OdTWm2ivt(H;i<$8kGym@-=T`2mBqzDa zd#`3|YqzIswyU@Mo9?Pnk&%=%<p2ZIln_<YP~sue`r{d`7yLUoeLA!-gwUjUg>vbS zqQU}otGX-vC=2@!vo3S(h7fQ;@7b~In3sgN@5c!MR5>_#42NVB3d4sla~fvP1d#?= zeqW;2IbTFT?Q?6hd4e#fwI9MD(Ax)mZx!h1f#G)gJ_i&8)I9_Tfr3*;h1Y!aL7MNN z;Q;n4^%uzA^xO{+$mJckEMNkJ7{LF!)NHsNuon<{&AmsH-?MT%{G7LRd8dEOm;Q|U z7H}jO*q!}y<Rko+xAQLk_WDM9Ce?>}n{a919ng5C^UD01u(lP*d~CQ6G7lK_WeU&* zZM_G47oG(z`mgvx1pq*huej&G&KMpoKp+rm*yRQ)=;7P+Ts@JwR`rdU@sW%pCq^;i z6eyGQmh!_iU?Sl;3B)FRDD^h_|4=l*j#%6k6JkyZL&iSKZiEiIeMzZVx>`*8Vx<fe zI^&D<RCpVQ7qB!0qUC!V6>F1`*SB#k;h#WWg?3{$-e2jI4dSd7A@$NFlJw#oqBpjj z_B_H?L?wM>{6N;N_6xuV+W!7XHH0bRYlA-oO$4$zphdhL*JD$CIeQuR(OGP+w)rP+ zO2%)WB(S@my4A@nO7nqXOSqEFZA;=Ybp)~NX5`qW6jh<>iM74h528J9np@GY*M|NK zm&1Nfe~2D;|F1>CNmL;Y{k-Q<VD)||`J|pBzj6=6!op&X-N0T)xa1${i5M9T#mZne zSsN_cm3E9xUWfrg*KsL=V-bjmxHG5VkFh*#ndo;^8Acc;mMDzoTc^lUX6c`f7dWPs z8^3DVA!Z`xcWT)b4xy!%RYAbrNGk=U5@W3g1aJ7c$N<M@dl=tHGjRM-ClG~U525oy zZXu@opMxy6-})M_{Ef7qgjxPjNPm%i$Wl40G{i*ao?{WhI5{m`P6q$9C79+Nyj8m$ zm$&DqDIcu|`{-(0qaw0GPU(JbdgJdG8_5Ah2q-@%{@llv(>g#vMMgT4JYuq5;hi^Y z28-w&z7lOf5yC-}u^RoYEua0KfEcU)3s^s*<62g(G?Yvu6$I5vGB}3qFR&;s(?IcT zHUNb}CK)=-L?T>@`M)SoVvnZVD<M?*^&>kSSIvZKT?{1A|7VK-Zl!dx{4%4S2qo06 zucp(^1p@;k(zAc*U)#(JH6AUke^ej7;|ug7PuqX%he4*F3AK)WGaUr8`{&|K86kBx zd%3nNGcS3PFrNR{b}(DmsXJ`+dr2B=754~Pv}yK?+Z8+r)sMwj$A-V>03$@00VGL* zY=?N;V9_&hhvBd-?>EUrwf!2*kHCSxtehV|5C`RsWl33ABtjfU0C)CjM#@<7Z<BW3 z%^iuf`T(Y|4QkNg9YugdQtRVj%eCdhG1^{rZx^~10Tk@*{p!83Ti}pZA8VkGtiQGH zlK>MXHz(5@2~JXWR@w(DqV(jXTmWoXvH9VT-jIRc>@F%>{X16p?d9@Ro7o$DjMxy` zX=O|rS>TDi&rJeZSJd(j{cM_}l4a8)@+>fG|3n_@%uj0GH?r>T%9~xz%*+yNQ({dD zHg)&x@A*8^5^lBgY`*^*dAv~M?sazReocwHT+eav|8sH&Z#)~aU04d9GLsOApbWoB zw}EGt+twjQ7`po0#{1{+w*%4C&%Gh-ARD0SHDCIA!_j<3WxzCs^AAb&x?<V<e+a36 z7b$;_xmZmKeW{D&FrQ+koXG(#yRo>Z#0BWa%r-gXcI93Sg8UX2Zg}HXdhT5@HJmB) z9Y(GL$v0{1;FXDW>hSflttezAUEb`_y0veF*W?w57VM5`gw93&luFbV7yf|~6=#0? zkc{|^pvyIBm1Vea=ee8qDmb*-{(>J~*pVAF_}#J(sYbmX(8A+>5pnfyE~}%Rbemye z`&Q__$oMbBHpEIZ`yDAmFmy`uK@jcPawpL{Ji$}Mu;K<O1QnSulhZICch7?6yr|fp z=Zm>a=0~OeF~k201WZ|sBs(PjMso5qE`2v9B&4qi;1_#2Fl?kjm+m(@ulgOF@bw|? zMwhju0C$|93dWG}ED_(gQOV%os&w~1fytkr5}Fq>h&K-LsNqWmL_O>JK3T^W0y0~J zG`byyH}$9HqZy0_hD4-+9Ff-BdU7GgDoTabM+`#7N8%~KX~J|h0Pf;Wfe(qqzlMM8 zZPj1?w|`{?WVXx8^4r=?|7n8RYV|00p*l6$L5w<6{mtlgj~7Ci`!t~W8aIGEMntR5 zxVL>%O7G|ovi_O*s5nl%e`4@2oRl*i$Gq-U6b`m#lMQyC#>Mh)fuBB*7xQ0WRh~4T zkT~sMvZLh>xbZl7V%+^p5(^--9R0Q9gkk4kk70gVwW|_dsj^@Hozz@?pXo5l{u-M| zq|CC~Lz#bAsr!!@g#_BJ{8u?((vD#h`;&8z#^)OfsiV+6(%-h7zhjXo_}})TzYG5r zt&Tw{B$}3U!akGx^(Fp~*}qJFVP!`6wn&8AvJL8y3&WsWi<<4A<sDgaPwsr39<>qU zzkUR{yn-1a_sFPu^iKo=?S1wUN>l9r0cuz~!`pJRe}`USxPlgRPs++R{8k*c2CWg) zlCek0I+zsnwS`~DLRBx`8DDb?6~xi;hB$0bSVb66%|8_!-*Zv>C8#CVVl2%0=Q>U7 zAhk-hdm=>NcLk767=2*sdXjYwUq%~6cNx*x;Li}5zUb6GpT($egaI@<tU$>R7w9dY z$w`g;2334#>Sav0Nf)Q#g;wGJW+NpM?~Om0w}1W=w5Jf`i+`oVC$3yd^1wmOc6mr| zDk?arw$XB$a<JT1`G5ma+vawbbSVPYqrF1L_H1DqIDYUw8In28T^i|sAlm9Zg-QGU z;FA5Sf<KUOYZ=r1&oT86;BKrgzifZ3eC+SOT$42Gj#yhlg@6y^g6w|1j|#WAR0Shq z9bKDc47vF5-{?e!%OI|RrYhhySi;#Ewji)i7RzQ<-+#f9X{^8ft&I4K{JF9V)Y<cg zPwo+A!{{!F)g^L+yS=lNGj+7o_+KHFic`e)&>myZUd>@ByzCEJ3t8Z~dZSP&bHd51 zV=rysd=YcC+Y|vP4LhVia3J(7idyau$NvJ;i0xSKOH2^@i}w=7cD<<Ed}zz@5~$_6 zNwO+`Tc9-h^te=eQbPEZ>LjWA7c}7{ZUBR{L(tC6_pYZ@PCPpsWb2-}zpP*W1GHH6 zqTCPEK*|~cY$BxpSta&YE;Kj-HYUZHteE6~DN>ow0?d|wf3Kqh&#N=`D#s)9LmD~i z8LALO?acdR$a0MUHzanT(6Is?5Yl>5-cqEaE~k$bxNcK!ne$H+gMXSJ^asCF8>85$ z61U*~p;G)S`~Izzlqb#Y*wiF|bt0J$^4j|U*nRxj$=uq4M&D|-!9MB`?9sT7lg00# zzL7uEPJ9AxPPqx#%uw1|pAWwKt;7BPt`aDC&-DlcHzb_((}Wc0o3@5^CUbymmxSPc zLVLEMvCq}(=9=X|7x!7lk-FdNRmS8~Tl0jR6PJj4-izZ!*>r{#>d>IHKMjG{HOp_( zsPM!$d5(x(<6>b<Wb&uKniL8xj?$Zs?Nv_skQFY~XDeW;51c{~Yi*ZbY5wMv3dtoy z*p$u24kJj)q89PSTo{MbWnoQkJWkuz$MJ0DqJwK?@YO)v8A1^+&r8eq(IR262M7SX za-Ii?BzE8|bgXr}-E&U-?yBEUux`Tdi{a1Gf)?u@s9t_nwuTR!R5+JGJ1Q%Hx6rB| zH8_H#L6Rp@D0h528KwIQ)gK5LvOZ2xCaQ5tt4{vC^L)A`nF+k-;x0|%?WeJUtR<J* z&EAgtN=j&i6>XPTq&FFg#TdBa16ZY?ilOMlB5Qy4LK~Sob!sa_B9uKqSdDWU(-dRU zuwZ}4h!tJ5b-Wp-q~>w&Yfb;G^8=d;Z`ceXuPiYZ_8XvjJ<jcgQ7~8uF`T@CZI}bD z5WfWK3r>S$6*5Q7R;)?TNB&M&zuJd};F3#OE~$I|isxJ|S>Fb;M@B@CN{F9d9#q1% z5=JInXC-is4P@oHvMX&O!xH87wIl)Wb5z&>JFJ`~G?*xQHG7{`N9%h>7Gc(}EaTck z5syy}uu<lQYKG-$nl*f)TAJWpt8DbzB?K#cQzoQ7rD;K<GM`61HwhjIVQfpX@Yj`O zoOQRum-qs^va8b~<nf#MPqJtPBh=+m#?jkS-1+K;T@24UjYW22>IVA&czgLN1QJf% z#|mflU{Gj4hQ5u7mGwu%hUmhW#R0trR_@9k8plaVsAEzOXlV-H%qD5(w<th+OLven zgBE^wzN7Pt{N<n`D+dMgYHr=6LT_RQ=FB}VF*_e!Tqa>;_NksR+17+T96KY*$5S!3 zFaeNEFn1@>-GKf29nCZxyh9Lf1lD|}3uIRSM}J~U3cu;@q8=QZt<9ZWBV$yb)fb@2 zD|vjNXv`L`vC8m*O3iGUMWV$%Wn-x#fd0#dL~;YW2fTlh$Z&uEy?XpLAd}Pg{FP`3 zPjk!+DS!d~1ojnWC2BLih-Vm&vs<_JrC6m--0TqtMRF(JiaihO))Dj>+>jp7D=XEZ zaj;F}at+WU5&OECR8BJl&o{pq<UN?gb_8rM2;<5VHxCX&$_dbNu&e&83+PpcVAsav zp+pwX5K`?lH2NmC?*|Oxgi@kWC-AavBhKIbMBXlc)_ZaFWEbmP2I1dy6H9K!<yiKm z!!U$pJ~8pZss$b>d|$5u?lu@$LGSSO9%X6Msr{ZL?*bT5W$pwk#gFt0QI=v!Wa1Ha z2$=E>#<DILM^%&f;a-(+M;Mzw61ZBk896C8z1yE*gxAntKF{A?(N_fGtWHp87Kq%G z_`e*IIKSic_O)<f1J13x_2cgb_EG{lc;siGUtY1oel}oze{f+IoF}~!EMq~&&u9;n zx`!#tw+XN#ctD#Q8dhSomJL;VB3roKd7oSs$B;5hH5lrO7?Z&BJ(-MjE%ZtV1-US- zI=*m+uS`xtux+!l4m#N{N*?2WbcD21D%OjdIn>hHPHK7k_i3I}p`IRd<Ya!Ul-v3h z*Rauy;(IjpKf3(b%nfotzc(de5}1DM1i7r23h4Qc*=jgTcRuSw+#af$G$u=IjUD6W zv1McDB!B+U1av*8E?4a*dE9hBA5D}DTTsRHew$$yGUH<4rP6<^3G%w7tJnTTae3g1 zIGw2wJtc!1z>sh7*NZ0Y<Qk;%rfQAjD9K);)JGKr2aU1Fho+sSS23TQs+WVHR62tc z+}sABHWj=*l{J_d7bx5_5L9=v2auu2uDH9H>+x!YhcBCbyFQ9RH&&1LU*Df4PXeS# zyFrKRpd&_4P(Ll5xhqy^a9&n0IgC^Drqsad<#NQAgj95~7_hQ^s@|YF6Y#I|vT7qE z^g#C7&SOZy#tf7Z?HaFnWg2v%8udj}8RVAtQjC$OF-*=2_psK*khXgXe1j)g_(2Aj zD^)>T&g7H{pE$5Sg*B9<JV$g_oVSh1-fB$CuF6PGZ1Eng-uAeS2C{jGFN%GY>c<1& zIgLMPF0QKR0C*G^muj(aEsm6Aqx<{6-1JlcN;qEF=~wuY?Dk%itl)zak9SO9%AQNt zfl&M6M+ZK{Z75*z$UG<9jP;9i-D1WcO$efVa>CVTUpz$8SK@XDpVGPsLstoZ;Qx9R zN#R)HCx_UP`k>0q2HC&C&%n;3q@PD2H&bBu-X0?}aaiioKohgD&z8j(=h~ta%QxFm zjN&*k-3{*=Wa{xh%=Hg-QgX6GMID8A&^{vILAv+NMW`ZUkWK`q*5!u)!U7(1Tm~}h zD>RRYAX>v5V8ZWUi<}R$ge&x#B@nAn!0+W!EU-;xz!CQtDrfKVtavotih85Q7ao@1 z%l6;a)~IDXN3rVyUcE0@6?T6quX#ZiCVbhmI2|#q+sCzGY4C%T6pYSg&S`vSMzUHP z6VM@s6pfMCicoK0I}~`srOugQKq<tyk~VuW50#8b%S}zU-w*QF!RbAwFJLE{DcHya z27h;!{`$_y!GY~&6Dgb)%<Z$5Gc0F4V<mG12oY~<!xOtl9;wi=i}8TOG?PWI%LpE2 zZ{1mx{n($m)%`ij{0{9wX5g&L8N%Xx(N8=%&4$7&t519iWPnI~PTOrvao}Tu7Sv2l z+7g>As7bpRlQyRGpB_D_F8`8yB@Mz*PGIBJ8l7{I<gR6B=&F79vkIF~dNZ=p`4LIW zuW0=8=yMIR`ph{?B5WW^8RW^Jg5m>fyzHBO*_x6l1<_vQT{v^!r==}2Y39OA2ILGy zC7|t=tG;vR-88*8oNqK{tJBwfckeI*QJ7NPKh|kujjGHKPVmdYYWNL%Ui;L&F2X?S z6FFuI#`UqiO!rf!Yfm69_bo(F^XSG<9X!(G?~@f)$5RAN5Q)-AK|3_?KnrgPR}u!P zQrqpsBGaD5jo5H{1<IY1%0hOD*aP~{CeFy#qy~<}q)uIM5F+3EKll1Z(r1#L`%#Uw zB2#BI6d}=!ZI?w8K#q|6RjRRO%ry1OnmL{HXlipr76cL`$`^Q|XB7mr!dcL=wQn-J z-;ICISYcDUuOMT$Xq|2>_TN)`3pF}ZeIj32U~H$D49*H!-_%y~bM{Pyvk5*wF~kun z)g1YbZ*IRVU`bP6{-(;G7(xWNbvi=uQIU-AYwN;LH#)CnAn9hE!?p+SP=6Tzo)oxO zODrBxsZ8TMEY1Hxi`M*M-^0@hkl#OW(yQwk-(B53A+elQ=k7F%M%#EK3aFl_;EaqO zTLOdD#a(klxcNro4S1?pxeLobJ#r&#B9UQ48QVJ@mpNf!(oZLwjHuWvvL|WqSc;EZ z_Wrd_mV}=tjaxU%P{&!|gN)G$sq^2yT!py3)aM;$YpIso=y~|+QG&PVG$DTqlr38f zKZOd{m<=WtF>vuZ5v6nW`EzW1dMkS^4V_+;jOh8_jV%Tp1rjuPxt#<+9e)>Ijbq?& z8ER357=F`xWJ$U;=0msF(s$2~s4u+pve#OjQ^^|(KQDNots^Y<d$8Kd-MQ#~WOeNs z`l*@&85zQ5ks#q->;c?Q47*}eVq@^CCrj#R)u>69+<4rWg|wa9cCdAK*TkUIa`P=n z<w5Oi>8J(EjFA0u38cqc*3D(7ny*5b2psMz=UezP84hm^>q@Q7n<Vk$?SX&TIO;<@ z4|2P7TQ*1`nn%W;Y?}#{wL(i=<%QVDcv&_bOP#9sxK!c-p{XRv^Wc9C%40escijDv zt$8!eJvZvKGmvt1mUmXYKvn*UTcvJat@n;b9ssF^+7n>Y?C_pD7@3|JL#&||YB1W9 zKN2KyBncdic;m54@bEXxgIJO#?SWtw83|dC?&~g9KB|lI1E`$|E>p1*e*^0#4ZlA& zn9$$D-hYu_W2nc|fq&`eLoYEe^+^{TYf7jK<+I>djq=U5_~AIWyzz7ILheILJ31s# z%+uN!)e4Ygr*7ad70;FD-5lB3XA?%va{;kV<?{*1ZQsDpk4W>WV7M{*HTyh$eap7z z@YU>*dyTohXT@*wVf@13{z$*N@lASZo~EYAKCupK7{Vj-;Ja0V+)oU`NQHog+pJzA z2CECqhc(fe@}K##v^0tBu54Cz?Tc67iP%#i!B@~%S89x5EUHhmOCGTb=Eao808RG( zL)>Z?W#ZyjW%h;hyt4JRZ(AX{ueuqvh|WqHxcWDUYN!2->%mlq%37z?nyB0R-)h}O z^3`*|z$2rnriX<UucKiCvXBg$6R)gWB<Dp~9C470cW=vxZu0}Njoo1iEl+I9E<9wE zE_nxw?G5;)x^);lyR4^WvPXR0v6RGq3teNic4dZjI-Wox95@wOG0C!_8J+u&^HyFB zGC1{6`^o;`pv<~lx{_?U>ZbED<%ow}w&TK<X6zBL#i^{oHyC3zJgYUst9{UHh}C>$ zSdnCS|8`b{{W12S91Sw_`7|8R(4A`1yYjzRlvqNOE(X5%rJ5XmUU0<Zb$I4Eba{Wv zl~kS8L{t8<;t)qf$;6ihbKfKCLH@wzNu5)%Z~?v(jsK!eF61Bo1$jIDx!#K)V`%Y^ zj@euF{R_m>sV7daYG3n9E_Chu6_bBykj=e7I|6t*(aY3x+r(w>tfBjo52FaD|3vo! zerehPK9Jm|ZxFR{`*JXzsr4ECm+y31jR~m>gEL(iv7QanZRbJ+0XY9#UzJ@PCbY#_ z`lw*`m7s)lbH5agtjhAs?*oTVq2O3Qu!;AG>JWuI+UGkO$CFFNoe0~_IQ>VsH7>Gg zZ1%@Yzn$p=zkZ9r?w&nIMfFKe-nc2Imu?(ma~pwUZ{fn6LUWI7ztQ1W=e&mW>7$qE z^pq$-_ltjSe51rP;;P+jL)%%P0-nwAZ^{|AK%?^K*CN3dD<k$ZUR*iA=I09NEcFu! z9R2ue7zBa%`<)ua+&H;kuzULw<^<&_zmkI9Eb1sx4SLWY{D!1Ua=Y!u+4Pi_em}yX z7K+s^^Y?9qKz~UjFE;3slJr|^|I|TZ5pcvk_i#y8@Geg5kPb^r%Ca<@B{(ePok#=W zZ4m0w)(me3Ulo!Dj*fY?%gh#|HLk%eJaL%Cpp4hXb?yeR2cQoQOoIze8sMY9gpZ*b ztcuvOjfZtnF)Pz9@4Zksw{w*Jl+0kBHn#*eDP_aWW*ChtlL5ZJPdIwNmi!fVM5^Vr zS!(2k)%uwAvnd{=<<In2TQg!FEUH+1@PxT04j%AUORIF@W?NCP{iyEoY;^C?7&ezV zCrIM#L0P^_a%yq>=oQf+_hq<|vk%db_uus%@%|J~w(!EbW{!hj#XpAenPZ@dFFOvE zC9GFPX7RrTX+19%3q+i&`q?z^hqfe$A|g4eYnNR-6E^RBS6?C#cCDn4PU=b<z*=iP zyQ~__kZYO~A2eV05{qw?)J@_0JsPGs!-_Z>XOUONL^v&u3S)hfpXYdE#%lWGd6m8B z<EZH4EY;n%c$h_vpm^&|fs0@nv1PgNdqDDsFkK!*aQ`(6zv-Mbj1eQZemGqPam<!H zZ*S#Z@M#F!^Nso@?g)lF2X5ZCy3{5qM=WbD8M4UekTidQv7)QlvG~Y#4~x#>b>~Qb zvM-aPx?dd)NV3V=2VswCOdQ=^Iw<I6f$^?GrCZ#H#@0(=J5XDIwgTf|)5}^&$9b}B zmcx?efYz(frtPJUW05;@PI7+xnX;_>==FXD_v2VA(d`V}P=NST8i=?1!9VLDQ)H+3 zU7@z5m95XA*r<suGb5<f^4O2hn@G7A5NmS5;W2p?cQ8f^6Id$u;R1}^-rbNAx6g$? z(;ej}j<2Jeu0`rdVWd@-VE)ZtG}RpO(@smV+pLap&W7n{P5od$XoUU@AQx>=1g^~b zX}jlk6vrXpJ|79dl5K?WO%k)56YkW+SrGFq8pG?bQw{vVaoI$z2&U;|sSbcUno3>= zH`t4|$W~kOreavTol27MavOoJiA0j9P-mN|HlR>T75XCPB3)&>4*McH0LN3zydXn? zxwbxzK@wOn58bjWN|z}LGOgI?<<@|fsV7I;%IAFQWKd`}_r3Y_g}>7#Bk~#*p&>)@ zzJYlgCpvl_d5Av#MB0Dzy~N7nh&0Old6ts<jfZ^OcSP0MRi{wjRmq&{&Gqvzj<_mM z3)YAJB5m2n0kl!1_$i)GpODeoxdh4X`T}&0&o@jea5$z#c9<7<_zArd5&rT5w?@rg zVtVXK9*PhEUd$>*EkY(ckp#PTw*MlD@JR`GKjg!;YEuJf?u;5E?^lANb@}dURV$=K z4yVT^1}vBC6LtkZzYL@;y-?m#zZPUbj#Er$&Fb~)!xkb2ia4jiicI5^HwW3MM<o{6 z3`R)2C6U!N|66(5sDN>LomY}UhjpGsLZZd&1s%uZx|VWyM!L%*UgxV|w6wEPqND-a zh&_GaHq&%u!*ZI@h-x&Q`B}^*L^~FHEDCTP$tnFe!ocxcZ~~wC0u3p>+xe;EoQutP zkU(gr@ngtQ>47QA1i_TP*OAqok);8e4Qn3*QNJcmRe0%Ow*(7pVJ;LxN)z#ljRs$# zC8U_%c3cz3XtAZ@xXv@~5|9UU%^~`Oaa5?(7pRrT3+5gLgfLpVZo?S^0L_Q4(d}nz z;>W!)f#kOtV8oH#md#N=Dooo<Au<8*H(yBz9=uo+kbML)euj7F9jmuZg!d6wXhse% z-_X^zg^<8`K>F2M`ji>fz=N5H5N`We0;(oBrKc^t#~vssN~u~W+jK4DJ?^Q5R>2ya z4>OgAR`GMB#(&i9O6;fjts{jL?+qvI`8<>_@hb(F*<2|%lIy|7ot#b<XiMfYJC!!$ z$8M4fP~QHi`XLmdnNx^j0gmb{5x+<i`_gsW4BH)vDJM;~qc&0ni?xJKGK(`3M;wuI zo*^IWQMJT+>}`4yLwKGn@8*&psl2-cz61?kusqJO#jIJ`m1|n;r#s`<yLD;$mELCv zUo2c|M_Fw^R7RD?|2kx2Q=n{F9=g)!GeO;oYbPcT#*$AJMD7Jy{xj-g;TQs=s4ROc zoK*!S?o{g?9gpS1tA5)-rpqX<clalK7qW+l1F{cMZ@=5c-HayMFTrd<@|%G+y+OZ4 zw1POA7K||@kO#;gv}<v-pfS(14HJ7{J2D45IQ_;Oehy?M*M4+9>kiM?sWn5eMnvVs zhDDkRG&vcB-`3O673Ary|IxHqH^5SaxaL?i5_J|>h4uxGq)OXJQuWQC-nfQAQ(6O? z2~@@0h1m7AR8y|-zrmz?*xNMCdIuRJZ1%*(uqQUzw+>Fy3dlidBh2&KTPzwd6e9K2 zp@<;($Toeq)o11CvJcS>d6FK$+L~tp9U+HWU|F#G*i7H;BScC$GJ;HxGVn%lif_-* zZX9rlopmR*eD94tj8c<j<@ofOZkzWWWtg$WovTS3Jj#sQV(gD-sdW<C*`ys2x0*Mc zWx1QlY`cgLQ##;mU5;5ZStX;e%9rAF{KP4;#$;JqUxk#wg8U=5vifR5-Eot)iH*7| zcnJZVBVgctjfS;H1%akjb}W4QqxND>W@;UC>4Q^PA`$Si5)a5G@!okb)$U>BxSIu^ z4*-<S`}D05$02gSuktrxO+_||8XTjvH4p^ET%8TAj?H_oH0`uS*yO@8VfZWG#>4Ez zPCYRfe7x)}B1B`)#!l48Z|JHGhY-%a0+=owXM>=DYNLLxM_&=wa|aN3@%p%CJu;vu zP)y~plGCm~q{BFAwhEFJq#G7uA?<Lz0!7JDq*@aV#i+89%qsC<RzKf@g^Cg-IFR*( z%dk;I8BK`CFlqg55wv|DFX%fqnQ|PR`arwFOBOhB^3jJI#ADMG6~^YTU~3YaMre^@ zN$2~xGrwqxwXH|MTVgt)DVe8Z%DW7k+>6IN83wXW4OK!`Hr5dn1NA~7_Q`O`!P?=V zM+M)^FeZ+h$hB0#Caw<?`%(_lFD05!B|^y0-$s12fsIf-H{d%%V~i}@l?gQ%R-VcC zjL@m`j3&YebpZ~GaYBXiP}%cU4-uqWyDSO`<#@gI0x_ha5y&TK5M!0o6vuPt$-dw; z($>Ph=0oGDNF?!%I5toRnb3n-i&m|g5tP_kNqQS;f?_nbT$1CB7pS>Im$+gUaWDp1 zXc5)9iqJuoJ-&#aD=mkMl7F$3Hip4Okg6Zthz=biBD8)(rK<!cxdtNWf#)$BLMifm zb^@gt))$%NClxp1Iu>$4a4}h1ccaOa=m^lbk{v9qfj@WR_=~{y-YD3q<CA0*Otm<% zw96+1&5a-KM|<}TTy_2~ozgy_Iv5>kY%3n9htY5Ufx9kVI(gpZ9e+)?W**HRR**l3 zvo%OlX<YpTzz!#257+|VgVw6h;p*fh^?1D_oYM{-rhA>QpyTQ(eWIwQC+bDjt3XB4 zL^!6{{yswIY<9Arm0rxfxP7YR=S)sZeC@_jfbV(O3RcnRSn@;!=zVOkCc@*8eQ2w3 zXfbs0YxsNP<!~eXG~{E6v2A+5PdQ*tr(36pj5KhoCl&4fbGNkVnDJ!Oc9KW~d~aS- zM{8<h01X?I@hzgHDQH@y#<d=SB8-MW>j$6Wa@6ZX_xM=6=gaV>_yM$A+&Pv{qNZh{ z;Uzeb88^pN5SKx`B>W&YV4*c?7K*jjQ8d<6m^L9%L2GO$%nBUm;QsP%pai0h(ua@n z!cSzAR^#!K050~{Pdn>ep^B@3YGD*yVC&huHThtiJ}t#R7gU1~ST$D&eJu{(Lvpeo z8Sm62wDCEB<**7kjd@wUys`SWJAYMZrMA%cOyRDW0t#(R@hziME!j3?6t=!?5u_Z{ zrY^9QuOBQOwyFSm$W!By2Nysee2I*}$OVNs5L8s$RYW+A=Hv04A;KZ!$O}hzfcrd0 z3}5m2pLuTw_CiPyHR~Za^phT!C=A#XZEWeu!}Qw@v;7dU@nyZE1?DbK7U9Cvt(_i| zTmi%xzJtq=^fW=%mdh@a;xdq@(=Ty!ZB3F7smDk!liQDR8&sx7iVzgYHm>mUT!_T# ziIUMu_}$YmedQ)z=jp~vnGbrvOGm#`<iA*j7K0vt(11lWDS|Nd?^5|Kt&Qa*vtwi( z&X6g88b+hcKTb)j_<Lb;6^cyv<|}CukkN(k@^b$J;??HBw=E6v{e${6r6{!8j+?D2 zdSn>6`GFB(>1ci<-QMu<5ha7Xr2H(W^BQl{hW<U!%>O4I(F`W$PuF7#;K7}m4K}s5 zLMq$52R781ui-?SooXQDw0Y&CPJg2^TaIk%drrnQd#?+=^ng-0;$;+F+(5TiOsDlE zUlqspxEHscmU;-NXv$Z7O`mGpy@=i@?BOQ}faa(x%vBO?X<N6H0o6qbhciNz^p@e8 z{=>yaARpEQI^tMLmvm*0S`f4Qy9u$JcSdCKva`mLZv+=tCVqy1_FAG**6mBWUqM<X z`Q3R0ec0H{^ZFFIUH}GyNbjV4Jd3Ur@uYGIRrmfW+-8%9{_jt6yJ37eS>AG4ZdSx0 z{ih;>F795;`S9{H<2N2fL~YZt49963B`TEJFqiFP9UzAD5fjR@OVdHqV0lia)eNlh z*(>&*==Pmo>K=10=k|pe-Ij72bLAd%Y_aVrtYL1Ie#@cV?(x`NYcgML!ztsns?}bb z7yD7zmcd^XnT$x1qq<(%Pq)1^bu3#9UXao4@CsRcV(eN&TbKCnArK3H>J;c-BMy&T zh*HnAQFfUv8-1435RQNSSqr7_F<Z-3S0GF9e$iy;U%U`~L|u$SPVM<ZFAkOmI8l*F z4tc>ZJ+d;U+@?Unh)AR7M}#@KNjY7b4y@AWQRexXEkfLR7lt}vq`t^na8Z<P@9X!~ zZt1{d?sSu_SNgSnNKu8=;+nU&ZPMsIBqjmA@h3045kWnOU*VpyK3ZVbRMK(PQgdUr z?|moo0E1mZRHt##FwOcoweI8E79$2lJs@z&0!`!YC#0bLD6MU6ggO+439AEWoOSGK z07`Rr>9zw=cbhUDLaT2n{+a!cbA$*N5HR0=O&a8ID#@jMB?E*uI4D<CpA04Vu$LRq zj)-1ebG}{mB*eag0(MQWA33N3W`_+|Tr<hrWc5Br;eiK28p`oSDP@W?ULMJ_O(HN^ zVpT>RV-vVv9eU1=MbxoND@rpO{UR->rb#$m2&iEf8jbKvLV2Yieh}wBi}YAQyKEre zG8OCjk7Cp>M(;QAlxePxOp5467#^bEYeiBo8jpzgWF~^T(jkITfxmwt@~?psb$ZE~ z{Y9+bf)}2lD{l}r_py7^+iE0No(UCzkOagzOHD70pLy`k;-zhuo12_;CcqE9P-`vC zMo}rvZ9U&3^$QyG6*zk9RTQmp6;F6pVJ)KGR_N+XB3s*qC)cSqc-XJ;(ww^77gd$v zJUsPcX*^5{S7nB!hE+=RM#Y9*Ww-G}Ag^ga2jDyOi6RHQ3l)lH_h5+oTJ!`zjSt2- zm<1ek`wAAqKj*2isbt>JRj%lbvF)OsKlLjdZvUu*V+A{;av{YL6x*UP#}jp`v5+Be z@u)?Zb2L_DuZ@3lxD_ce%@c%O!YN@HzrgLm;(s*JHXIuz@vxHXSm9yReJr&rablQa zse*Vydm@@2UDWH{<kbrF2zcoXTEj~C&^*g~Nh8a7exK&1)7D|&C@gO5YwUp#_d-?( z0_-!EgUueN=@PZp*dJSsUcKgURt_JOPJ=T#0X}Mu#^~?2c$o0mkq&eq%&HJV#4oFX z-ncASJL&n10OK4oy&DOL->AfaZPC^$3v>ato=oBxO###nU?pV6)_x7AGPc<4ZdD^- zg>w2hSa8g)a49FvBdY%Ok3Z0S#B}x-bjbJPEf_!dlcu)26}a3cqvqzEd@K&8G<X9r z%dHZgM=lXUN^u=(!7&Dpp}N{>-29%K(MpZ?lGqq0q)W$)IzJBTe&}wgDQuL<!+DHI z4a_h>GnfgB8a1wQYjZFs!1a(ozXWn0E^Qmu#L6AA6gxXOAPYS#pMR`^#BJN`q%Mq^ z;NFWW<{*U(X~#q{&hJ@}MUaCi#4Tfct%PF%ToZwo49^|Cp!3VSSCSjA-fs?{6^j@i zpMhJEbNHHzt#1*`m<w^^{5-9ng%{I&rYO@He8^pB7y9raO<}oloT=d0B#XvbMl+Q5 z)f3DNQHIm=VtKx}{i;DWCJ&x?J_=D_)eg8;yuTE)V$|Ebg5r9vYO|D#f?)p*Wl;<_ zEsdU=NGV7r=?#dz3&KBv7R0HHJ7>ThcGo%l_{{#0l4+rI7iCN!?wfn(=#9ScWKeeU z_A^sL<%)J>X@E>!*d+_Q7}y{)`66cGa>_v}Q*7q`n`9oK-Pt<Bi_bp4#QOrNkE1lB zq_qvrTNY(?7(IQ9U;SnG0r{6TloeV$Sr)-(!=hUEZhJT5RTXUI5CaYs%&89_L7!Y$ zIzZ-HVY_Fr!q+3*0_Lt2#XD5Shl8~7d>Yc<0-cDw1R<sMZ9Vz59G88$tAZwx7HBI9 z@SGvhW!nq(TQ5rA1YhT%*uW#@_wQTN5CPL{Utfww6vCYiKJR&TaH6fq?@!b4*>l}e znOZPPWbF^~yiwvrKJIx++!WqE9Es{El$O4VeHZx(>|<~-^0sIjKtYXJ*xMpOaMc2K zD5Qe*sSog;8zp!y$w>m=v3WyTpF$4{%wEmR7?AtXzvLeluN=DlxY}3!`J?mUY1ecX z3r3B$3>2mo-l#c!`8$tNe;+|yvE!GmZ|I6gg%wP7>+;F7hdv#^rGJxR>#E~URam{V z4{}C551wKfKz2Tm5h|#-1016>*iwbBch`t!hp?zbCZ0gEe$AAd<aEr4+;mE_acx_k z*ltS%{kUrbAv3ix2T4xJ-UfB#^h#tB&nDneOZ((2g_-}n3GtaFP%q(ixgYKh<wHsc zkR40uTrur&$zS#gGRb*p(}uLTh#qzIpgc&c>d&0%3yzpvI3w&z)XaErJTqY8kpAf~ ztv*MRgykFv=!jBFMiX%*JephtrJUZ&d+UVhIytk6n*6$%f9Vzsl}*)Z6-R#d8B;%h zv_s4ho2C6Jv;QJki60Z~BjJB#Mkp9(j1g=jpof7FJU$eHF>yg6i}2}X_ft>)lm|gl z2jl~X_O~#iS0PnFvX2LzQJJ62cFm@`>%)Y$a?`oRXNB3cX8|Nc>i#l2*~O6<krSna zu#B7Lq@Tv3uaNu#g>VyJz*Af7?TbztH5?(VVoQKE3KrkzQ!(cF<DIQPMY<7elUlAi zlYkr3xZ1*0jg3VZ>eTqM=o#%2rEgzbW`(8at0A_DJ(|24E66`Et?j{hTFB({XMh<7 w7kC(7>trfSV30<(R8n@SSxo%*N3;IJxvk1T>OApo4D{CDzD5OSU|?YX2Vbs$?f?J) literal 14792 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 diff --git a/images/get-login-for-project.webp b/images/get-login-for-project.webp index d7b5f16cf0b052fc14167f50b19ea5bdfe152d30..efcf327891a3a356d2be33d318fb9beb7ade48f4 100644 GIT binary patch literal 14166 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 UbBCi$@tnBh24^8xnGxt;027lEJOBUy literal 13232 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 WWrKJ1^W{Cv7O7<fCl=@h0{UNYINuEb diff --git a/images/get-project-scores.webp b/images/get-project-scores.webp index d4bd8720bdd901c682641c97ec96311f8f91e4fb..1b82b0681cf6721853266c89bb6bc652a1629cc8 100644 GIT binary patch literal 15806 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 PAf&)c#}CgwAfW#Np$yv( literal 14032 zcmcI|V|ZrGwr!k_JGSj~Y}>YN+w9mK+qRu_+_7!jPTu!^`|P8A&%WoJKlgd&k6CNh zoU7KTG3I)zl%>SQ$JjwYG{l4z)fG93y8rTL=|FQpX}&?yfe9c7cW6~pl9T2qXf_0r zz*yJ=b^tveLW_JN&o>`=#{tt`UG643jL!iB0dZe*_n0Snm%wg-zKiE^-@3pBFcGM8 z4f(e7WUvAh<eva?ypO)-0l#EBkzRH_^9}>Xfk5EdBlH{Lv%}}kp}?O2AaLva=3?g| zpfe!huh`0F)3LxB@IJuf6$Ie$b@5F2h1u(H6JXB=$M^6xdfC=)a4N9d_ZE=)-1X%E z40s`Y68J0adE#B-eFsQ*C-7InF9bj=024U+PWajf1ipU0e8>at|C$86J^KU))cwuF zaE5-Co$6(E_RyR(n*<I7lpSkL^pyfzZaE(6t_kOWrhde{(eDB;geQcx0ewKjogrW` zKsvzvndL^}aOYe=ysz>zC;$t<2atL1yIy&pan&~tkaz+C$b88>6)i#MV;&k@_yr0` z1NVWV&o!TfUw!uhX99M9i2yr57U1TM@nNSkPY9R^Gyv8CbiOQlJR170X0GZQ(+;6W zHS{mOp7;ZHO}~;YY6rUJ2?6qXxp8loFN%Cxz`Dna_Z8sH83+(S;+iT@?RtRZ2jAE( zcITpnE_*{Y;uyVu+(?tLtrW9|IXq>m#?oDc{hKj5bF9+BOPnRt0Fy0Ib^1QW;#)6+ z4M|1L5!N)aukNy#3eTS(*(9$W)lsD$zf3s)Q@PSeF-{O~;pL%drqyMVK`;od==%Eb z#%P9t1b9>vjW-V6{C+HO5JPy-Kqe@VfA03qxVog*BUhgD7kxBrt>lrmVRMd;$TK@7 z$7DN^N76|d%b;i`4W*Jb{0{>t#`0qJ`QF!IpBb+kzLV~k+=uP|ojW^5W=^on)0~iK z?o20Eh|w&(f$T+(?CvjQGw#Jsau1hf6oew_{Sfn%+kMcEA_STM*WixP9eg~mlISn< z;hH31pCoZLFZtCeMVO&={u*EmyFW&A%+&j7W2gvBe?VG}iuY(7XoFY@KW3xChDExZ ze`0{V2W*kWZxko~dp_U!UhLnC421s2(|@VjCPn&uM&|$bgtwF&%fpQS4J7{+xln}) zzq9L?TF^iH<6#l5#0>#S|MxQf;f17|45kT>43^sI+*|kOj?)xXPy9<kjqcS5$t{Mq zIaT1MSDLt#*8OWd>QLkB_3ZM055_1@C`JYP^TQ-8MO2F!(;{m|4XKkfp#Sd&dj5aq zbiQU4$1QHHJDXvYuoy%XX}XIICUZ*>{sSEUir=xi%kSTDlRwa`VaQ54b*i$E9S^7f zeOvxZ26Iz|wOkP~oPBW;tV8-@(W-k>I$wZCGTcXZy1~}rZ@>)&=8G3oU)Olp*S0L< z^}W&GgQ0=Q$g>?yl9nTa{$wbTXy{}7eddP@!b6)-4ekuX-<%FQ{(FenP(ZPrnIT~B zmTdT;v2}1l@LVA!&fP;u0@+eZ6EU8QN%qEb{*f4e+YxAHUB$br7nu)nMd68NE%%sG zgNo<BcEROSw<X+Emy6{;5$Rucu!VhhiwgwmtF1xL@8b5~;1}t_N5({y{dX??6Y~8R zsQ!c8e}x`sd56;egNy&3{|~JBYxzZrFl#{*&g-d@rKbOra{nt$|E6|dipg-YS=J~O z7D2Fz99fQnd{EWtQry{DkV*>`gi}ipHI|B>kE|dx8H<D7I3Vb<=SDpUAh4xwOxr&L z+#;lVpqT>yHswKWqcbd&jbzLetYoDAGCG{%9|Zfi&pmC{WUx&l=n5ih$2k_M#utzf z#zk%12SLVPAiyWAs6cjnKc-)tsLW13c?^*Fe;ZDQ(WnM)oHWY5wk7(Ff^m6r27~Mn zj+k|7%KzArR2l7JdW8PoC&4~Aq<G+vWi4wVYzb3%{y8K5T?IIS;%Edh&+`e6#HZ*K z3;!>H{A+`1Vc+SZ=<epnav<Y7OFgbz{P+ju{!>}ArAr^*3h;<y%oa#k;r&nI|F;q+ z*hwd{E&%VaD|x1?_mZmi;V?O`|3<^Hf+VB`s>mhzg5SpwKxT$R=cx@Ni-^8?GZIxf zOOiNA_L2Xs!~QdV22qW8Ch{2jk^DLPbd-;1ceeP?4f7vJN&r#V3&C_rLV&m@VN9c$ z$lLeN3jQlte}(#g8GE^BXZ*b}|2I=x*d-;icbAV^=rd%;|F{3Fe_+1!T{H*?VEH&n z;4<K)%m+oMD6Q4E0x)nio<PB~Q{Iz-F$&kl4KBXWx}e$H|NY2W&_7na+Ny})LC3Aq z7IUK|D@p9pfG%(6Uu^r8zjDtjJNQt)3|144m7X?viwZA`al&-0*DP{#qu&Wv)h=9u zbETl0I<A$qV1p@S4T(9qMs`wn&5^6I)lvSVh;v?%6oFH?B`W1-<d=0=i+bA&JJFq( zP?vLtWRZisD!v6m2&aa_XM@g!ms98IDIW*Q03KK;1iiinJuTXq%n$v7FbFo*Vw&%F zD)jp2mk+!%Ay%P{n+P(TOrfu<B?&Q@a84ds!qvrWOn3OdrgI{FSRYZ#tJ4uMb7~$; z1qmxv&j;gMy36UR`%8TaU=S8zmr}XwN!sy7iOi#7ZuZpD^_RBitxbv}t4<7<<lb{m z<P}N*m(4!~J5{Bm`d{&wOmB_Ha}hj#d!`loy~A|vBNGqG!whd-6;3FO3{=Q>KJ|xs zx+?+jyM*TXKK%Id-s}=#7tWG*Ga4x7T0I~OWV4=PL*;J2va(m$V2rr+@A!c_ta&Gj za(2YbI5xq^#29>57A8G=YV+JRMlW8ERJ4{eKDr@F+YWxi)QWL84A00)HsYA|ZbB1} zN`Lq>SKq2BmOl2v$iVWz5Zx`^R^sZsl>rPECjQVD`K$b&vXuJ4$za5;<1#4dM_;k2 zZ<I8<OwZhq{q2Hv?el{Xm6{DsAa#?mPx(Yt{a)fgaCv#bc*jxGyk3NbX6E9B2lJ(> z9K|g>{C?(8cxj0F7Q}ROGc9A<kj}6}SI(1@`cLfd8uwdDj!BV7I@@yL%!>>u;MA?e zxAjs}S<`E8_r4Waz4hEPUKW6%iyoYyOQ>&YhNaUpP#`3nZQCw%WiwvfDJ{6>{7Xzm ze0GL)3O&)MliyrnwKD_NF8YyYR+3(cAlaaVk;g#U=8cE9R^&RcbYdY>mrhpJp)7v| zR3Lnko`rUcT?I2_P@guzVg^xW)KXpABIxl`fQ|?#MDAXD&iPu|d?cyI_uGX#RE*sD z06|eZR+__t?p-o0T3WrmkS&yk?OQqzC~(5e_r?@2<xPG(62~y6!BO-WlrEXA{jQK; zF6k&2xv8dP^ZP0iifxX)ZJu_p@R3FhV`q4|6g7AthW-tN=2$~=X}-nB)U(d8EX`|d zXTh#mHPo^GY^usy0dzssZWL=|L@$B`)rEHPCPB<S*V0|}l(Kr4&RI3}#6cx_!}AC; zq3o0IVxwYthG9DUjSc3|tw!5Y_fW_Sedwq`boY$!tz#obPTe^9Xq(R@lA4{n<CY)D zl!wR_g<9%PiCV27XL5w;{RFXo@H$^IgjNlC3<$BvA5B*#lHiS|F=io{Z^{<($D>8t zP-5{?lc-dNff|&^L$5Po8oedcKyjkhm>1-!GG-w;?Jd4nB=e*W7OSserJ9FT>9UAl zbtG<rnNHk_O*~X9pc@BherRf^jeDiaDuq*w5o98)U++L2zvRp>cAsp32EshI1|P>5 zjs$uNn&V_uw-lfi`>3#?%`{Ui5BpJrj$0cuP#~u#UKe7o_n})>2hX=_+@BIk)_~dL z_FD+ON9=Hs#I+>X2sR+*lMOd4=ceoqSzJX};$yXX4i2g^{e)aySN9{88MCHF!In$V zm{Us%&!f@53W^T%TRj$}tnT}gsCNvJ`gsb$5gc1XuvkW+)2^JZf>5?G)F9u~Mx<DF zjwN3Z2{co#kRGpfLZJH&EFq6{Lx6bWF>3!M)cGSzToyZWz!P&=GmU>@WK4-Oac!Rh zS}-*7c!T7Z*hFBNL2hPIE6M3K1{hOdOogWwYLQRvM!nnvfYL(8OG<wfIC)n8b{f!f z-^;M>{j*Lwrg{aB-2tgboiJmdu`=~S9cIC)*lLo;FCavw>iR3Xl0Gc*uB&HKYJhR< zcawMrF`n{ovPnhk8MqV>)8&WV@Zn!_Of?Gf8oaz2-ncUw-wpaahd#vV-}=I-Fu z6lgOlS*K)sZXs~fdA|FGA+d_yrA^|w4YD^oXg?<ZizV1c?UK{YEy=?R&-fub(8VET z;}L-=drdZr!{bLK*czRfTh#8o*iwfw&PmhfZ#(65;y^&isV>YELfw~4tvRVe@I4ZO znh~G%L@J^YhS%<t975?ll2874EirII-s4>{H1atFQJrbh$2LkF@o`x%2KIIrINZ;) zJ#1B6<OqA@DW2o3)9;o##(2FMjp?rQl0u_w(kM2Qyva#sQddmsLocmVQ*)?M6U>yF z;*1lzM59}NlX|lydxpk5UNYG7IDX^*@r5A`0|)@mVC^E9m8~=5Rh+c%hao<}G8nyx zuP^0P8EMX&`PEa3T`UN;-dY|`bDCs`Y^~2YI7$H8Ro{Vo)f`7gv-rBP#|k6CeN7CC ztDKg9_fkge_Qt_lEr*2FSB0B;ck=CaGyI46!V<yjoqfK?_pQBOd(e`+4(UHf`tS$i zF()jcU?s}+=Ov1K!+fD8|9BN*z>uZpf(UuQ5=bwg&$ZB{pQni*hJf*@A>qu&8nRn` zS2H-KXQBp>(VX^ieE20bvn~w0^=SYJ{G}y6^gY2t-gVO=jgK&0tz=Xk@ga<JBThoc z9EFkLD}B^X%RGh0$dRFakGr`hBvCBU+CQM1Y2!!_lH6?Pb%!w!=<4A?G=Q?+$jpms zq3PdN8-`xOGOYI4Y-}UaiAGNClP~pXmb3m`%<jQz2u;M&%SaQgq%kzhzNq=cIUCkP z%YE<k)BC7E8Bnk0_a6>*>4WCejW~QELYEbVd3^TqKX_PM?(3ekI;GFL=*0LX<*9ID zCn%^lCiNT^$zW<0aj@?GO`aKFghbG!9`5qDa7}^>@Rz>n1x7Ep4Wvcas+iF1;cWnV zOX%Wfv{t&^<F~qsBt*YdvBbo$%^$zXWRnR{F_lpCllA^+Pwx8m7L%uRUo1LMT7X)* zR>z+W+a#rP-HeieQgcd6ETeiEj6AVHQz=W<c9|-?t|#R?Ld0JDvZ;k%MJY(<Jo>bL zHb|^seL`aHe==7Z@ewaN`J=x8-_RwOt7OJyq9fg<x-gA>zFjxdY<lCso}tSVfj9DF z2zshA^pW>^EvX`fqUX)#6;#we1ji6-E50eDz~!!CpgH8_p0n0#KB{r(La2zK3-O(O zUQ#T`{$mysO*`yIx$ua^WGVKHVY^u%?R)*%3Hqplt^jB?ky2|qnCXuy3&hIKtIjZd zwlD2E-YwO;Oca-8vB0E=Kd@1#g(&tM_=B48vxdAbbVHiu0cvF5?jY5bf+%j_y?~n9 zZjIn%3@$`&zUHshGD#^hl}1Ii_IkC+;!u>Bv<ZdjeYvDM2T4&$J`r7#0&j1Gl}17o zew_GEf^!@;nhkF80UQIN0w<2x(3N6cq%wMYbM#7w*QPoJAVH4=**aQDHma26c(Jgl zDBdLPPJE<&>PtJ{^NrKs4Hx=MjF!pD<nT(f6y7HOxZ2oqWY)Xr=!zAc7l?FWpAZT? zWSNuo&@nuWRu9JH(prCY(jV_<H;<c<%MlOv5b6#XLQmJSOcqX8CxqNLV;H$s#I4d` z`-@0+ZV1{)SSUOAnWo%GFM3PJf!7C6CNrrFzRxj@D2dpBm}W}#g-hp_-oL5JO*6+l z034rWQ%A$r)h@K=52;W8Q2h3A#(>zjYW%e~J0}8E)8ZnyXzsF{VNFs}8H?-FXCnvA zJ9raJ#H@$7%NP(jJ1|U(Egv^tlk>l>YiQEsQH-wvo6M>Am&85u`IdP!^8?ZgK2(pL zB!jgArr6nZ0~D7A^RTxw#&0gr>UY+5zAOEalfH+DIzW#2=cEX~b{5+Nhsb%_Z66%F z&$xKuLNR*gwUAzh0V|?1rt6^uysT3-ObWnqUJIOU;jeougVvm1n|MaTBi*a#UAF9< zh4c>F3yKL0vd8!`DYo&Cd{x~8z^=PL>u;Q8@ByQ1A<#uKPq`vtpJvWXH64<6YUb9J z=Mh#MjG!ss_8DV>39Y|jtHZX4-VpA0+S`wYve~Dz&yY8O<JTKVfk)WfDTY*3_jS(y z#VP3Py(2+N!4T|4^DB|SXhrFP?%Rtbd&5mk4ab=dCG&QU?+XRypLlB~QoS#!(t9~b z`#-s*u7u&)VhSOOu@Om8L(l6Q4AtEsIF3-Zx(>=S6a-j^4-V_U0y@n?S%s4k_QXYM ziU`kTg|_p&^zNF{sXZFw)SQadRT$fP8^-*65fNxBh~eMX2525XAywufb^MHhIdU+d zk*0p?Wez^L)!l8L{qV{hr$3gOY7rVjF$wZ)VqVx^mP2!o&8pUo#?xO;op=1Ity(4P z4HXCLcelXiZGdwLU6>2HxDi&K_!z`Yus44gzRfb(1-y!NU(%1Bi{a9l!KXhg&TA;t zyjv#73$Tz=T>xTCg=kl&)+Yv&S-Wb_XkHrbyT|DB{4rj)+Le~MskM|i#!c9)X*k<L zW@?IM^Tdw6ClX{pC8oMSjx1i2xzD|B;!0|E0y1jnpQn+WJ#!4cTVR&mhm~0*kM(Ir zxuAkM<|UtdkJW<Wf1$OJkg{2qu6?uZo-GS+!=+K!cF#o`RjBIYKLgEF1bY(`J08ez z(|@&=tU?4lp8DOeCr-sP@dVI%j3!viblkPm%z5atxl<!-DC4L8T4R1Zd?58h1t(+x z<0(|{j4enq0LhTk)=oduT`LT2^0Q<=W9D{4;Np`^cqMeHvdX5=Wprf9l@u~lin4xU zd2*PfttDp9*e2rdac@Q{!`p%I_0Hi)-N8yGuZC%AmVsb%8^{8Y?MxAcj?#^ujg0%C z;K*&a=>l*f<J5FlK1pO`Wa~0a?b=|vBMZQrVhr{YvFQdivW!+w^LS-!ac2#z6ivOE zy}dq)PLk?tgWwzaED@jMCg{mym)t!ZG4i5sWy`#3u|z;2Ec-?T^9cDZI+<R}7HKhj zNk9!1ARXBKK;G)2*fZhdz?^YYN+n8j=N#80XZqx{UN|}e@g+O;z!cv*q#~5u1@m_S zeR<5+!V8&sL@>!-?zHY5f|Je=8WnKZ?|@Vv88*FnOCylfE6sBC{CP=TuI&7W0M^5P z-eLy!`XI{v{%KMm7#!s{pY_jHY6Btb(I-2-J4in>S?l^zv<H&O8=A$N-Vv{o!G*+U zUj=KRoC40BG~bJQBkWMhOs2$Q9R??Kn}}$Cs=v>TClaOH#KWlM3jf{b<23QypU2(` z4r$p`C5pJSMw6(|#pDf*!uM@X<rx_Hd0Yl-4Fa9hrn?(+-t;K8eSTnq2V^m-zJP=W zxy!{&<wc~LU6wT%zZ}mc7=IripI=@{<01|#d(;L*xmbf)LQb=yHL%B9Z(Rj=GU`ez zH9{zk4Lxe*XM3536u(V@4|guoak$A)^ygw&Dp~HR5i`Sy7&|v<Nwdma$b0UBc!2wz zd%jb+p!Uei;j=r)b<}bb*Ibz}+C%TWhZ!AODYTuEoI+&!540Ep!szCKy5pW7KSsw) z!f+tB<vfmx?ePz-hvt`o8hC^Cmlfu;QV8;cC~`V3L9se4$+rwq1|J)*+QvrPsZyi< zC;w9Os~!4Lm*Zds666bVy=IBz8`Ms|`ZH_qh<9iEPZoc-(t|q6;>x7vjvFQ2S<eoA zy_r<torB<$A4m}gL59AfmK7x?B{ezzZR2*i;}dc16QH0w&)Rm*Lp`y0>ymFRY2ELq zjl?-8hR~P-*(oYt2ma<+#z34jza7_fJ-22Njd*e8HDZB7KKF6MjU9Hx(s3w(lFt_8 zDC28^lcrq80OHxgJr?Pjri+uvR2EJ+`gD;^gU-!WD^{Ss9db~Z(jUnc>QF_fKlJ3> zU-817<7Pke2-}4FxW<!}zixfK7m-<0dYnU?%kaU}qxpYRo`FYVoj%&_K@2=2+PYE$ zZDz3bsil;~4IF$WhR%xF%rY1aJ69J`vBJ8J3Kh_h<?<*(1vgkm76=ro(g;aww~~eW zFyr$wUy?`Q&l#MQz|mDg8r{6&<rz!OTB$*7qrK1qVoGvdMIA3vuX`G#*W_J<L!P9} zOxmre#NSQQmP8$z@E~{~D?4*Mf@`9LZ*o4`kM@Xd7G*e;G|u$pmi8+}vkAYGdEl^k z2u=?s@Uc%dje<B9YIVn5`rH72mkCz>Od2RguODkol8tFJlG5|(^UZI#og4AWO`$pF z=zzbMzB)tA-rF!uo{B<T-k`Nr9W<O=F^_|H*!#JJIkXc}Y=m7|Ai3DWfvbn=)H26` ztNUC*+$sf~{*&MyTzN#tsv@ax;a*&uH&vyQ!Snl=;WwijA~rg+*37gdhPm3_ME$T( zsq}mkFZhI)EO2BY+9t&CV8_2sa%(R6yC5}#x7>A~Gk(~t-|t-TXKN$^rU2K6*ANa$ z9mPJ4m<OOslgjXm^_x!q7M!uO#wm$EL!zY0-s}$zLS-KdzP-pm5`@}GCR6I}_kO)= zSH29ydbAE{o)4Z?1^uG&Yrf}d?>7>hyk9DNt=0_!)SiYNrK6qezQVQSO#nDV;O;{q zDzqvU!2uIZVivT{mw%$2=eLV4g3T*XE&}o`SwlXQK&3EN_Qb+#ySQeFgca%|Ykp~C zpr|L2T!<P?JV!=|qiDt)TxFt5xPoOwo9ew)JXdX4?<xIYfwAeM(4DcEU^AwE)&?t| zu~OQPaZSG>hZ~2RMypqqJz~A@{UwzvNu0=Wd+#Kvt{u37Q8K?z2S?fH%gYBbV9?in z$%F9$^9G7!Oz4XwO@_d6JMrvoQ;YD>?TDtI)u*^_{yufJc&ohR!{rfc_rXQ)dVN3= z5O&d9WAkuQ-NXO+Jj2%~UddnkHJLZ@LwMcPfXPQ(I&UtcD*<KzI%i9FC-?HEYj~5e z{<d@9h%(4ul;32rP~=efPXKbpSy2vGi^U$mbEN8*4SxSCbNaxxH9-2s>NaW|&MOBX z4&WJQEavH&AlM>x%38UK6aM0-f_p93apn(OfrT!t)SGDgu7B5*eVtj-QXUF%Q#MoO z0zn8KR7WJ$)50u%z)`n>*V&iT^o!rJA^P|hQkcgo*nf^(TaT%T&_l6+9+f7}bA6%t z`wp`t6+y>3JDH*cP(V)(d+v@*Bk?<LEx{&(iEhRAm5~bXmyp!YR4*Mz*I!nQHqQ9c zUNCOuDjUOB=fgYwYJ>08d8AIdUwQv(P&nP9KVH>A)K^LrYVkP;Bx$^eDpzC#Q(su& zf05DYkL86!&D|!`8_8kas^v;<nm>J*q-i{~I)_i8zi<5+xM+tWYc>VV7{^z!U5gzB zWhY%oJg^xFuC)N2F%|pbkR2rXbw1p?EZ{3HE<_Bz*mR4roMCFK`6@xc!8BVUWcVuH zA7>d^nm2Bb9ZFq3*Z+e*^~ma$N$O(0kwMgQ!rYNNsZdrFJxYEme(neQGJdxtw}eB_ z9kAxXgC}*z?i@2_w$Yre0w(X=O-}9AqlXve)0ov$ZmWxaCA&EPCBn4H9jhP#Oh&rO zlJ`fiP?SYQ(UTHwlPqvl^Nz2)R-uc=ar;PI_Q;@{zjDcRz%zw8EfF3lF?AzBhovyx zfBcFVNRmXyZw{unX77vlviC_I;%3xK%EjCc8PT(tu<NYm7+=j#H<MB0xikA%Q>7v1 zdzu=G5I^a2f#7M#JaS9GKd{}P7RNym3%q6{25>SIS5-g)B7|my9`ACg>uGsN3Mue< z6mp*l3G&@^_0TBgQKyfMGgwc_lfkPwY%z_i(<u!9y2FtwCXiyqd^<`ex5ggxK`mPH zgk~1KppN6Df4@$zWSGaro~OabOdyZwl<n8vKWO4q*~HNCjaF!umlEtM6Mv$wFJzx% zG!br&FA(625v%->=Rh^alO?D5n{ArZ4ILn$^jTq5S}kw7pBB0_PcG<r&Ex0k{=^lH zKhKpr9zYF67WgT$#zTNrGz*~`r;)_>u$&*9(vh2$n%&eymnZFqA5Q&zdhM#%0mjnW z>I68><$kff=`WVegsA38k+}T=Zy6${f)VipYw>aS(FqP$9iYTS+Gbp2o&%?Hdr!W= zm)Eto9Sh>>pFhrkH!J!)j6oOTF}*RSv%_60v63i3#9JW!l(bbrqYY1&+wE({)cL48 z5!Lh3O!lxL=YOlgY_~9$CFt){hUy44S+G+T7)?|esN8d+IrVZo3t``QqpFxN!Et7N zY&-&mRA2fyL9s}7TQ+5WP^u9ATIYVXGV)J>2MH1wVCRRWIPnR--)-&OJc&#JHOQ}V z$Zf1RLdQ`oo^3cm!Jt0N3sed4$N_L_^h0v$`vn_}o|oII_{yLno$1rCMHzOov1}kW zY^V0otoz|%nf@AF4Urb^&{h8o^5;2TpS2jg{g5;1Z#^<q8oEOjO~GDJ=*bpE&Rpx= z?p)Z1dz?X>uklD;lUdg>xSM^i7mB&t0OyE^`GlR_jrMndT~ZJOBrvfzDYaB7GQ!e) zUnx^jF8|HRz;YLrY6GRs)>*^aIPt(-4rdM^q}sERkJF{Vre-1P9ZQ!?A30NZe#nbG zd2O01qo)ww*ee6HDah7xCK<<)FD-zv@_smnlusqr>Vm+xOYtW!R9;R?JwJ&_#7%vl zqd5eh^a07wIwm;c&l&KY82O=gheb_t3_j~oUNv^SF-|%q#c>P%pvjpJuo>$z;#cEw z6)*#7OY1%AUi%iI-@MvpUqT^CJr@&-v{d2{WE7;K3_;xX2`M&~fvCg2YX7uAb^5z# zI)?H0^w^6O@%S%>)pYBW<5W3&#%{}BE?STWQV(Db6f^hhAkp1mEUSdksT9UjOXy^R zUa6{V#3{!R?QdRkj*1Bm7`E~x7`z@Jpe_LPMJ{n#bOv?_;RCOhE%QD+EGzO`0RR=% z<q%$I=770|&AvY?HUwGendWN?cYeCx^7(-T`t}iQKoG(#ilL-F8ZTYpH#?2~hH*x9 z<mQRjSLk*D_pS*9hj=zu$8jt8+O5s!V<s)zrS>?mH{)YXO-j??L@<{UE!(E$@|0g@ zI!y*}zlX&*C_L#k1G&WHFM$reAjC(|KuNO%Cs<ygS%ff}#|T1r0lY3ficyZzH6#p% zJaVlZp}h7U|8M!dpeSM|9vr?aqFwA?@hu{hYIHnbzpgX5(Ot$l<2h3!?y+6ak)dc} zomsD*Jg3SBiJL{XY&ZU31sC6MBL6_)9-MGzz2n{kq>LES%4&u!d;}57qcj*Ulmi-K zM1w9#idJ{m@DeYqL)2kMQl8qvnAMjq1FzTZ39P1%ACV1%@(ElgBnMFr<4(+vMw|HI zN0f{6n!P(UKMUu=lhW-?c1i%W(}(+9grT7<F;Z44ZJ!GAU8!%hcnHBucg7TpdJvJN z#$%yP$l&^I{y#Ue`(XH(O`0dkBts~?KleaQJ8q53=QMszDnUe+zhcnDe)3DsA_;IP z5;W~jwLA*-`EpRPPZ+V3jCT*TeiW*wyt{bxfel1C-lq9jYbfrmvum8B@bt}ML4$>m zUg_J-X9Z{dez?vgI6tP-gl;CaW(XFY*IF-pSNVJc8Qm0|1BZ)wHj$$ANS>3b)`a$m z`OY)bd9=nK^~etyg0_;VcKD6#5g`I%4)nJmXi*#DD-*^*VRraz8Sx_zeWtePpG48p zN2jTY+UC*)92>?&-q5?jT1JqT>ZWQwhkH8=q|9im?mX@PUslv+9RK^2%ZF?I<ZXtF z{g&E5X%aqkBV?6#fye3nOOmhtI|FR{nC<`((9D9G(Nc}-<R)#WGq(=rZI!{2eB0y@ z*=(Gw*z9*Ly3kk3`h$2?8DRBsv@-@Ir*e5C`&$Y);sBj$I$hX|s%9osTAP#)lDM7A z&0OA1a|0&FZ#Cock{xh?)lxIFtmsTX``&CFxx@Em3_2Wrp?Xfir)Is^iD@nSkXvt4 z6gNJ#&=vNbe9??3$lh*B*qztY9w63O#z~v-iGh=%n;tdtb;%PjE!8W{hhUvvkYbqR z@oQR~$emMc4k3TmczW+qX+7Kl)_Xm`Xgh;UYLJ;Za=Bx2r2yGdqAXjRI;tJTMWO;N zeb%K|qp&PI{0_=)<0>z6sJ7|rv)dW7Dqb`@Xueqp37g5|haCdzR*4~adF6Uzo{7!! za;W7lrtA*}@q5lWcBu3K$9XVbt0+I%M(8?K^^++d>2?_gKp27}f%wKK2K<{vrLk6) zON=B6MLf)$>saE+c;GvyZvZUB6#jz#&**9Wv%DM-L~sd`L6aK-u^|*9wF=Y6DUh2) zQnqWJ+ynGZsRJ_Wp|?+5;J3&=gD`>^+NJ>Iscc~q@h(dC)wBIkjVpTR8+;>aVm-BJ zL}Mk%4!B#P25%|663<~i46NXgT_Mq6<SUw9Yzqs@^kGfg_Ys;{l_F}=mDNq!3o|#= z61%#_VMxl(P5-x!yHE=@xVlo&^89TMxb4n7IDNi>8D5n++jpQtt7qeAc=^?c7ssXV z1eT3t?ZkJ+?NQ*^NS=v01gNv|MadlJu2yU50==_-+aNZJ*KxiDA^);)ckiKCZ#y;E zTrE|}ml?uYzsfiFID~geno^SXYLG<K%L)nK$IC08Ra8y0a2^PefW?L^Vx;t%9uu@- z3yw17A!G~Wpj8kbCFija3#+}~zKRYE#ESG3OU+RrUtMsjPEn}rj>ZckGez!jYX}G9 zSSeS1+vvX)8TcF4rof*JC0!Xk+_Qzcd7^^8%#t(q?YT~}=o&lcTbIoaU4)(<wQlyS z&^-H)5Q^E_HyrY4GZ!kkUG6Vf*@lZdNCdCDU05g%RCEG;25>1jRf$F^00Ds0-qGks zu_E6Lc`@U<2(#1lxgy|6Fh_Q_i^AnvH{)tD6AtO*4mL2h;tje`d$0jhIxduD;Ce}a zvMJrf%B1lU&tospRa$>HS^cw=xn@(2z?<6TTY%4;RzqKj%^%QaFZo^FyG|ca^!w2E z=EzAQlVzzLTFWje1cc7aKbjzZH;hsJl=>%1V%OO2$Z!#aQo~+RTk@ZUy{KloJk;*I z9o%|KA>2M)*X)oX*z04A@Rs%<{satHhd<NJJ8|Rs9p}!$IH3Quck;#@P;Tj4`;D+v z7r8F1koYE-o|xyTvZ2=E{kEo<r^=e&a~j}jbH9h1NawfdFdec;=s*-YMaKK{Qt61R zNvqCdVVqH)Umi2Q`Awl6at61|>B~ilmKyOkN2**ZPJd6HI~Xl)G)TIyd!VDDgq}*b zqcl$xT`-P^=WBsa2gM)O<qEA&IW0RW^pVo+OFlXNtFN5;$+H^8dFVD>LK!UV=;MbA z$x0r{rRk97%)TW%CFj6T(x1Sr57t(9$vVDAur5!=VMN923pE4+Lo`gTbX%MWD*6G# zv19PZ(>7vvlWJaR6mXaLPulS8UM>&`({|U?tlpv%$=&^{ha>Y%p13D_NBALas#XuJ zhB{mL??xQRt>-~4P%GVIj^)~UeL6+k=WD$LQfG?E^97V8!V1!%xhXJwG$`JxWRK;N z1J{#ma%a%pgda4EA6Uu)hb60P-HVvntr!qMsZg(oe>=mclC4y5YN(*n1&o1C5J51# zB;cenZ^+3I&Y4bzWqhFzkaOfyiV?L|!^$x1Jtys_?5(q+sCtgfR5N^zP3%!~o@P)r zsd%}rRs>tLaMd=LV5u%vv7+U8a6F&!c)8!ML~~HtKbq}+LaJx4k_#8I7R_3J5|Lz+ z@{Q=dok&z^2NXh*Xz(g0%5TW0Y@Z+9mBGw&4Euf7cBS`DL5OLmzR#WHlG?#!UZTYx zU&j$F=fts;f+b^b_P9!WkPJen#qAM4H_HBE45)8YnP1>e86qIZRht4`euXZ|`AmPT zVILfsekzjEV*>DWur53sR_#+!NFkN(+6!!e64;3ZJpG!;V#Sx4VY+|q)k$hg=i%EU z*|+<a@1rmi-SD7$J}%l=J4Qc&u_7j;!0cu|eAZAxouE$mBg(3-NnrCqR*hV9v4cEB zl2<H#t)mM!^Ac{koWi&$i?VTwYdS><mck{*0TfI+Gy`*NiT2|g_~fhudiQER+G1I- zGAXjWPi1~@S^3wZGEPPlUD~n`Nyx3k+MT-uc7-G^30-I4+j6mnH|K2+e;NCA3j`N= z*?g9gM@y~hv=DvehDqUaU4_E6{D-u5Kot%_{&4B|H%i}BYR+OKdHYFJ_UsLh{Y+b$ z*O(3Q_mL-_rF>Jf4IBQS-_vx=Aj24-`@gcD#ir#<joOj=9bx-U&8ZHciL5HprqlCm zGSO$+k`mquf|OnOw3Ztu#c`#lrt0AJSH>61kOMr!=&dQ@6&K+@-aHW0%pbJ2#AwHN zik6X1SPXj<3PMW05UN06pivuQQ~);>zMFP}0qxuP9UA;p0QMgHvNTLaGQhvAOP!V0 z^T_;(BHyMeKppuZ$T(};EshCqewBG4+%jT5NJ3_jtdf`zsaYBvgQ<d*2>v51&be?w zmmS2D&oDEN+$XClESHS^Rz79c*UJ|S9dymTBIwah!9BjU+z-J?aLxus9R?(g191y6 z<>luhv%ebW=0X<=8dOd(LuRfNV)MjZlB}`x!vzI&i`#fCBl$4bBKEvxEMo{d>shMT zL>g-a89Qe7z^!30zJxAf0CTx~bM-N787+G<md2pJNY9l)&!|Ca%4!8oIyMZ{3GSh5 zp!4m8%DtRT(=9S_M2ug??)$!1jK2To505$S99gwM3$%u)Zko?kCTwJ%DCV2WDDuts z*o05`aT1G9NL5*^2PI%1lO1^gs4N;z01Ai@vA0{(J>yQp5^nx<8x_gnH9^tS;-(G$ zlnn;KC8~g)){Y6;jp3MM7v*HQE+rhhBkkKATQcRL3pBJ<#Yf*LR<L&qxu^8wN?_M4 zwY9#XVWB<z7~o?BH(nW|`yttDt0HSxX2lzsl6)$HIr$NydKJcMfqa0J0s9dZi+6mk zszA2<yLi5Ic?^~DqK<*DTCst`XKUe(6#k6@n()#W{Vn-LTmI1>JZJ~k-ri=IzC!=g zc%(m^DJgSl-Xe5KLpe~s9iJpW-#PlzYVX6=-8GAg5;$|B*Lu-=P8W2??>-8WL`v$} zlbw(c!14zfTi0vV4Hr3Fmm9y2A+~l}C`*lz1G1dYXkRd_tFugoyo8+Os?1pCkQ%@e z5edcioJ74qsFQ?oA8+hc$GmgPx}Nl-5y1*)hG7=MibKH;R*^b-W=9TiB=}D`LgHe7 z4;WQMMZ|6xytNQ{zFz3l-{g6SYta4jQpcA4evvrgBq{JBe1w-GD(RxM5Fh)?UHz&Q z_~2iw6m{mi8n`!+Ne*5V*=1ov4GOm}-hvi#B^hu}%BHmAAT9>kkhwm%)R@>3SNBnj z*9;=Y(Q+n3KRHz|rrmLd<FH?TlHUWubh};c$}_m=vwGVsm$DDvYcQ_C@4GV=JXlSC z%a_ftcZC&{YMzbf;cYehBW**K|7Ux?WlLxkgtcpWB+vRP#lw)$Tb-nlZpFE^Zb2M! z>~jVoAl+I+ib#2CqvLLu-@St3JXNj&bP$nm4#zpdWJP;miG1m?^#^U7>^wCsK@58I zg#AwK#HmeeS`4KXgLxLKXCo9tC#b8A)%FjRDmN>Q=>d@#X&XW_d`kWd!K+GV?L651 zr9jy5QWFO9fDdaEdw8+q`BRDTVk;O*p@-8{I^W3##YsjpZ^oF883V1C>%a?ReA7-d z;+oio>$UcMU7a#z-M-A`nd?dD6qKKhHs42;I@@#Mx+EG;wxT^@39dPGk{g4q3Gm3q zL&;#F-sARH@i(Y;4QMs*&Uh-&NzmOQFoc*WqK`BP*G;JaC3?assf3;{wYj>#6Jago zXL2I2zRkRaZ=&Oc25Hcj=0K&F+_Z9Zh+dD?p38A>vc;|^&SSi>a>Q1%*h(dXbg>A& z_Vt|^l{LA0+aI*PeS)+gM|pSqUVFeoU$;PO?S01^+?FDpoNz#9adE7GYCSp<h!Xj# zZ#U7&1$qj5ZbOOeZ*qzFdT%))%k*`R`1dv^+;8y_hXebLh!>$ll51wym$)q6BD4qz zKR@?b4>oJgD8GQg@m3Apa+Psus};4X_pYRqQiNaG_K9*?r#i?egsy|9DmcsMU2PDC z7X8N3)^qw=O<7&Gc1?>I^%ZYAy<{1V&GPUtZ|lv!eOI&pw9g|sPIJE-E3D~fN9p-t zr+z2r`=$UUe3!nmR{E>%ZXy@kkz)e!rYP4bQPx8(LfcFU)+b=<Sh<go0)5CmLN`ct z{7-DO+f=UV4L}oFdoC)7n2)=z=vT(sw`qu88n~-4NV4^25}ExHmqOWL6rw@HQ6q$g zOMIe$M_lR)DZ{WS3kPvX0$G1qf-iGqfadC4i>i))F!|1QdwN5hs-LUddgHYmr|$hk zRbsuJUO3pG^txAssf8><Bu;m>1{Z4g#Y<%DSGcE<5D%J2ct;CwYmG<MF~;Y12%|3I z&yC<0dBE9iv}u}N0D`snNr7r%XVZxwqTEyL1M5b=L%%9khi;aVi-N6B&2`s$Y(c5k zjRLAvsN3UP&=aVPP8@UTAJJbkjatb>P*oM|S<y=9h!(=`$16V>Z4S>>!m>EgKVLJ) zlkd4gTy0#niHaZ^X)k&q($)_~P1r6af^Y0A?2Ss5MpDV?t~SdxEe8fpUZu-aYW04m z8Byz@&Go%U#0=ypK<;w&i|o6JLfGIQTeW%i!9zz@!|MkFEcb&cPGrz%<T=3rnIuuf z7t}(Rtv`A8a3ci@N|S3#y&xhWuDXO6*C8%eB0ko3Y&~hme)o910VM*|^UMa9e$@AO z3Xr(hd>0bTpF;{SuJu}s)cdPDoJPGkiQKHyZGtBbQt%j?l!@KuFDRcMGUpGRP@y&@ z6L7r=D70~c;&B4JCfqLtLwu85GKK_S+JRyq6?kM?njt0AtZhOkPz^3UTqi>m6N1lr z)H|6_ymcdXkvX5VFEFi)IKtpaq}_9(DMWeX9*8~Ai;zd*#^nr>u}fXhL3krxE0Eb8 z4j};FN!u)u3W$j_7C^a(V6%hrA`ypQL%Es94yln1{G^i7b@5lnn-rA}RVC;byNbp; zV`%o`nbo~tM>hw$p1PiR?=|R+Ncpn;lzhrhL$BB(LfXjPZn*DPdq6+y8E;aw_x<x0 z?0I+I)jG2e$%axK%^ar|2}$>E>ye4CVP&ZVQY<nQy%D=V-;~~3!)9zIm4<r5M1GQO QWXFAH9;C#n4g>-DKbF3`K>z>% diff --git a/images/get-proxy-for-project.webp b/images/get-proxy-for-project.webp index b763e6101f425061e202339d6eed0725f9f73f2a..29157d8c076df55a896a2bb409d6e31f37e0c3a5 100644 GIT binary patch literal 13712 zcmbuk1CXvwk~ZA7ZM#qVv~AnA-KTBqv~AnAZQHi({@$5?Cw6A`-PzgwBQoNtsLZI! zN?dux{V0fwh=ei&0H_KJ$f?M&5qSQwu2}@k1f)s@6#?QIH7b=aE+o#&t#k9e!Gtuo z`7&0YanC+*$rxF4<9jI*f%m-`EAD@Im5l*c1E;?K*7!vHCOY)&CW@HsP~2Ug4f(vv z_Kt8n>m=}*IhFdZ{Qmwn?PYzqe#`!2^<?rk?6dIj{Q&U&-HU%9dzC%Q8TW1fxj*>L zfwceT@&$L&rTc;ZC40-0`%U?Q`iXzdv*_dS>2zzlhd-0m)3tIR|7!cfd(b`VQft|L z^nLK1@dWx5f6n{p)8|^`lmCUipgYyw?KArgc?0-y{`UMCEzP_BLjO7ad0hkl5PgSV z&vUlD<n#Qkek}N4`>@@(4e&k7+x7PA9q#k+4-e;ee?3e7@%y$+BtnbTR$~SG$hOWW zdO_qSSgUg<;ZzTuws6JP@Yd=)M8QJ6B`(vX|4Sot7%f|sc4ZK3&|{QxX@b^Lv1M=m z>~I|;XQkSWlw&n$(!vEt!%M5(5Ct3cnxt5hzO_<j|F>*;vXw!ALFYljx$&8G!_!m= z1sWtK3PZ!0s5F=6>L?$b1A%_R`iq5_(zL31iigM)l%`Gn;h_#TzgL4LzUkf^9#>2- z7h0B?ZDhH4^+X~OWl-zInbVwP71%Y*`DL21{u1mr@MdL3_~8Kg1%C1i!f4)bNgT?P z#(Atjxcv=b_|W!tsPD=JmPk1DI|eCVQpHM-P8YVG>vTKtkk<+x(^b!HwljFddkvTA zrr$o#1w7{Se<)i_?aYfG$AF97Do57RmQSgGMp7U`%`TS=uF>S|F6f@k0Jg1X03rcq z?to5GwO}@?xbIDoIs*{L#zWsXh?yhUzqGqDagqn7yUnEF1cAL|SecuPM#N+JNAzq< zhmM*aRv{TF*kS&N|Hjf*Iw6@bIH6xxF?QPeyb;Mr&H+8^!u~H!cdNiu6r5nNw+tIg zTj`j1qJWs5ZN<njPVnQWx$vL%MuyuQsVm1vp9MrYQI@B|yBW)Kzx&y%3(<pr=}OSS z9Can=U`~2bbTFm8$-9~|Kjhs^{r6_%;XlauF`_dL^GZixh=`VB1h+%IesA7c>0HMf zJbR|2w;!x@Zj%jOy|U1`jMjQ|N&mgFZ4eEOz^v!)rW6Y#?Q8Pb|5!WX_hKmyL_hc& zI8EX{^maRWt9lC9^X>O-c!j0sFn^4Cx7#;$7q3s?ZO_5v#bI>YNAQi=DEu}3d5MsY z^9BzT+zBJ=2!h$5uJXDFlRwHfNpADadZorqbOUOG>juyiQdX&%#>?u_QkHNADYwE* z<8A$9CD(5@3HQQW%YD;y4L3Bqgg6Zt?B6%AELZ$p7v}%7`J<%3^3X&!FZ#&0O+}{4 zrekQDM^!ActkWEk`Bj^cH21PtSaI7a;?HMoBC@RW0-^aoH>rK5UI1}aWg^>&3O_R1 zK%CW@NcZQUPK~z{75>F&194JiBHfFNIx*TpoY$Jl`p>2gGp|1FHAcs&i|rp{mniOM z>277?LzX{C=m&;zyqi!yPY{$;E1J!wvogAU7nJv>DAB*=!15{|9U{|hBn0p^$s{}8 z+R6W{w*RE?p~@W#SG{A%Tf?;8cMW@FDQ<|)CdfZ?sJU^amttN3K3D?Ms9Xbn+ntpJ zTI7YxOHc|^6r$uMDEwPX^6~&hYpB|-;<2r`qJz<{=r~u`6U*&p_5t){3Yt}*yF<`+ z0v)ZKW+UkF1hfl3HwXXC7&=-x%{tJ-F=%JLj#hq~k^gEMKXl>eTE5@si2e6<_%Dm} zKa~{L`I{SxQ;Gb{4+4R-Nr2kC;9<I)q`XW~9*T=Z%wYs`ecU_1sX)Sa+QYtk#Y?vr z%Usx~-nD*&33qmfwdzn;ft<@j(<}{lKXxh4l7gxuv#iYz)cX_{X`pqnxz^@K>H~|* zG|;+O+#2)pe2B!t2_I5%g0mWmpY<M!DUTyiJ&UvGmG81#dsWBW_Ca<3w_BONI6#8X zkf&{1Nk@vIwy5dsIfZ<c8HgnVw@Gj^8pUUG>!%LTDL_J44<a~?#C(_;_+LM@RP_UG z)zRvrj=UW;?PJ0&U(5$5H?aocHkip;YOjcqhNB9_qKYO*<wk<v?QyL_E8ICZ4ielp z>Ub}fod~h8C?UNI06Q$KuenSAhesF38t)1!&5RYqeU6}6sR{|N>>Ue%eVr~r65k6Y z0l7ckU53Hcw+C1JeBW#rAcLdD*I=u7e^2W206lqxZ-XQz3x%Dhc1Vpfk5(II8)Db3 zCI1onsTDdsO36UuBKM(L&`R@R6%{Pc+bj<FVVZHtcl9Z#5v0jlODbCy2K`49|M$t6 zmFG=7z!z#Ta3|K>7aZagVnC55x*^v@h6CL1&o6YX>UGnyVlFg!s|L=#JOPWMz@7<$ zkz`dGr_|YrRTtB>O58X%_}RMjNb+|$^H<>bhdV7cRFQK7guqPFLODuD08Nve`+)X2 zbIBH^wivbJjldlF-bG#ji=GrUN#8%p2b0a4=xBQ|c?3#V);H@80dh6Tx`|o<NDi`1 z`s2TuexLL6_Qm@CfoT8rrvE6tAJy^9J4JCWzbYfuLE8{2)3pBT=79OH$~?$_k*_wz zlp2ToOTssqzpLKDq-0~Oe}S>C9=*;+i!|R4Qq&gziMK}RziQF`yGHnHO#}dP8r2_| z^89^=XeK4Q{Rwpc?V(ECdcq-@?K$!9-gAg@qDa_JG2#CIw=p-trtfxvQp$!#V38je z!z@24I^~mX-zYl+12&ayX~uJDy)jL;Sagfey{jExkoDo}lrL|)c=Wy1SY=)4{4d8% zn!k{`6Hg!94P{UsmEu4%&j);IKtu>W*#^;aVnOg=8pa+JTt?=ZoQjY|NIn!<*f%&P z#c*0&B>_pG$d_-uuPmMV>3ulgtnl{QYqf=z&Cu3~Su;UbQ}PPDs}{7u818R8i=vcX zUQyBnl)O0C%t0TvLnw0u#eLoXZ_@oOT>k_~yg3!O#%V^>={+A@4x=y$=x1x?Q^~Bp z4{6rluj4GFkPuTDcF&iF*oJrGos)!BU|}Oq4ppQ@>36YN^$R$N+h_NETwmJ_fl7$~ zHkbHk%7Kl|YrAMw2Ju%$QsZ;KjP>yk5Lp~+3Ms49K;vn3Zz)UkXM>%5bHEXM^_}8( zUF@@mA+;7w(Y*_|08xu(m$?1twpe#1w0{5w)pVNK&i)8Q581yu>K{3RQ?X4n7oc*^ ztPzm(`{SE!aX}Q}I>62$j{5JP{}jnT1NXmpE>4;~jKX*=Pb5J8Nd}9FYfa3~UQA=K zdjQGX4ukb7%cWO-$aU*qop3({)ulL%LG{1fssv5m5PENE@ze0oLCm&7=Il0zQ|ql7 zV6Pxp0eW>5;qsT!J$+1ZKJz_U1_EhePUtn2nrBWmWXt@YQTlIjAANTDH06T%IzRvO z`2S<j{z9xCCHa@KfORAqUZ8kRQm(-*Lo}!{?i>z4)U##X?<cDW+lrc%&#-Qwj*0ED zt*Ivx3Iua?WqLnuK)t4ZcrJ@h)c*TdVUMQWQJ>)C*iGtqI@bRSfce{V{!&J%ac?mx z{OizrxzQWOF>{Dt+EwrW7QvphKCMGCl5@boKC^GF>|_y;3ja4byeF9*uk+%b%74dM z{#|;*=L_&v1T4tfOvcmud>~QBcCuTghRgijk+6F?WDwM%WmAg?oT0wS`I}?*48J^_ z#VYcRsB`t0(@OX8-5w4x{YI>c<xc4>dxqoC`?J6(pS=XfmCFIsF?U0NHK(3Tr<Miy ze)w&8h7G9KiSf*MVZ3}#gdu@uL>Ac6rlFoV(#_4EK8h!D7<!%w^0Owy`8f^~R6YjM zA4G`9a8Gq#Xm!gaGnKa#CzYvUN7qfdXUS%1Govf32&^N_8weDJyFk!5Rwb59Ix`>2 zl;4TROA*V~ZzW{z4}J$h4!WIBYd_mkktR{>;HNem&WkQI8BN<7WV2Re_CYxrYdd;x zZ!B-)jB~Q}1-YA&9zsYmN2+x{s^)6N9$*vTpx29pwp!K1wG%%n5-AD0M7NKd-Z$+z zkZ_VMhoKe*5Xd`SBJ3k<c;)ufGqLUb46yT%P{7>?m9u<Z)RU=@Tx`#Ra95@}B91p& zQLnl}bfi%$ostw*=za5jwjLq|F~{>$x$+zja7RaarM5MU`Wg}*T5QTIPN|sv(5#B` z86E=IrdW4CE?A;Cl)7>SW^wT_ZZZ%R1i$h=UUDiZP2n@ywsHLy<s-pq3zo98x>%L* zF=|%-1!6d7y)yO+8S{KS9%m>`Ql-gvRcjT%CqcjqHwiEO`P)nov574;ee+?#jnX^j zSj(4;zSBhFfvG2%lb5VQ;~6-ykJT;a+}0zm1-WaeFn0mQLP2(WyM{{GEHUkby{S++ zwjzD}Bp&Pcx{)`BLE-0T=tvmZftYQnQ5as`7HaF87u<)#XD7iOO>!A+-)7Q}v$LG8 zRWRmCRuEM-dvds<0E!6Y_@;)}Ad_b1Q|$6VpZ*hPQ9=IOWvHa$!=RxUchP8A=-{3E z$z2`#rVgHoO1n1M!s(Nzu>Md=Yyjlw3!FRopS-=~ds>6}F9<zRUONeQ;V!EceAnJL zwskBBMSTE*2r*|^F{E+_(X)+qk!qptbZiv%=NQ~=vf=>fwq~{hB|#6wg5uh>isN*9 z#aTJ3KNqzdiNX)m6_d1&<CIxcuQpTgry@zU`POit<qmdY73U<rB-nXSNAocHmDUBV zqY&@XEh1R0dqgij((f}9EwD|ePbQcklOx8mU84DOU@Knp0P*LA2yRtdm+Y4VEN46U zjYi&L_5=~;)Iy3uSK;y3;#@nQm<!WOP~z6*n6R}Lz)`$uP!~|~!jdP~bohM%cq33l z%_^Z%YG+L-)Uey!vk}Pa>~2EF3-ZZ@UJ87oW|J6_#7!2{0fYrAOQ=bD@^uWpKO@AX znxAMEq^yzP0&;+c0Y<p&5E!=N0VhwIt8wsJ(!qf7_n?}1W>eop*o=Gxv{~bjF|E>( zf@|rA3^ggoPt+MUvN@6?_)D6(I6GEsj0c$jcb|^&Bmg-eFG^I+9NQJA_~V>XX0MOt z7B(mx?1Z3rk6*G_TMI-iB3Nn|!-w%%N`9o`E8ye~wV4Yrawvr1szC2OuPi0m<d{bk z4#C=K^e{w_$lo8yJr<*8apr_7gp9>HWPV|M7h8O@<|;SqFrpsY{#LFA9ed#Qo3?xt zg*8K41q{hKJGwlvEj;r)DzmA9J-n(M)n}HoyRigdpOx)=n|+rT%$paFc+S~j^qs#7 z(_we>re`>P8YR9x+q^M=a<8u7msNfYr9A7Z1?5&<A}B8Vi1hlQ1!F{pO1>F-ORzW4 zbUDfsXB+B)sxB&@DI+@0p2wx8M+NY^7LPc7B~(!N>5L)T@#(=8OuRV;fv>fC8Qgg` z`tn_zSx$gPQF)$r737CFEeGsC@iob#cT+`C@$*-3{7`Ti#>8kOwz)q&)FbBx3HGBT zPbiOoql<uiErR-T`1|gei?5hC*EY59cXN}NsmHYc=1I&h4!-r>La@xoampfiYU<^d zHTQNFIGnZROzRvGFE<GYG|olaVhY7BIT)SJ>b0j?Wh=c%Jtz*z&fxhv_jM#{Ga1B^ zUVdN(MyH2q=WSloK`++$Cg!<K9=GeTKr$dlRl=3~p(~r}#lo?XdMs%X8jHf4c~RQ` zNs`squ;`(!l@6~JcsK5gdAx}(Ui<b?AYbk!<52Lfra!gAuTPnTD_)n`bi*!qJo7$T zgCF_DFg%5xrxJjbPs?kUNZM8bEIP`QY8f+JH?P2T3d&11Dk{kzEHzLnvq$#DX^^jK zl`<;4oQQ56^%c|)6Q9?ISHanu87HPKD^xJ_ga2H(0Fp;$4ruWAPHP<%Z4)(fdIhHn zO0Ar&>bKVt)6x7T9ldf%jJxOq?7=cB{Do5c7p`J|ETspJYa1h^Q>NSwP1m-MOVM>A zmVmQ4CFpevQD57onRJ~mg)t}g2%DuV?|C&npu(%cBbcl@t<{q8aR&vde)!X!)gP<{ zHtgy@SC2&5Sk+eJW<b<bvmfELAt4oB_e?@OyKTWl;!Nq7yarP>n~p<Z`aVIRV^>UO zh1KS~ph1D-F~)AebJ9$;D3;ZIBhWC9!+z$<!^lMOC<bR}1x&l;I0-pIO~jiPes$RC z1Xu*fw!y!_SaX_H8tNbbjPIJ{r{+gdIucE+FB$r-xyj4G#l)*xAg<}}+P|H+vIe>t z!${T}LD3wAO6usEVOjATC4tturE=Tah{tm#bK-VZcenW?F9<-uV03f|R~v*e=KUbA zfsYhS<V=p<o3h{hg$Fx8q0siIlJix~M4V0<L2bK|yqEgWzPUcryB@fAKO-$T3NRD9 z{i_py)s<ayqU??aX@Y<@2{IK%8@9L~Crfe)oqzOTBA?|1WXs%AfwDm@Ym5lVmzd?G zCEC%qGZ!}~xgYg*R?@~rdu{qQYAEpHtG!kdi#_qBn9E_y_uwlbIQ)4Eqdwih`M!<O z09>Dyj~3)Do!UAg(g2%!M}f|x;vN<XCOZ2^v4!bNXm$Y_W@9r9AcRJEpKjq>$_KS^ zlJ;YWiRMg^&5)hoy?RWDNPFHY*;mqF9Uj@Umf9#k$nCfB?(*eubGDPge(PklA`8{X zG1h6ZZk=%lb{`gHv}_$L;5fS8qm@Czq6Q^BkrkmO<+N_y82d*KR+`dpfE0E${Pr|n zaIA~c9=tef)UC+!`hd3~r9mt@P)zG<cAy`dxq|{>1T}nPK{{}UY+zNOpaQOA@Zq|b z<~`apov02D6iJs6f}G;bl$)SODFXmxu$ykrhG=B3{IJ6{#6<2gOD+*mj)3}3%Jorq zU1v2{Yx$PEk~fIza|7{9@;srsDvq9EEk^0a1B+*6)5NDly?qx5`%w|bD<p=ry~LQ# zkQn1NVnf>gB8(SE49R+fVfbN+Mmj%fOIbvUt<*+{A(SbjX4gVg9EpQyY7Ge@2$hOB zMJ+^JDXo8Fg6KmPGOTebF!f6Qr)g{!l%~NDKZZc5lylTV#Err_8Y4s>s)S*KbAhRU z(n@WN2tt`6Zhj*%7fRD$gg;&B<>!yrX50f0*2-jwQE6BxiX-;2`A1L!Z*pYstKz>n zFmI$L_I-d-^XZ;1Of38eLcO@>@Z<))*+{_@7xM0c0%ucDfLH!9HQVL9j3Gg0&ZN*P zwK^lL0`>&ta}Y|Tt##Iyy<13zVqMIv5tyO?PRbR`Cqhcs*8^jYrUUOIllHKDRXV^h zX-oR0bOQDuWzP0uJDf5%o$!phAr==9U1ca4`ISUHh!2Hb5@PAwtieCZrw$Fh2b4Xs zvnCt=9c5#e10$X#ui;WS5ZtM#@FmIdf~LX)d-ycA4;Di@;@$&N!)tmYT9iRa7afjI zok4FFJSU_;S;<OgQ=wQ-R+IsAJ}~qP6mL-sb;+XlX2glY+el0ok4HQc%oVqJZ?S!O zhFvu(HU>VGpWWK*o*UqkQd<#Pg1mclpyJF6XquVg3pwP@@27(8;P+x4rotoy*+M^x z5w%~yFWx;g0N4OLCikydm|_Z3GI4m9mR=e|h4FXds(LL$ETkU{BWUb{J320=m4`^s zervj|Of*w?*D=25n6+OXXsx&WBkZ!)(2qQ?dmjjI6DF71GRU}~l%r0NunmdX<)Dx? zF4x!LDp>bVhRuO1%*PkQwvaWJ)2mTi$a>4!^|&2)H<d8oz(=_14+dY^@@dzv*JVIr z!Q4!foC?6y0Y(@^r(t>KYTTK&^#EDY;p2twqq_;DzEXf1&a>K30ke>rkVHT~Gj+*< zfhwOhj2)SdM~mQRL*#y=38ums>jql}+*E*^;gZmYv};M(k*kQ59u=u&4|uRX3-L4k z@WtS+Yt&AlK&CLg8EI`MmHPJHb=dMrJH7OmVu1lPpPLHkm5VrQ#ydrY#dEX%!0v{u zcWt#6UR!NiCB)<XBHItsKHMhj42m+fm@&$*g0Lptk)YxphvznhB<uFDo&j{)!r6&o z{+$Jb@-De9{@$9~7(j;N?n}cSDrHqAjk95Ouxi=?!`*<#k{6zRm4}lSu2&ihWkNYy zrjl>cT1tR8@+x;Tc(m#*2u#r!g;)O_9`JE^p3X;F&x8d#jfjrEShM~<!#gN%D970) z9*@pLt}Ic~>QCbPt&j;NgX7BQQz{cg4#!2nyHG3;AA*N~f2No#-X9GC|42Dgusa+G z{+4i}V7K1~{3+o`$!5O`_*KY(lEHTKZyr#%W%b-0hQJYL$^LtLAQab03Y8$pq6^Z_ zVf;tkzmUn#8%Am0x2G8p2REeesn#Nw0-L__u`4D-=T$of@Sxv*3#8*{k#=+!g@~9| zlLFivl}C{kGkvpEp?(dbMWO7K?+=9W`SsOzg2*I9+04IK3pSft-ZHrjwJ2<W#qab5 z%7g3_wxBnS>Hvr0RT5e}*MGc45vNRbX>A(sh7*?nEzfM?qImQ<k6U?^A;o_miQsov z5F)!L2h3?B^h35nEt+?yRfy1KJzl+)srzB5Rl*}w5EFE5w)F9%E`59-aD$PLK>6?; zO2ihVq`l70u#SU@0X(Q3V+e4T6O>*hO|R%;jBheWEA?zNqvN|J=jnh~oXl5zSr5XR z$;zJI$zJ0<0P)Nebf}1q^1@RX<v<w+8Ul)^Bn_<7u+_1x-J=6l%%yQc1f0G^?}b>b z|Ln#LF0Bq5hE%l1PfQG?Nv08~i|UiH;~|8uT183A&WCF&b29JX^e?dpazQWWQ#7GY zw=~fTt*4ujmNnSvb2OAGIc~iGs!v`L;a)(%vcQRR04o6`9i2p;bDmU`VdL+Npy#?1 zAScu;n)E4_3A<m8vBxIT(cBsVVc13D^5zXu$IU+sY$wL9=-ISVwconi&AXK|Z48{D z*|{c~pzN0my~a3QKND@|NQ(SxcHhV|pjwr{ExbTkX}HgcfAWGFupu*|k|OPd5#h2% zfJSX;c)CvZBWu^{Qq=qk;OEtZIh`i9FC~96<^|bN!}3aX4aa2Y-;)F`-Vd*p<bHwi zdri<zOSv*##gBw*N`Gv)&yaed!XFc9mB1~}vcGJR|Cy>lj4^2?D9~_$Fth)APAzF( zY}@QH!F$?8g~?)o`r`gsH1>v^$PHD;49FJ6O;3M)5iGlr(2R};4hS=O$7}hIwl3vU z&qX}ckO3C*gwR><%?7v$QgxEzrE}_6JqivfK14fTw`8;<E#MBu2M<Lg!z8Az*m!0O z^QW$8dVgc<>+i20GF%yi_u>h=sZkGj4vWwJK{FhG<`hU82u16u+7j_?A!c7daoB#P zTE4rPi~h%lkZu)aYuJ%IA&-HDY9Pi2>dz=KliInvGPZ35CBGXN^=7QRbzk+SLex{0 zk;(`p`DwpaAh{pdsoiF!2Yd0B;DLgM=UO2(fKoRfBv!ah(d`M=Uyj))dvnTAf#63X zM~IHfKXaD9k3h1)v$%69?zi1^rW7;VZU}!)HsuO}EDbRBC)$BYMc1j;3t7ASdLt!K zJVcvupMYCvq4@agc_?w$l86cuiVUX136)`};q}F@#pJe)19m982YP&Cc+I>LR*`f# z23yA#P0|3Q?LK958!%mZ(ZgBO8y*ED*<%Gpeeymp134u(M34l`B8kXYO`rg*N%B{5 zBZIM6Prw)HS3k$3X0>n?iyeOv*=DF}RG&-VWpYF`X!-4(%BXtm%gag!5eI)#dieO_ zUH5LFv`3>s2RS>5y+Q^0NJ;_ZoDo=g3-W@mjFg3@T7qf1D77%F@s*;@?esc8oJ5Ki z8+mmbMCt46wiP-1+A4XwmgwTWc4%)_?UP6pmR!134d(KvUdw?LURJ7^Np3eeH6tRS zV5vFKFLtkZR1a0Z0N1>_uq<%Kv*Gw89t<j?j7GpZO&jAXtT?68pcAA~3_2RGNfGsB z%d4J%86*3v2ELjTuu{U4gH=h38EJe)r~#xI`~J$#>qTPWO7%A{h4?WU6+lngQ+@HK z>L-^!)iU)V5J`Ww?FBC!%hu^_2Hr_rX8;O3ENTsR9+Wi>8wHi_0muzT&nTDBdKYD@ zEG4K5Y9TyD(h4U=S1pPRQFw@>kYxOZ1Wy~nV1j+M>44|Y*z<C&ZJoFUKyDm!$>qFJ zs1B9na`y^y>FT`Zk*fi#kt@&0;f~m~J7TaV#C8lDxYUNTTur{(qCJ@79)?+CImJjQ z!CFqfi*_6dx8mm2+~SqGNP<)*DzP?~n=}y&4KPiBma!lp<hSkm;)T~_ETig)v^@-9 z@<?IG0Foh{00rO*WofAYy5+XWEgZs3Sk_G%doy{ZpPB^8ypYyzke4FGOlcXv*Vf2L z__MR|yr|4y4?emOl!KkJbH+lZbKilx4EU`Pw}EE&z~eDpKrV$mx(w1NW;I7d_GhPO zx=MKWu_(I@O9W^pxf1}$&&`@AlU4@kL0yp&6*-Ah<Q)u0S+xr@##`E!<^D6AnOp?j zkgSCYE4}Z|+@L11aPvELu9lF#Dv71@{_7Zc4cYc{1c9Lw{>GUummI+2kP<hKwdRzn ztJ=sq`1BC>t%YL;n7T9y3Xn(<X3+s7CTyEj6WN;wZs{R=R-GHuz|}MGqp0cmO*6&o zFZ2&<0F8MqjQN4Yw7MSB;PCzx+w-bVzi+=8VDd$Yif6W3qW3yLut>~6*rCpOJm2@4 zlcO&Hs3vg_;o)6C-9l!+10$`Y`5Br|el)7-fg*eV55iX%WARlX|JKcWF$Z=ZiFI)_ z2AS!VMgjl}0xe8`suX1z(fBADy4Yei;;Tdnr-3A80duAbPr{JGdfNHi`w;;6#QFHz zOVy}?9-IkmEwyN|oN!9~>W5U&N%lHDGB4S)Ah1J^-2wcu1qz2u*}XP??vxigjuHl| zr%RtE8x*^mH&v1!YeKQpP;hiy$fH4Y4~`4H5po56JSxf@(fe+fo457}!})CKG7z;| z6YFD}Qhb9GsHPiFPjj90g0=!s{kKV?thL>sAr&eLI!?HRgGrK4ZX6f@zTRXOocpp& z+im+Fkgh}ugXYF`x?58g{OWfq9|vcOz}z4~kHBUgi{<BeFhpk#7L{`sAy0*ka&ACI zDWE`H8jcbZTk(`L5*qPF%`;s@;PK)OkZDjvuAya+Xnh%^ye`A#%$HOvwJr*dg75-u zkZZPF<Ka=tm?|Qlt#!wvnX&i1y?Jw$nEEzE7&)AXzCELb&i(c=_MndlemsfT*Uh+O zuI_wl0I1<O747Cqlj^qGk6wyqkwbXT(zU_wC%!u>JAhc;#NNoxX{iIV#!ouXyRTF| zgpw7hJcSj~u_PN_O7|jB&6{T%Y1+cFheogW-06AwQE;B)&ms0fd`HuHG6%3%2slmm zgbjTtLq#Np;-L)VQ(+GGG*orSVpwS(=)<gh8%I=KPJg5f(q@c0-)5R>%|O^j(nqho zXhSD$5o6W8IzS2Pp^h#7Wu!#V5b^ZAY-de=;pEjKxz2336EXIU9J-pt`Ou^Zy}QC0 zcj*U}{sKNB{0Hb%ye+=otXMol5X=n&tVUy0#j{wcPXHPGgPE}ntB_dl2MA@`KKR$R z^6`;W?=<a<R{6}A^>ozFz8G1d8iz1O5gY|pC7uNAQ4q%c8ig(Ry6Qok-Z_<Cx-ovA z@ER*nxRT9TMlyr#qCwDU4VLvj(d-6}iu-}nu?A*9?HS|f<!zwM#n%8j)s8U&Zb<gY z1OjcPRPP{L#QBo180km_#aGy)Kvy8WytAndPNjp^EO6W8Vh-!u1CIO^m>ld1G;7$3 z3qW7rX!>8{l+e@J>mv*eyJ|NlWQJbmH1oN%7fle*Q<cKo{;$G+{L$Ri%201IddH(j zhivw!@R5-JtbiN4NbJi4I2LpZf^E~kKwY<LQ|lOX?fXJ;L7lcyU@-u{vJC>0O_I1s zdy@{<F<f!_Vzp5DEfpie3;qYpdK7J6L>j^i4fSQil40~m`Lp}ln!ZMcwjWY_B{U2* zXx}aPh^-kK(7sCW7Sb?OqI)*t&taEI4sL6=J<%zcOHO!hk9-@i9O+amUu9};5=1{~ zXS-Ozfvt4?BIh##LFbi@G3cf`mu`avzK$f$cCU}v%T=Np9<%|+ckFXWY{BuGha6Mc zv455#r_}Tt-lWecw3<w<XEB-Bfa5t0JfyZ`doMyxsO;IlN|8}$299piXP5Xds^nn3 zR3jIkht6RB=Q0G)AXD3s7_OW?>kG`^ta*hmbfXhJ8E{FT5hi}Ed{~6Lqg!O$tOYJo zQ8L~1j3%`{{Jf24o^P`~Shu<_ifqzPt-hr~iaaz{zJulx#={swnl=JaQ?16tbh8e; zd8l%h#2%W>KUJ3T@GQ~5V1AL7Waj+twkpz|2ndxh`dYe8`5x`0oW~{-K1DOAb;0IV z$e`-ncv4bTVF<<lh0#P2-Q&rpjRpKkvQ%P_c_0m<L?BNxw(h3tu*Ajz2;Y{{4^X<A zskqRjA#c*c$%gx)E^*nRcwU3cWN2~-I|vOZpHWonQQV;g4svF{;ym<Aj#O^Bbv7j8 zheNRKO~;CR<BH6iRmogG?`{-Q<BV_5hv6`y$kdD#;z#)XJObp>A>4RWb<_rALA9QV zlk>Bl$4LMBeWjOC%*)`w3=nmk7sHLXC?L#lG<SSAdDr?bG#o1Mj-_nT_AC6-En86Q zK<@w<%6^+Q!XL8x=H~kMOQ$!}yR(IIiUS&Pa)8X44Y3az1q%t<M$lXYuC)_O0J!_# zK~?=-<C&!s@8NF<%@ue<W_sEjPNQGz#&`Up?GcE!KLx~o-vky<{C1P?7*K>Uq<pQ~ zG(~^(=WRb@zMT<6;=1G#D<$@Er2cJb;P3jKE--^&+-mYe&P#z8e{F3OG(Mu}jqgMm z-@x)RS{*4BNLOKe(x(6Y+93~X;U&RD{A*R90%sIx2gfr&n&@z)gJ_Ic$QD73{6&Um zas2=(S+zr9klXM`H>(~26kDh*-w<vy;@#TIJAwnTk6uy2k~7bw7r(KWDiF_HxX1@_ zC>4MA%EonxJxP3_Poy&*)#wHtTO4OYe4?j1smqdYv))N0Sq4w2Oa*;D+%dLe``0yt zMg~|L%W@dFLMojgOdk_5VrVLZjj*j>$!j&cTy4E~?XQG=2UUd$BI)6pMP1pQoQ@I` zXW1B!0{P>YTj0Ep(FctUE|LZ2FT`Db0LRX&l<2Q4goof$!b0jvuK=tcq3({`4$>9G zHySBtL*=*w(luqLRL%Z#OWQ>FrTNe`x-e7J>ZVx4I$~z3+!Sfo9hN2o{H#FSM*eO; z`<t;Hke=xs!>tz3Z<!)G-9$*%{5J+ZvJIG&(_hpM_M@`_)9kd!>=ZXH!^@r^%0NYO zS+dQwPdkmL=#W%Gj=QM~>WKr`zZ@kn8g_&}X@0T*I1(@<hTED???LatKHILm&$n<` zQOX)D@Tj&ja7$al^h;Po?4m{pKRT`gah#>)8a(+0ae&xDv*8FlVl5GZQ)SQ<x$AUD z-cRQTYH5gSLpYSRjt$>;5O;83O{K#4nzVv^G}!XRSjstO#v!Q~uB1b=4hZpxii-Al z7`jua`2QU49t>!Q-EGMikGAxYnQdifw5Rh-d%}m?c9u^YdwqgGsV8NGy%l`E=gx_u zKLQWTt3(E=rx&I&71V~loG}y@sQ;AIX->GFr4YzK0_HH^)?<!t<@F71b<SC;Ml!^b ziD)w~vQekRTl&Bev^ZeWm!BiHTKXn1&yXB~k(s_0hjr{{x@gSA$EDrqK_jqaO6iSR zX=st<KhF07yfv-4cCtqHp`_x0c-R5#UbZdlZ#}<8k%uk@qlE5yUV-bvHgmkPJ{MIs z<<8Q)B6#v|lQwan?b1M|#5p-PTb&y>NF+zo{Q9MA_^@aaQUCnl##mW!$THMO?xx7f z%$?MX7JL-V52p=35SkezDw_#}PyUhT{-LJPc@3It1B+T|M#ZALRix*%B^#n+I#*RN zx7r`h_hrU19c80z<V7!2gbkRp0vgci?geyelUWKx1p>f{rF#)rln(*dVwv_`@lr;n z`7I_|Up%4<IF{UL`}xke1g&e_i)>I5Y1^hYxfA4_k9vVBz{Kq<;ukBPE3BVHGz$q% zuS@+{)c1qH&kB&>Mh<F~=R`G8(#L<mn{R|pku4gZii`S33~aRoKR#W7`V3hz$|zP@ zI*`+0j-e%6e8q5wRr8k*6V(4@s{xuXHD~xO0RN00Cea7*=6>?$sOR#$G^3q<Jt%C< zBq<}ylPUjssxQs_>ONb#pI9Zjbsu5wDfh5160U-d$@9=bYrU=Ud``FL{Dt0)elqap zIp!xw|C1iRDSesbfO?9K%CaPB+IaEjq;S#XRE6%^?8``;Av#eTCs=+q6~z^$WWflK zDzYZE_&QVUuy-b48z`+06Wva<8}Ii<QMnX2<F~Mx17f+zi{)c{h}CWv?3<XCZ9s8v zEz1YN=-Mkhdq)tB9#t7%n?$+ood)KQDG+QjL<OSkuudgT`t0OKv|dC$yg+EnhC;S7 zZ9IqbK|iK~snvqC3UPFFFZ>tGQy^K+GA+^%)t_Bi8V^wfc)aq}@V7xSk4%b5A6*k* zQik2`CHhkSj{b3S71!<$Fk&;h9XTo#%Jew0p$b`p=Y~W@RF)dzM})PAaF)om<tt?R zfD6TMeb2vusAoS!wrPGvv69p3Y)ZBem)0wYwneCmYtPc)38N|}b60a$F_y3V`W>01 zLIE7q9JI2zUEQDv0QXUcCqX^Y0LeL07f(y_UX=e7k@AM)(8n@DvLtR4FE406EC>l~ z5R0WRt62||P2orhK!DvB3gbGo1nTkg=#bqRI-d;^Oy`Yd9h`O1L5?2e93|fl6zd$` z^7u9BvqPcM?AQLI`2o95?M8MjNKOS$ctS{AgA|Pkp-1dh9k8)p^rNY*F)y1FI4ZtV z7Z@Wa_}E=1YgVYQdME<WsvGHo6gag!bn{Y(6KND^AnTmEoMg(BHL8=u0Cn;zc3FG` zw{%W{`+z>Z8Or1}S{|;0C#el26BmRF2!H@_>k~bcKn^i&zp+E)Eu0FGyJ90wYf6}> zLadfCDB;|!b+QTt^CE}0LPr5xOp`KMCm`mIH*|>dtD*e*RNaj10E<W!T$3;H7b|mW z%N^delhNBl3kUYMkMmg*nG)@S&Ki|(4v8lhwwL&i<f{%VtHv(wp9tf44ROc|Kw|hU zF;SS*XcEME1&8^Gi!wyn47^9#Wf?HTT(k!XM}@APo>e7RT&i0TWeb$-1$8L%CalJg z?%=tP_Q$gKwr>Njr7Xlozs>;PMR8^ogg{crNVf+)u4k>Cc7Iy_sxvefp{F@gZ2&p< zr!2`cy24=7dXgGlk=nZ=XGkH$=<@>#+3{2t16RmHD|?tG`GVLjMi_?$T>s$eMA~TE zd^fpwvGE-5*`9v2KC@Kx68!w^vax5qqAr_CDNM75vPP$yL1J_7z_8Ni((bqz<6ri) zR>}*ib*B|4103*?J5)+_P}40O^h2SumG>bbf^)0j<_g1jWq;pf>KIlQJ0d2y^r71$ zORBUCrP-jas!x*--m5Gu2ZA>myA~KY_Ud-3rAThNG4*kN`;WB94Wz+iBYxBQ5f{s< z?Yt^K$|3&JYmlUKjz$`LAfuUhRA%bhaGfb#A+at{Y#vqzOFYkaE%zgn>z}x74ijCz zE!Ne!6L-`)p=URhl-I(5aCuIM8VKb9QD;Apfj=c{j-;gZuJ1ZL37*K1vr4Kv+2|=W z-|A8Vf??Px@Ue3LL1u<yd?~aSEuB}AQfD_`r?wR4Jw{_CT9r#IKL{vf{w|vCnx_oW zY`_KuVc46He|n&(nw{6=cs4IBxxG#@m@8mDAO|V2Ek)IrLS&Bdyhid0`IG#b>mA9$ zq(<Vkx|2zzGS<la5ocw3{JFA-D;LPLNcCCf!Oqe;QL8L#<MvJj2TOF5dP;Vyv&Oxy zW24YdV}U2WG~Jda*9lpt3OHe(N*ju_L|-nED$*DtXkydtNF@kMQQG;*Bb>JnxhKKv zzSfzmg16BvyyrDvc?xlCC%vVMu|&Wm)8=C@^C4Y5$-galrt@~#`Y9<}ll3y~g-|)D zG6)^Yt<6*~g_EPz$);1MM1XtVt-nj}8*YgO?bw0@#`9V#1+!-j_$ba-v2&=0=WDO! zv_WEaP1MSY2ddlI&3)`3I`H@6PfbLrM_1vqG@8&N_YR^*X|w@FZXHDTqTdFTS=A7o zio&%h)2e|wrFkpirsaKfO0!nNOpCkdWoAu8sb@F;s{?)`o(aod@X6E*@(JW!4B>te U&qY$L<b_lG{}4Q_5&(ez2kp4jBLDyZ literal 14474 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 diff --git a/images/get-urls-from-project.webp b/images/get-urls-from-project.webp index 0645189d18a5d1186e295ed87d5e8c0df733210b..c57a22fc0507e28841c9535e2f9b3631286e30a1 100644 GIT binary patch literal 15180 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 LKMmgr00906o9^1T literal 13856 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 IegOddFAC5$xBvhE diff --git a/images/get-user-flow-for-url.webp b/images/get-user-flow-for-url.webp index fa9115f1ce291531e46872cf3ab21c6ef3b9a36c..5a6940ea31da8dabb112236dbbb755750f2e1536 100644 GIT binary patch literal 15380 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 L*skXf1oZy_+y0lJ literal 13386 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 diff --git a/images/retrieve-analysis-per-project.webp b/images/retrieve-analysis-per-project.webp index d78b35d6b51bd2242b07bf9c2b9c208246e81a20..f4ad381ebdb7fba5d40007389c18680564a4b601 100644 GIT binary patch literal 14332 zcmb_>1CXxGl4jesZQDL=+s0|zw(ZllZQI?adD^y(uid?Oc4KD#z4y+{?(9ZXL{+|( znWd+m%!*f8N?iPr69`B{Ohi##k&Ec`Z|#H$;2dC@Y;Zmhff3_!CCZYb!UE-v{9CL@ zOS>=Id(4hnaGW)^Z|pE{eZf=A*SzN~ohJO-Md146dqyV2qrR%X3GV=I#=Ojvvz;>y z&ZEBXiQb=CpZrMQ$7k<nsJY$?b#HO0j9-2ueT$#c9}m8!{zonW{@;Lyv-q<<K<`4| zoPWTb{|p+H;M{f7@prHP**ESv;r&ie-oiKhiT|ZSls_J?{woxq>_VY>Z1j8h8~ls2 zdqeIU@mt{|ub#1qQ2V>)3w31ZQ}Cv@@XP!2;%oNBJ^=A3Z&UE}&GyTGfc3KP(%(S< z=sV9p{IlR${VVG`?@jPGp_PBJfA06eSJf`=8|3qje7rGXm;d+o`v;fb(%<SM-9Juc zlUo$ez+OHxJ`=TFStVbW^0?e?txcN>XSU|;c?;{aj)EmEx%>Vy*8Ia?Y0KV`pY+ww zsBb!2*OZU{_iEE8SMNczpUCnNC#Dcv9zkCsd`h6|(Dx@A&_2JlPthfUBTZ~y<WUnB z%UyNKK_nI|$E_tXokwkqlCZ14fOM`seN2sf75knp%LIp1m#s4$In0-P<Ay|(spYQb z#abUwI5ptM2sMEtR-gTY0*aGjT5S9W0vBio`i&k`w2nV6Uq9P}8e4Z>^b!K*+Z}&h zw2)U{r+;^`LK4Xi@YkwD3LdnDexTIpAK5&Da1ea{(7hV#M>s#Klc3IdR=f;CdF<Wb zk80auY@Ic(d6v0qTCMV3c((!2?6~|(2YM@_T;!QlZ&Rp_nNO`Nn@&l!S)B<a`PZdf zZrMbYheOwUL~C+!{aA%#2q3u@9kWs?WZbW~ej-!p{9k13|8_0oaSAtF-~86*BuZn` zJy}@%WZvoQRk(`JBnnLa2TTY>@4s#!0rVJy(Hlf&%j`j^qi)!vW7^H*gyvs8u&Kfi zNCXULn0%*Tnq*~7AFxuG_?$C$zvddrz?O!vNARv?W+3C+Ztp81+0)#xe-Um1QT>U0 z-!wZAz#2Y`bntfoDw3zXaZHbSF+oitANcGCi870qGzImf@9j0us~je|RFK$q-Kq7C zM6=%xKOX^q?m4sk5|DB|=u;=5x)1HMHC^2Xm(wkngg~R;pm`u0I5Sq`y)mWa4)O%U z=mHP{)#jcr84|mSBJd_}DqkAd=8ouGr*D`ysK1v0)-Kh0&wN|G(d|3`wF9o<CIDPk zhHtcieICE}4f8+N{EG|6zCB(_xkC{L{K~Q)elV7o-~7LlH6-XD4k}$Z&k~u21#|aa zAptF*Ms}A}M**9z@?oDW6j<R8n}S4N%lS6+TcLRMxN#M8JEfvSNMGLJhlJ~k@Szzd z6d}D#(y@tDNN=3tSn4?b;bD(oNuQi~3kIbRZ!(YD{!)HfvuBKdJU_|b>;;Sa<W3&b z&$|Ck#Rm)}UUtl8^<u&Q^ep$$K<Khhpkd@9wCw<mLFy-#v@XOnzgu8b{V2~kqmo>J zJwO33Fup1+3Mh6crJFh2k+Id9?x~zDN-z5FVf}Y_-~VYGrA>tuR4MpsC{cn~R4hIU z+BDRvS3C%$^PPb6<ez7ygPm5t#IOQ<GcPNbwM2PZN-=$&{HTKZ^GWKBI<m>D_!Dh- ztw-4}%GhSRLQssE!(KJ7@K+XRrNaL-pjb@r^D+-04)mdC*?mEfbGb$awE2>kE?=L! z<ou_W|8%G!wImA%?;mE`iYi8q+xdVyx=U6FxpfqCO`^g275R<~U1&u#%i+&!mb*MS zV<*ve!FC{}GSuhxsZk&1$O)9)uU%mAY=!LuMr^>oA5v|G*WD%s8R{pysu2%?mq6QA z8|etc$cVLyzry|Q+V4<bV}eDi5gIw=UQXUTmdeFpN_<h{03zSNDg84n{sm#a4W;gI zPA}_@QwQl|jBy5dz1%)dFGqL(FXE*0WmlIX7!ZcFlE#gXMHCb>V-`b7bv6=`cm-Gj zzp&xtve%LXq0SNz*8{rZN!JVz9njoB^RgHNKbP`iAhY8c`ggn9D1ow{`971vVPh)F z7}PBcNZTsC&Xctimvp=UW(hbN5bU|;*Y6363#>1ui`0bPJX`8352K76;et^Wu@cg= zCF}<11SeGi)|`)VWhAo@+gcFBefOH%!ipacZ2!uie+RUGC)Tzt28XX3>s%ThCfHgq z)bqj?(g-oi??pZH-4*B^3ZTcL{)9!QXxPIYozFhD^`?g{;tW){AFtPh3I4)Ucz^19 z{+<B-y6LSR;~n!^!GeD7-u>5s#<}m&PUKdL2u`>H-DYkgF2?SFIfN#<DWVm$Gtg{x zy<h=1rjPOqt*C6Gd6@Wf1xqv!@8!M%=-6gp&}(X!{66o03kd&YLEEmUrr#MnN%D=| zTZ$X2@kBuHVTWOiV6C|<WSbdAuwS0Rd&svtYh{$3p)|495iI6QZT@(`_M9<!|1-w? z6PN!h_%Ngld<Z$$Q7-4YbT;k9$V;X}J_Et9Q?{3^{wG0;<Pi+jQ0pH;1US_QkkI>o z$OY8_#o{Jw<)<c()+p;9lMVD`F;)N4Xw>>gs{PAOJBPnAgk_=A!Wm|hQB-wDzvudB zxhDX05oH+fnG|VZgHW|EkG{lVz>OS4to5?{#s`F|8KC5>o6=vgsL(_Ecjq=qFE;=P zE8{<H-yy9JSvfv~Tkf&5{07!v;imfxuYAIO?$o>W{$RCV<uxGAXuHI(OZfdagJo$5 zkgY}rg_wz?xi8M6jJ`|YjIrn8PJeh4S<LCO?{taLkI*K>Ulc+j9=;Q=FEui3Au49C zs6v)kI&You6swB4tpB#9Z2NxC*dDWC%-kfp{~GD^Ue^HQ!Au!E#87oNHU!dJq3u&t z*>XMK$J?z%`jgMOaYzH7807F~^uXUhfj|kbCqbEpwfdJJ&o^`2{2c=%kPG_$;835r zNjKx4vcDsJjy<1Yhbo8LyP~Ub?85I0Az9JsILAol6e5<!80+em=KXFb%j@Ci?qoHe zSI>jD+tU9b8~NXmA{dWjUU7N%V8`@L&vREW#ICZCTmxj}yAvS4(Gm`OU`(Qf6zdb_ zNOs2ae?ZWGrCG^CQ(0!jlXgGh&l<K%J>fsb>BfJ(x&J|~^zXB4WE6tj4gvy0#O@Dk z%albQY`zSL%gU`%O{_09rF*Ga@hBv<CtRGgN`tX77mt^i#3a8f$qs3jBxd~2*Zgm( z+3Fu&CyEfoQpr-q_yPiJr?4aVN!%1pDm%r^f{q{mEs>(<9=0Gxdv(5Hkc2tAe=cU% zK4X>X`Ux<J8X~{8rQ|Woh49C?BxC9$1`TF#H)Oes+dnZVP*WEvbH)5WM0?c+m%oP* z8fcmFw1KTW^%eHL9YFtdC$}_S0M-J?7GEpYgx$m~0Vr<rzl_rVb_9OHE;KI-w(T0d z(<eI8qCNlRdHj1)YdO6_B~=nQ8pp+nWFk<O`CDZN0Of(7Mo1O-Izcpb%CBx02S-tn zQa*`cTimr2|J?jaH(Kz$XuJhhW_sJjkst(Ufk>2T_}_D{zYxM-J0f8&(#;m$?Gm$0 z{*qGvJ52t4T7Tie=%V=!Om@t_Jz&z`8@Oza*8e}hSpMPt^X~nF8Vw5Qs}!;(^(c0% zGdAM}Zb?$ewYPos$1Ov`X2H;W`H0t&&dJtnFMC4?e&CS?5`f3u)_q<JCN9o<$O!PT z6C1Es;ph)DVEE~VRW7%*4t}s6vTD8*mgx;vuz^IH%UtQkx=N0)8i;ontJ07=K;<?J zbrNHh69a($(Mlx2XQFy(UN4Q`0K$EMQ)a>+q<9s9Jd3r&i+za_ZX*=uF<P-YYnZ}o z4CXw_E<gH@PF<fr9hB!Q5+!tJdojrmI_a6U!wem4R^@Wp+r;YV-+<piOv<o0R~$IC zS<KUY;a@~g5}PMGUIe9o=7R^SFDWM*@@j)mrYJ&VHNiYU<$aNrAFW+Ly&HXn4L`{3 zlU;y`+G4+_1wH$h7oXjI%m`T{`fg?N<^C!FLmF;EHKBc<&*MgNlL7TV9%Mf(d}FIy zxWGUw;;~bTkf1^7?&gRP*7=INrAPB0tPm(g#J~>Y{88OvuS`)n58)J2Q=D<UYYgxC zGd~dz={s7w$HP1_76%T~QKUsU{PM~!DQ%5z%duHmyLtmP=W$fIR}$-j#5`*~3v^ga z2pFn@dMCFDT8Li)iP<5l-zBLC2y<;A3Iz06`?TFP&RYdG;Bu0?#@w&bXUPo>a3Old z-thx0<ruyav)I9<Q?h?a<ZLF>gRuX3r%F&Ud5+?HP?|2eEpE8W^uuO3?TU{m7%p%H z&iaMbSs!D7)6l4Zt56j>nsWhNF;&72zw>KG8wiD{*xm9QLjlI`yb|I?U_y)GD0{BH z#`cuyny8JAHT*KMdbfVedlo^*_t)pe?HGia$_wD~#ofNFHJOFy3aDvVT6UWUh^I~< z*S94c2j%x<4GKD@+gaE_fP;DY<HI~{S7d2ANYtdlT^>tYQ30`uJgAZ}HI43rztrc% zpgs*aLn?JW^Q9I&$o?q-3Fad~XTcWP@!xLJ^E-iP>_jrYfPJk3iZe^X_u*Zugl{^o zaY_KyFvu1hP)ZY@NKv4QiNAJ~7FV~VCl;!&sh4!m6w7TU9sjt2KzV^K^*cq*SRbj2 z=`a|lcgjg*UwBfF!YTx0dn*ii`Fxp`NN;%2Zcsu$^Lxz<d!+iatVrQjo^qNvuF#jh zmMAVd)4+B1hh7cV`fX+2lAhY;gZe~g(tG}4O~{e_hm|w`fsYw8LrlZC?F_)a>o)Mx z;*@oOJO0#i-rHg1>q={jm#&)vO|;~LKEkI~4DpBp6IF@&$2LoLd37=2S~l**%&mP4 zcSDDyinOFfv!?E-Aed%9A~TbVy%tKa3#cRON?#poDd%^@XIaO}VE!{Q<WDZwCPqoI z*Y+!+?M)32B*Zk*yqVoLIju44Xe`;6>M7YjJkgbB=6aE-G<twF^kt|-O`WxDn?Lv9 zD@>1Iep4|%3<W;SI$#9}BSjSbGaY^rZ2T8jR@n8f-H(JeK|?Vi%{4-A^0n)Q=^Urs zvapc>XE@o@Z!w9U*#^%&6>GB05lOl7upWst6gAuqDh*eL65~CIwn)U>N%c-l=qR6s zGMqD$h6at}iR)st@_KX>*h_}qckvZVewF83>xwE!g20<~O3`SCZ)=(MM%bC1^-SH5 zLvUQzCmwu{{hTnMMM@b=Tqux`H`YzNv7=u;%a-IcTDFr$?9I;HUmZ-`!;3L24An-t zyQ@EDP$)YTkV4sw6<{tDEJ{K4Di3c8G+6>5P{9NXn*_H$fDIYz?uJ@IPvMaZnI_<* z5$`K#y9v;{xtePfa6QCl@-fSbPPM2#0gc!{*;omJ3Q#ORTKfH3N6mPu)w-L1h{vYI zb}&=S2U)FZ@{1*Bmy#pE<Ja9TRJQZ-bTgPwEAVmiS|6(ViILuvEE@eBp(k&A0`5H# zfqcRQQ4j(_gPL(XHP0mUC7J$-djvJCtk~kXO}gY@7;{IyX)?WX;|}3FRAqzBfXsHs zBr}#!;boL@OwwHfq2|yOG2GF%kl>H9&D%PIhcglXFWxG0Y~IDo=`WihqAs>kYPJ1y zoX=(*##$$le<3y|tEE_)d#wxGCxGw+A9C?cgFG+$)4PrMs`y-3tCvoD6Pu}?O(m_j zHH>tyoW0F4!LaH&H>w-!d5Wk}f+p8h#cR^9C@K>`L|5cq`^!ykh>74`TY2f>z(8*0 z{GL*+lSQ_&G2?gT<WLUj9lIv$e(a|SZlIC;VSn*E-Q_*E7JW@WOmU>d0WzbNkUfx) z)D#H*gDOc0k$uT>4-P|xMCU=}x1jL*R^f$o?z<GJ95RQi_~VHtJ>y-&qiS--Lao@= zutXDQG#nIiaRqQhGP`CNCv8}Rir1$uK&Nxe(%|J3AK5%EwpWhcQp(K=S6B!l?so=I z-u*8cRzwaYm7xb9)JlEm&E)yrZ7suXt-5syAswk&&3jNAVe&AZfj2a%L<45gr?uMr zd5a_W3@kkfy-zdu2C7ewFy?|F8PfZyb#qyQ3a9NQ&9yT54hICPCkyVK%O5~;vLabU zffU4Y^Zm(4rKh`65h^YYWW&^*Tqwq9TX@jSFm`cZzd|`BK>k5dku^-)Ys;9{5Sp10 zKjc_<HR{wPhC+>Y-%X&zSfI8Zz8Q2#5;lQ;7YpEMPLJXD)yo#sIlp13Y$ww76dMvr z|B|+6$c#$sSa(INN?&ULy=>DE_=yO*Kn~q>UU)=>yOG?zfs2o(V4O}o!H+}?@|NOz z^o#Gh>asVJ<lwzV+i5vZuuW;>_%4RpqH}voNd0;TE@f_gVUq{Jt`JsT=g#O)K&EhT zi!`3P+J^-VzmF#x;(M;yIGEMh$-()ma~fbJ{>4?-7ZIUl5;`d40|pJ!WS6L(6ximo zMX`_nvL9dVQORKNumdjK4t!5+Ng2jMEV<=c9vpciEY=b>cqr7g;QV<pqzv3IB2v{z zAU~!n!%hx_n}CJn7S(Xx)lAUAescSV6CBQd0^3i|9Y`+KglJwg6Q@Mx4t&Jc5nG`x zkmhOMbfI{i&S!OxH?+N<n>Ly(g#yO4Lia3)Nd1kI_{-w3PZpUpMvQE1x%=Hie*{F? zL?I^-j403wyprtidE|6)&D_IX*VAdZfm{NDYI)*Qj>U9!(9!lO!t)T+o}!Bh+CUNW zs_Vtzq!S%D;|Et8xzxnh=oii7>5`Rbmj%XlKPgvoh9!YVUny}rROqGGl#@?8orOUC zUwgwJdhBr|X-G6vJ)8RhD@!D3#Yy7cP8D+_7}V4FcgKw<^Sq~FwC%=!#=RSbN`rji zYS5QN0zIQ9bXE8l72^z}v`<r9rb>*9%{}GHu!;ioLJNf7NF$NI{|F<}&@uz}-5GVw z*p}r?=nmo^=5qC7VjXBEwW=J>aZ0VHQb$D&rm5?t_vXi1<Mh4kFN%t}Gj;}rZCTM} zBY~2QC-Tw9-+1I=j6HWNz?!^oQ-(Ht-k=Vyem(bj5m0>*eBMwC<%Q3&qcw_n^ZQou zNr*hiz0wR%@YBVMSwyXl8qZUFNRZAijA{Jl%*KzVfme6hC=%WaMV4(!;-HB4-P7E& z3@4?x(5jvg4nbX2aVaYeWX4-doc%p$&1`>txpJQaqdmo7w$-x2%)qNFieDUi3l<W8 zSaNA~CFp~d(;bQcs~luQnR@1NHaP6;G<L%7Iu^582KX+`?O&W09Q>WRb%oh06!qk9 z8=2=Tav4e}X}ED=_j2Ul6h;ct;g>7qn>t_*1Gw^Xje?+jikW~RN6KvzFzy{RnG$Te zQn2vV!nspsRM|l6U$|5&!GO*{bht<hfzbdaZ%4tIgXm?2+<}{7OmC&$hI<&h3aq}M zd?nYJcV`I@zlST|Ag1DP)+ELTy?j)-JtAtiayg{b$_gvo8A32t#zvQV6x9t=!g4dF z)k@NI)8gkxLwE0wX|x#=&qIJ>S63mk$XF0q%d($RyV@CNt2sTrje!#2m@4$3$XHJI zM9$On_(cpOBr)C_<I?LSPbc%vVS4V1q@1gKw?-?T{{lODMN3h7hVA}*`pJxcETO}9 z9sN4H6q`(K&_|t^Kiz#?BhyXd3!s3)Q5HsQUccA$WZ`WZ#0*10mUQTe)9fb>1BPRQ zG79(s2ZCjYGz1ie1;+IM_;Fy1%!8AhYu+5C=>$4*=5@+da_8gb=6mI%FXF&k+DIG_ z(-CPYHfCtJ|E}0S)LNX%4gAoXCH+`~jq4;)Mc1>4G)d@!1A4gL->+QxGt7P0<STD) zjbicvhW$5sV%6Okj200PZHDz1aVHOP6Nf}xy6F{!PW|A|#z_m{1;j3Og{%OID{OJr zXFrV7fQ;_lw!!;?FOkrFhp0_=4|ntBI#cE1l~YvgP$Xfne^$WD&0NoS_e>M@|McX* z=#lMDK-6<x5X{}2xqvHe8+PdVdt)%K2J=e%&|bTW&LRJ-R#YcBV)E7Idy!=2Ly$F( zLB3->O`)%1*oOoMPC#(dJ~NM>p#)sEB&z0DtBgVtd+QgeedNd(h-LxT^!1X$UV|d2 zgy$B@I#v#pG|!I9eP%=WeLxM`yYFPYuoP~9Kzah+!;QT&@45{Dn5v4~NVL63X^Tl7 zF3|KEB(m3bz)FLZqAe=Xn=AgFsf9JCV_aIpo>q*W6^qHBfr#sNP80^+WdQs)?!55S zRyzm9Qi@FAv@VXJm^3Mk-#2dN=Fp+s?zTK${bsd-42380zq$CRLpRR0@1?38Fp|>G z-%MuJW%A}!1Zth6@m+E2Pu#YSyFlF84N0miJ9baEPjc*9;KL>8jVXvxguN@j5TL(m ziEZk;!gBIF6bFk0x;IdCxr--t@&e(&h~e?k_NRHm@<x97u1NPT5duY7Llkg}APzHD z|J=13H|(fBkv6!I>k2(VGag0!j8{%zRW{gBRNN~(c$Fys5%=Yxn{|X;&>!7Z0K&(X z;(&i}V@-Erda4AS*YHcs>+?%Q2fWSqS=;FlDbXpM$$|lwn2*I=)+2j68wXa=RzP}u z<88yPc!WqlU^Ea9*|xMcq@3$jIGI>Uk}(|}zrj^y267L|>Ze*I3ujeXeXK;__7EFa zbB2r@R7RX(z~eJUfHhs)U07QkUyA_+Z`fDkdMCNq{f+33bcTPP6waPxGBS0er!p~Q zh&)|*<KtFlALU+GNVOHyAF_Fg%{_P6n=nM6G>KJ0I0E4RC3J;84?za#4ZiOM_cQGI z-VW?yI`qC6-omyU_%L~ZZ!-2`@qt`p?)-xR&>}(vLOC2AT!#*ecX2S6SQ?G(R~@Rl zw6T5qkRaRm3>rU?;+zo#(*I4thbwd8Qfvn#KEL|c@?G;@&}z9qf1f$^`SkvH#fJb! zQy=NvJ2AB(X5pPRk@QTjMtK4PYH*iIPYN8MDrFP@f?wEo@JM9C@4AFDdhtfGQsWhp z2y2w?0pa2DaIQf%Rdn%kG8WNFn+Bzz)+k_rkht6>r?jG;@-Ld<L&r3752E<OJPv!{ z)T=foZ<r}P!Mq=_Z&Z5u@ph@=SYRc8#QGB-`}{Cpo(^Wj|5BMxp5v(BjOuBa$8SLV zh8q_|p4>Dv34dLDzMOlYS#l9?cb&`%!NC@V9g>S95+^ttb6kY#P~+)(pVdXK^COzI zx<3c3VS7c7{DKch8Iq44+Pd&eo_bl~?2B$vZmGaZ#EJhPK@4bSE={qjt)&Z(y45Oz z)s3EV4wts#G=DPvxfyXxKrc-W0&FfzLNa#HFdi4Yt<N*(OJj2KG*)21Lmq6oQ84tC zN)#9RJ#v7iyWW|p*l{dPN5vxvMsYjMf5KV&nd7os3uBs%QyFM^2`B1ZI}?H7mm%6s zrWe@iRr`~5#*{IJPUQ!~`3XtLecAGSE)xmW5?R%j#7)FECWTQR!zlQr%y>hg2c9{6 z-*eQ7zKU*FbmdQr$K_)^)G%E$hnQ5ejrp$d<qmu8u4U%<v$U(Z)hYtVvXkWTL@2f= zsf#e(ys@x+_$cAcZ<)NKi|v!aJE&vKHAYv%{M3QFKgOB0k&waR#7!edFk`r;R_}^z z8HY^6G9zI*!>G0$54#~+l=T=z?b_WdUaP~s$j3wC=wysrTNULg{L)`{Z650Hd7)BD zZsP>F#+G?(uxT4)zn<+MioEJgT*;x-1r)-d0%vRDHm(O$7(3xu$;1ll8fTX}8;*Y= z$n#EB+*?nqU4U(e4{7jl(At51SHGrqs5Bf8LqufHdX8vlX<t`$^cd_gXE6D=FI*?h z`(e7)_*KysoYPDe64LZddkeReUIL8o%|bH`)Q2fN3;N&a6rT%@u`u*JM8r|DXRp0@ zdvvz=t+pXbyF2dMjd5^>wL6UJ7z~MllX7F<8B`;UYFr`(F!Isi)y5ZVXHU5VmMRUc zBp2HV+%I3ARq@TwPFS#=+i@g@L(o*1fIS8RZ~>At<xQ(LTcQsVPvP8i%LubN-eOY& zcgM99az(W3T{Q3FyQqW4<&u@Kq5+gkPKMuNyE3!Tg>McbDZ?tb-+69Lp@cLsAILUx z)&yZNW)}5`A7B`i_I&=M%-^oWQ>t-7T{qVPOj3x@Id5CgOkgn#DsF<?mYT^1o>X0o z$^@QnyofxGK(HOOFa`Z=Tk`0S9O{bN^P%F^mJBCk3vX>`-;f(DJ49!e)18p*8&oKh zdY=Nigod5RkzF_^V${zI^bAh7N4>(({k<Agj(mmn!1BXT#Psm(o)$K-O6aS2e3o6w zQU(O8emyWz7m-J~YDCS?^r|1)QQ#J%CaKxZZ&Af08e$`JWMS2^u%~xwgAz|v-xt6k zjqHRj?>i~SEAN;ZzZh>AetULOmfASQBEKcc4blmwk06Ys;GMoaOlIK#jxQ&^xtZ`~ zVxdSaM~C<IO>Ca2cW_Md##A$1#vWw{x}hNcWNA2Uy@FUBdY?G)UF)rqVJAC%`b6uH zf*0-hM0b476yEo_yDV{xd2KnIx|O_GlatPmLz1cg`E9$9XI1m_+Uh)N!%&q8iIPsF zuSUFHm~8{BWv5mJCR~|pPiB;_$!=$c5AS|`hjQ5ule_6I7NvEbl_M<4IqoNuG&TnL zZpO{!Y7l8a#F{{zzk&_&v?d*v5IA-1`I-afS2I888SjrVrf!ymDV=@fGZ3v&Z2E%+ z8=t8I(Vx_nONdRQiPiV~w#N<R>;xY+tT@dk$<vc_d|4C~#A8=*he%kKZyjx{QT;_` zs(tk9gP&CPVujR_NF)+-x(sxOUoV!yhnnYu#pVqm3S);bud0^>J&H8MtkZr{nFrk< z(hfo6su~RPxbtYeS?Zz~G&IBgj<GW4Y&NhvM5?iMl-o)u8&;URmM2Fk!&~01NUV|} zx-s)1jhQ(`X^00E?l>3q%l8d6fPhsW5B%}`045+`p!s@4+nUWJLR$FW<dLZov2Pkm z)H?Meujp?cScHz!JcshGvp!j)i>MI#ZM3ItWINybW77DG7Y}<{5izg=cpbMy)`FG1 zFn4HHSSSx+%b_bw;2QAf8T(1U{0{j}?(CV$j8?K2j~<?ulYTc&_x9ye3?w~FlkMVj zqWD}$Rvg%_(H$txX~q*(t-h@890C*F#Ml?5)^^8|hqbwYu_di^AkU^9yh3fWhy$TH zh9tZrCL$F+g2Ex6Sw`48`tU1j$sjH%#BD58hN>%!L%-g^hff*$!<O8ot{8-y`#~#m zLtl%b?5w14VZ1qc<bK}45IM=Hk*<rt4lkt>9;Jj<gRfA)am4;4kJ8u&J5MjoTGgGa zYqd|$BJk{U?0A>D2r16yBq2LCEk<BQGs?SO|2p|95y5@f0;q3M5oG{@iT5w34}Y+& zF5xC3OJF}Yu~%>|o${VJU|2SZXwTTyw`o0a5%`Td`p;oSSIy$!D)2g%hAi<<A0?R_ zBI{=&d>SSGvM8=F0AU$wYOH-jQYMwQxCm&cVWrRGu0A0kWW@jvq;?x56&4Xmq(-XK zYHi{k@<O4L(9B|3Aej6p;&f0rcD?VD^qb<U!WiZsn)8)l=^{@y+e<t7F<oCO$qMhE zFbc?;EjJU^B3IlAz~K;7e8as$p^qL3_<bbQ6X--an(8fYK|}*i59eK50gxT;h!SAZ z_aeMR%C@yXvt(wdUoCu7ZIP)J2dPqtg^p1`y=rn$ZWS>(fY)E7BZs6-;sf?pR)z1U z1yWFVurXyQQNO`9R{#P(!amAix%YhM^d6h*Y{(E4PLA&fAI5ncP>UuF?|MqLrzPYq z^pvU$uzvNz$Fw{dKe)51!V65<!k<xe7vZGpF%0W?74Ix#E$^OyWU#c1C^^ygR$A00 z%vR^;7a+pjbPFN^``E3NifjjH(?bh54B~Wxg<{;Y64s)9F<74qJEG8^$`RddWnV`M zGZkPUs`&&_aQ4OrLD6N*AE)*^3)WpU;UrA2UPcDb$1IplXGcu7$c&QAm&{z;9L}rd z<h8W79hAf5Dbuxb?BJ}Q?ea0MTybb}n;B&WF24LMMmiS_8+Dlz*~^S`MA7u8<SwMA zZ_D=t^$L`vI^o}A^1{5I&;1lC#jvIF6+*Q6L>bu&!8HVa@<yr<mA{^7w+c=lFVx9V zLwb>XKzryU&onE5Qgeng&g)!DB4;b3L{jMeS`o7VifJp9dlkKinvd~0hXAu9QIG<( z6H(FJK{VbrbS4~<md;T{6fuBK%dLt{#@zx*-JHrapJwd3#?|2^Hwb_AWehwRmGt!* z_|g#En0GTy;{DW0to+{bQ$m%DT^7ZXRbPb%w-5lgky%_TUAGfEQK}eC;i34^zpSLY zm4g;9k;D#>O5wj`cpaHa_frR2CIBw{j6Q1TZ~s^n?dy1)vtBX?Do3qscJx-~$-poG z^QGbVbLQhg*VL^#E>Td4Ti)tE>u^JcDnR^$o9zlr%uefVFmoJOW>Z>m^>EC@&DzPM ztZmDxFK;LezFCN-^X_LH_|e-n%7k1sQf29>Q%u(3g(vT)#kZ{F!38^&>%)y#H$BJj zq|6}F1xii7ffI#8tHY(Oui@c)12H=4vt(h>6Qa7r`hi$2A4S-z#jMRR&hI#qi)DY) zN@o00Ph@4PAz4|a2ZiHd*~?nuj=?|A9z}SPH-YpjV-D_7`8BXzo&OZMa^lRxW}5f; z*)nwg8hM|T!n;QK?QiSw)@$rjT!H|Q`j%(!ZlpBtw^!_*1W_RF=S*83BvG?{Yb)dF z{j|%B)^1(;4g_SK1!Yq+wFV@&I&wLc>EnknllVy)ca-NiMOC^$2gNHr-M*+>n1cBM zT7EP2*pXU5^Nzk5mchu<=ab#w{;P4feJPAX@!&d${9W%a>cM2#|5`1i1`<Ug^1Pxg zC6~Intwo(J^by=NDZ}s?QQNIC|DO$D5rnpU!E=$45L>JII#KBSW#V;%U3X!#4MUdo zk=_?ISg*hK$b^lCuYOI;-}Nz$JNyTRvL48JViDm!KWdMgd`N{gX(H80+VltVjAX)~ z5`kO)RxmdTk)7uFjMUxTF|v?=A8{hQ>5M<JeYls}SvHZ$-(DNSal2-0yC^D+Ik3)9 zRiH8yhp;au<H}r$1i5S^O3a$d#)3awRaHXL_!4Rpl7u90ZT9xX=|iB(XSzPaOWxT- z_8{e?^=%8`uluOyUnu+RmOfLCaT}gs-#fupLUW6cCoPvDn++i_67Artod}V9)60n@ z3mS+zo_HO8*ad6sa_d|$G$}D8ao-)Z$iMH^^w3qu2w}^S#5xgrj4~_WKv}0HC}&qQ zonN_{Nt<cwFr8FyWSmD*zBp=|l5@b?_20!{^An%wsf)*ty0lrsQW6Md5Re8$-3;!7 zU+EBU$L(03QcK8-p~(BmhOQ@05KL*y*tTx`ed!}Mkj_<1^vC`M7^_nn?VTJOUA#xM zj*sHnb>G>=`b42QT8X^A;SIsZA|i|VRV>&)5(*3*Q5SC7ioA@2aqFqZt?1JeG$;Zw zSS5uCAd+eYEy&p@2GVevTQ%_=eq88XRGf58Z5{ZKL!svg`%F{J25<+&Y2uK>^2S>! zJz#clW{A`pZ3FF<;0rBTYbs4Eu2FkQs4*I#3CYP1>*5o~;<niPphc#$Lj=cLwt}`( zR**QbZ_cf8^UsQiNlUg6;_oc+faCQX-IarZ(c)TcRRXuD3q3u!LU~FfB_}CQ)IW~a zDZh`26Dy}~*Bdte0US*);wMs5kQbT*5$l=+;oa-Ok@2PyzZ^_o$39Y`PV)@njT`I@ z#VeS4F^(!jJT>U+QJ&0$5n{}!BK(wmZVEACWgCBT*df@XT5ajzm2<w<f{`ZGSW#Fg z?H#FQa}KqadKV>$;(>XN07L+F2PT)u;bws}KmtN8ejb#tB@WAGhiht`d(*tG7CEsU z@gN5ug7a3!GH=>T^bw*w1Xbh$8gsuDa&40w1{zHtaOc7`-RIRdYRF2WgVSS^lD0mt zFE&Sg=qK)r>?(Wfz#nq3<!<&f1PXQL@+~T=Yfe~<<T&=}8_dQfgR{r+Di_^~0E5>T zr*2GM6lP*mCEKJ<)$o|Opf83NSlcA1C81ShIklEprw1G`dV?C>FvdbGqpNJc&e728 zOUKH(ji=9;7U*_$G-l6{8+tc)hmLbu^Xw&Yv!;_$TGIn|qtWS0urJL`MyQx0+z7uv z6exgf4KK43iMkxOeJkpybuPrrD?#Jnd^z@V7|VLM6{na?i`fGG*1u3)!^Bo4#fG-g zcuu<BhjSak8SB_)TntQLb+b#Xt>JUO{U3r6_-sME$j0d9W#{801*Te*QEE1i9T;NL zJsWwWdwE+9RB~&5aEeLVCCWp>h#p`-E^gB(V3?@_1%LPaX1;isHNh}goD-3sywES; zEj4@jm8$Ii6~)U6t|BsCog$sE`|EYz%vOFFTLyNM`?15Of)^wD^B&&mVUY5pq8GrU zVG;+6CTBk>12M`pK*@I{_<{qmCncXNOwN{s-kIlMo%fNMZuq_Or1IyBu)Pr~a<A{t zUUn{%S2g#Mjl7=0(6n8_{ss1+tiAhFW5KX<FFV$qSjSmEGIAYcIZkXRrySb#`I|Z! zort{B_3h*?i2Tdc6<x3uVn`523ZDb7jvhi6<yGO{j~WLUveH;@C{i{dOQ9{DuB(n9 zcjq+*6?(ZHj(}WfOulUCXrVwP>&r3uN(SU>Sxw^)<7RMD6?Ff-VjM5&cim)w?4@}$ zhipDqf)`<zGEGC4Hsh`Mdg{0@%~lUyS1vsg9%R%e6ltuqh>O86en*}c$8-3PMWGf8 zB7ez4s~by6?$f;d$TNk_^-@N!$)c6+DKXPJC9*28LTKwMv<@D}ZvJ<QdeBeAsP4`p zzV|?Vm`?dHzV1H(p66uhrWuVSP2(%n{faTjmgQ(_ctogcz3<IUJ<MY#{tLUYp+DBi zAX^MuC9haJXWJ8GKdEv`-8Ch*DF^N@QYg`HoGV+XI|s$@1Q6qO3%KgMbJQy2mQgq( zZ+*Ouphvtn&ugUZ>Jz&af)7@x<Y~80)T~roLt^)R2njkw9QB`hs+6;;$?Q>gU!EpW zqn<mKv{SZ>NImi($7&U`MG<eJyq`s~tBB<*7fUY$^8|bAW+N=$K$PAnoJoIrVIHX8 zw+N^A$L7f)LX$aqpFY*T$-dHdF1;AVexr~Vq4%mRn;-!d>oqB+vGGE0%m>gYAVD1L ztM&LdSHadInbcx0b9<UQKaq7WmtEQ|0xU5?TVHk61ZzL!&bt@DQ9+@tUBx>@D*oJ> zC3k@%@M_Jfb_~dI9L0U7Vb%IB!|J(4>dQ@+SMl{s(^QW(6@j27jzGI&(^9G}{XqBB zSPJld9Vc4~L!a@{@6Nk(%V?zQGEI`e7PwapW8OhFIPkzx@5c^1u+YvmPx>1DQ<TPK zD@1KY>o8}iyqYFWo`Rwv5&x;TfE^Hv_{U>h&jJnU3(zhDWN{dA38#>0m#|%YC@N&` zvY(gZ5;T6Y+2I77NvOEcgE;xYJh)I$51<6n^K@VVd5}}xcPM=dcww+iDl@lYj~9qj zKm}a_P9(?pMT3Z|`$|ENOfYn)hIeyirnSOSVm%@x7-T)40ReG-p#H>mjaWddj6-Xy z^X3bWzc4VT-sjBwjA0a4xS<1C5<ZXY(>sOY1f6@zB)_0a>kHNlNWxf=$YPz!&c4;% zArcQpph?N&T)R9x6f<XNqPfcNXlcj!)7sQJiR2y8(K+HAiU!M-cUo-QP&*G1C;HYg zY^kjfO0d%$11X4068ys0eJlh;5r08bzh~3<EF?THv#*F*c$16A@C_|Nu%2iEG%?~9 zZVEPr@1jR{-Lp1qu7BC1c8r_|EXU%)(UW+se@hs%d4}X-b&mN1+mVEx%B_#i9)z}k z`3X6p_901`{LuTFlaSS3&1ualsh1?X^s;)aG?uuWO6<aIbiP50eUvo!Y22ADP5tH^ zNY9|gienN^TPnNvd*&6)lzV~yCR=CjH@8f$IyFRy>g1?0>>BjToW4Lv-KDoD1gfV! zUktO9261?397_pq8Tg*UtKq<_)mTj}N!mG-^r6<ffg2(}=UA?r>;qNAY_5d*9x<6e z2O_`T{P(_bu=*h3aOn$f$nQ}#_p>RIP}R$1j!tk^!s4YxRE4?vM+Ya`{z{(((_f2w zzD<-Qp?3$ol7isBP0U0wgBk@KXC90vgFdn!z{4US1-%w|W<+Jr;g(<DPfZ%9M|#{% z1Jlx#GoJOFlD!%yp2oqL{%qMphB$tBlfj-9Gp}8(O?`lTW`X&-u&|NII@kpn)mon5 zvmi^#zab5BuA<Sl9ODevs=lQ-vyK;W1=73V<x33E`z4)l-$2ZP7f)z!&thpCQxENH zFz|NWCYHGDGN(z;4-233_;(@i^&+nVHy-T66I&iQJ?%Vdf2i&#=vWTw9JCnBhR|OU z+<y&Fz~tmW#VsTo;Lk;?-co`e3fiFMmr7{~?_K)fu!vAVi+-n8y*_`OO`UTb65brj zn~yLr97djmThsC?SX80o&xc?B$y>=}f^|u}v3fjDhr%f)ey`Aw?}G}E`+y^)Dk+~4 z@-W6C2Bv)r^OLG~CUHha-nk<#RZ07)ao**m1tkgR?sj6X63&)}v$Dj<S|;*2b=o3D zlKVmTx_Ap_$@PtQpILb_5%`7;#TZro*d_D)IbJ=H77h=xD(<yBD4V!DuuN^PA4t*e zhuX~Zs_Xcu@^I}^K)EwpGQ+~0>M#p;Z<Qz#)XcAA(~AYwGXaaD_>`~ebJEI8nSujC zM9*S!-3KGeSbe`25bSH=)xaGsUmnEqaF9tE+}lRRoTWmy9pF^4O`Y-<MBne1H_Lf` zCH1)AGng%=E7ITcz8|^=4k_H0Y#O^qbu{ZW$V?vCBVUS;^cgRI+fr#FzYjy=Qnucd zAMSV|2_R`^E@D8<=a-ch*iZA^fLF77ii0d;aAn`zhSkl#C)p8Afvie=X!guAF{q+n zNw;fpmFVd~OzT%?esfZ5U##j#PlC(`Cv|X5%|`}jkmX!)#IKCXpaJE)#z+KxeGsy* z9s+Q?^aYNsIoaO**oUt-Hs+2a^|-G`K<H6L>zLvIeBDpt9BdSjbiYXsAc8f<(c=M` zYO;#K=t%)VuQ%Ywf_qrqI1XBs8YqW5iSOS@FHZjUKTD6QZeXKOH~E(BR{M!nx1U;( z`s@1-Bf3@??MsQ3*-yd8sS$Ofs4r^m46XQ2mOHgy#(h!hrT;wx6OjvmStta#Jet1b Ov@=+8S~VOH(Ek8$Ia!$i literal 12548 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 Vw`+=QuWg2Ii7CqBQ$RpK{tr^IV($O| diff --git a/images/retrieve-analysis-per-url.webp b/images/retrieve-analysis-per-url.webp index e38b902b8609d6f14c1be5f8ea7fbebc42c286b3..a5559a3e011a6200f04ccc275cec3605aad41856 100644 GIT binary patch literal 16886 zcmc(`W0Y=NvNo8uxzo0dowjXrr)}G|Z98+PZQHhOeW&_X-%<V5xm9P}?{@dE6)Wa? zW6W3)@x&8j%~wHOMC6Je06<k(Ku$%D9e?i+c}4^%3y?A!bPkAT)v{WVoTQL2FX7Y= z01MK@`b&>@nB%447oR6JoJs6<{u}uG24vy%D_PvJ8aT(p{`cE2<L<{ZmhJDD(Pb%F zy)l`MuQ=YjhmQxZY5miLPZtTB^5sX|EIf7IH!pm=?-!zvkgt+=HV55H-u9Q4qh{?K zX)m&Es_Aa8&$LJA*OVPuF}M3~vJbp)UJMqXr{(jS8k?T)jc@*qno^(e@4+vu73h_m zitp8L)Gxu&mQUU5?0j#Z&-<_EmzYt!TKFT~?T^oImz{`bpC_LtAAs)J?=kPm_lj@b z@Ac2_Bf6%Xx$ecUjSrBo{>QY>v+wV#XO6Bwj~My}|2L~dh};!kd1^`{H?Dep`cx@W zWXQn2|8arRFm0+V9*z=CY9Jm|B5s}e;={12;xsd|rz0(|TRjOw5upA}$%)HKn*=&( zG69~7<BJH|napj&sMnY{06f^zct7!!H6dOZC|i)$=yU%C3p`~UpU#CVC4Z!jq?w-N zY=fcJXYiSaktsUt(c2FHTW2Oiaj?;M?43e$D@krk6n>xB34y2YJ?Z)V0d?XLf)V5` zu4qkd%R{4pYVHZkeGx+^rFMO(bnKxsc&kZ7wdjKNv7E7!PQRr}KIzm0w$nVaMsmgK zT*=s09b%R@Q~(H2o`L=_S83re%{yNP!4eAeNmyQzN6mcPZn5k!mQKm<e1e++xDkF< z^ngTwzf=3NXtDlB(L!S0Sd?mmo$DbV<aK>tWt{K35Ml0sQza#GAYNRmOxRHiSu!py z>YR&^oF(4Ns|69K%t<(Gz&9R^k%{;wB7d#V{$XY0>Cb#}R`?IkrnoFJM`5tu@0jFz zroyYxKZ1FCw<O}2HH(4;{>7s)GL_Iq7@#w)t*Ke2{bJ4yD(f`3dEZo?82pC;mW#)Y zzZr0t2J8K5w`TmW4d{IjkE>(+H}@3j#M182F(d(JoNH;Dh&|4?vP;g9>{r((=RgB& z7?^vc0X7WDKhX#qjTDe(iiJ%A&e-9J`_;8q1KciHtPy?L+A>i~!HUrATC5Lgxx>er zQqnB`Vs#}$W~hP{>|a;7V<MsIWB7Xvrxl>7O4>Q^`vl0@9QxA_qW2ed<w`v$GI^=r zE&wAB*MyhY*0W?>;+n*wgoMwUrfgRym&yfgDyMjPVZs(2{j|jwVQT(+tB#h|1HkD2 zb4xR<?EmCJm$#MuispSr)gw5!T<E{?=|2p(zVO0MBt6^S@P_z(aKZ2H_`n0dxZ?Hq zeBpxM{2L|o%+I@jm!0l9{WkwHrGHZ=@~*mUnUfeP`#F_D3oWed88A>2zt>D0lVC61 zAm1`W?@=x9%v2dS`iwx%Pg}v2PV2t(K8vF&)t$5cr5Nfq@BT)8nB5?HA@O@H_x<EF zhDb$~_Rf8c9WJ!EA{J-ohI7tngssgr>F8(xXa18H`_HL?uy>csru$G9j7>`7QWjEw zY(nqFWXrAx(1I|BOb*ehKEWI~21KXg087B=8?l(#FD8{s_-I1^-(0-)i@neO>-jpv z$~HZxVe2G`0;6FRNZ@iC&_d=V<+@fjdTRDj(e>f#nea=M20bG=iGh27&{axI=}m{| zO$5~HqD=i?SHj=ZPTo^NOhbh)&lD7zZ&i9K&zK#HqGweGY|NHb(XT!eHgU(Y1o*#F zVh=ZDvkQIXg$;ZEz?(uZ5u9)@`LINksHmVzi6ZCmntteTY?>Lc_xezVn1qIjRm&PF z;?jO9WGSVe_P@GD0auQM(0o3&hum~C@adc*G$6nIVFl)JkW!wwB+I57fce}<i@P)H zhZa{mfEaoFU?!#X0;6xm8x%(@bLyj!#1lvzt`P-xVZspqe;4?lRns3qry8De<|AZb z9f4jifER0=<k-ft?^$WN!l7pC9q=H8QcWr=C@>|D&*sz8I1GAj9DN>>?j`^f=Ai>2 z9o7yO$xr*N=tYP*M8RfV?CRCSfPX&!LXC!py!4Y?&a8)?@5M(J{By+l&kcpd@l!C$ z@oWvuH*BL4#f9k3@V0y(@Q3f(dQscEJGcYrg%)A88zkd5$UU0KDe3MA)`JC5FlCRa zqqOfMp4+4>gBDV(zJ39N{S#dLZ&}?iL6OTH;+9}p^#NV`C{M4fHHed_h+ax~w=0nh z1@y5ehyMxdzrbtzeSz2&_O)A`YcOrCq01%@O#ZRc2e+U9u@M={d|Q0+kI4C-e*7cQ zN-vU*IOf76Vh=(i`?~|}`!j?N7*LNyiVz|GAu#;-KNfJmR;ZBXvnfdN|A2IZ%gw4a z5^J@W0z`Aj{^OeVu^1+}tIP(y7ybQ=z)QU>)V~OS-Hpu&Df7P4u+fP0sYw2@;3^#~ zdw%Yv`0TO@Xt*Y$i-j13jVPr%PkTb&Q`QN(p8%@+KyGtUfhwDx>JISBU42rnr{72g z28|97vjRVt`2CYA#<pG^<%bsG84q(&XaN4NdLq{V6qtcR^Ob7^3i@YdgKxI<)-XN> zIY-j|c8x~P!mD*!D><G1YyO<LjsLA!2?$qlPn5>?mP0IVglmUYj@|zj=6{Y(cH@r( zBgzu866rC_);883NWb>b3y|0v=*10tIA#^B70o`^)K)scj~wy~H;U)q8|&&^;U|uT z#apFIp3MvmZt&8k!V~N>WUuCi26uRwvQSA6S##!bO?wYEFYE#TC^GFyuV_^;C2x7N zFJB<Gr{a?7-o)0$a>VfdGHfXDBRaFt-In)$pd}Qu%Xja{!X3Qq;>ey`DgH^~zI$SE zlYlfTj^NldKH;+|{X$YXME8bNGsr{`oysFj0b@Y)ihsQrfY1aPB$S=SX6y>a`!W#z zJ|NWi1*xPvqWJt%eDs(-c3tg01EsfqW&gHG?AmxUi;7qT<a&vIqgyGDhsT18boCD& zO2`Y>2|50@_g`V!KcXKDt#<<2J}6)S@usYw0?iWdf@Urg&^Y|o`f}$*_iuOB{!wM_ z+A!LTvOMvEgf7eL<RR28!V#N{uQw7WzRPP#MB#m;6_t3jFLjPEo<<f2@l+;Qg;BAU zQ^|kLRWSQ*CC&*gvB$ZR5Vi7`>19%E*fM5Zxp3jZ1Bf|xAKFhK^ZpghnPCaqOIi|I z;Yjw()5adboplD3Mbi0qZAag=$SLlxb>jbEQ`7Xt3A1JG{}tK#6UeBfUEe!7`JMI` z8_Yij12%C*(gEt~Uvubx!BPq(Bc?x;+B~jVkm~8&JQ~bPlj2k;knArcHkwv`18B{X z)=q9au|jQT2uR_|i1l!+Wg|k(3bg^cQd}*{hU}G@I;DA5v~2&KN&bm*e?&wkZV!N- z{G%^|g}sNz;CNim?e+pLS{y_sx~E9MHyr`J)y3_GY1V~=BlH&@tY24Zo;Lu{??SeL z?~5JV+zW(b_Uo!{e$EzmfjB=}<_k3R%V=`Xa;EG;0E=QL4S81NP!T$w@Ou^M7j^h7 zS{6v}=^lhPP^zyoI%=}_o4a<Q{VsK0)zFV?{pPV;*XJISvJu{&)!EPdf9vo68jt<} zDSPq@f#Zi~s-Sw|7>sZeDRgg@KtuZsX|<-k=^uwiXYhrg3FTaD*IG;(Sr~Ks{oarL zEM>D<w0~Vi`42yw>2=edeEmx-<?r-<o0m1in{3_*+0;jed5@?4I3r)XQDr)L%gRc3 zmt^bQ`vX*x54OP*puveFgjGhgc#sY>5W>;(Z^-o@8T;o^`}??{euNxU2R$XvrK9vo zGw_!f&_5)ozYs{fOY=AQ+YShxCB{aYM6@96T^Ot@PWOC&gL@#60L9i+(J3RVc<{Li zn+b6Hq48UQ1&3t<?9!C=6u8US_#@bo{VFL|Rpw?U+;vjQ8EoZYy%cLhW7C)Q1-mQ_ zfP+Wi5{4iwIxyGyx7$}ownKoAgAn2HSDGKE^<SBNW?1P6M6+YN$L-Be3O3B&*)4iP zReCZN^_Y7qNxQ=1XsQ3`MSmq6t}ooT@9N%S)5W?WmFCJt?L46c+XR8j{l32!(H`%~ zSMEl@tOtcZ5K5y=k=pR$JANpRp2G71yn@yXcd#`6*<AJ~aS^^`7S+YJMPR)8YtFGt zK*9PDoO;yR==1%3JpDhKF8_Su{Zo^~vaw|_(&Jcp!jdA;PK9}Ro=ZFueM^yO=i&l9 zua%xjK~+C!mf{1w?$utYpf%_<t4JW;kLvDJ&>HnxG$at8Ck+oOX-q$T0lp>y^>^2h zy`Vt0L{rJZe#=1Qe3bW=M?uh~73@I%D7*2h=_EnyJT0jEggdE;N&yBVr;mDT&|0xh z;bCMp4}vtF6TB7P`PnC`u_oHo^5CV0H`z_#(0eGs+|{Mq{yD~C=hI7L2YIVgkrjB@ zqPT?F84(R*xOr%lkI02wTrF+=f~DTCcaRpZCim?}pv4vSt<kw~p4{5{<DypWBly`4 zNmm3hSqE+e5NCku!I3+HBlqo?D6BoUm(HIycm!^5TD>Cy2`1F_?!(EpeeVUg6-d(0 z5T__Ff0?wycoMB9&kusFMf|~3Tn<XK&fk3<u=_L@3jhauBk|0=(UtAKt`o%)Utx<V zs#A1(zhNUIJYN5Vs}qtxS=^-(5fN>8P$`8v6Uq0mJpwbJlmwJ6(YJPw4}ES?BzW2T zh}}&uaW_OZYy7&ka@nX^-lVtqNh<C}+x8oKErXBbq5fX0X^XzQww+j}TrghF2Ibi| z=I~{F@5Ay~P|GQC{FkayKYrNaL?NnN_=#M(;MYNR19EWTThBXM^nJQDxBi8^M1Eks zXR>=a{i0wKG~`fy{&L-|t}B!!0i2X6k9#v{Q=JG{U}b4$<W<Jn0Xno1L^?i4y6C(B z?6)k{QW9aPXp2d8$*CH&RIfv-1?K`H#+!k9Qsp>hadbSfhCc!@<Bm4(bX4woll$$n zfgA`idcVIlQB@Gc3v55-shPZfp@}%&lS~T@WB9r{sY;J9+mFb?gd>f2Fkp<h2WU`S z8=Q62JN+qSx7Uyp?77V&DYf}><u^5<3=BodRmwckC9`*EU(Q<D@`BS5bNlXz>LOOv zV*q%%zLN-YA(K-Z2>l+{jikpl*rp08V2ng7%G`<iP-9MF14s-gI30C(R8(KVmcAMp z<TT)&FhXgE9;NP(EOch(rherVk63169ya2}5>N=!*VHDz0n@<Gm64amjd13SQ<fKU z7bjdcNQEvnF-r{kQwPXV0GygQ<os}kC2WC3Q<{T~YVoviNKGkcDb)dojKa&0+~&Lo zj(2OfaHz*F8Iok^E7jjg%2dGthAJH#nZ7x#mTVzC)b;_I?SN<8+^xrQd|~doXuzxo z*1j`Qr0BoxlkH29P<1dpkyX!V@r5@t9Yg?KA;~T5BLucrbV4E^SPGwi+P5{K-1(<+ zML{J}6x{G~+A=h4deTy-BgdD*EsO(Qbmn-`CUmo?T-bm|<0t78%s=jqAVOMnRfrQb z)yVE)d=Z4_-ORGzeAauvA*ZL}a#t{EyoH@tuP_^j&Km>yBT!=!OjA*^bL6+>!h~zM z0GM|yfbucj{enxMgiz>xTR<S%i13E5p|ve7nO|Q`Ik1$kDc+Up#P`O$y~_>&GdQ?h zX|@4{Ai@z%E}yU1L-jrAh#(nQ9wrd9opAN*=sWYH;AliuqS`%8!Q;2wnb{a3o4I?@ z<{V68_TQ+*1TETY9l`MnULz>b-XYyk3QlUTQ@~WY8Wc0rY)2(1vcCAAQ>6))=K!>L z*luJd(3BoM2TpSZuz5C28`LO29VCZeFQs}98J~f&Y05~_iiR72SQFlsk<oJ~(nwb< z+$R!a!%KT(N4nW_8gwIv9fZq?qMFlfcc0|MQ1OV6hoB(M_uLha_xl5o7Lgo`K7+*M zhB3p_TwcGJX?TQLs0e^X_@zsl3nE6xYexX%eQV$;MTPS#Od*XMT+M{n4_-dugGf_! zR`M%DoP)Sseazdw`4$Y0TS?Rs=c6B*3=Y`5SpHu6mF`A#^Yaj|?b`XX!7KWZOQkat zko3Y|p0^zn@Q6Oyigc)NL`}<;eZ`maA?aZJyhsly>K;FE65wN0r@9vqtp==@fi(3& zCK;IMwA7}d)I5P}jS2&2LH~k~jZ-ev4yHo_0BV8VH<AJGS9x~l&HZ+lOO|f^9&Odd zPm7)nt{2t&_st3}qVwnl{?cq`__6w?Mp!9w;!(bZK7Xmi|DKqzm)YZ>*@$+p5w0*~ zY&^Fy#2RTuFvqV5dJbajcJ-A%;Fc}<dG(cNd8~D=qtHNTBo!9NNGddvhWtM-5)7(` z{m4fBUI(Y4pyBj!=%D1et~?iT*)i782~I=`S0#b;WVAJjRkU(pISjptH)uIQ{|zHc zhDgxJZQjF!FfPY2shI`XBOlO~$}b-o;9(LV+E@YV`2{^}6y{WB0_GIGO<@K4EP#}x zDl=>N6XCbHVm$YDJc7e?WMp$6rs5bg`hYw#ET~V{Px6@L+KZBf(<L_3=0i*aoG-@r zjuArfWp&vOB}GLGnR!HW1#1|pCM8a`pw1hcA#k({7P#~)^AXSn57}xe-Rx1;p?<JK zF_Pl0FMt3VKe($<X(wvY2hRCOu!~;dIR9N%OXITa9x3%VAL%AZq;X$@?}w?8wv>6g zp#c*K!&)^cKZaH=U%ZCwQGi$)61+#lO3JhJC`uk$PZ>@NJLH}H7uhxo5gc8U?(SXB zs<&R+#&s50^Wab)Cin?JMwOnU;g;K7xE~BCJ&J(rhm1qwUb^bIy2}U@G=U=Y2Z=6= zC*MH{Rlql-<~*LHLzdB4b^>d`0Ax*%!eN0iuKiTpV(E@%c~c8RRiYmQV#>f)iuxq6 z6oot0H`KhUDG*V_g>$GM%=FUvwH4UEK5A(CwEU~91F79&W{y^I0tdBf0qp=hWD;BH z`EdBnkSpW^v-AnvyU$qgl5JAO1*q0tg1R+nLL0-U<aeE_*)c$k1^PnsJI<=!yaS>- zLh~c^1G<k7p3=2bAFyba<`jC&qD^L)81<}=D|4yB&X#13@sY`}K_1fx#p&Z&463V8 zGJfc<FJoJB*hr@bJ9O1@$)p6<w!T&TG9#xGl$bFK$4Y=E>(Ef>KXC+7$u37S#Re%# zF2FuhOgOK_{|2^|6Dz#<O6M0v^PP4uNQ0!4BkiKWdYSCp^NP0YhVVV-IbgJC-|b86 zn#X~imQQyaG}bU-<&QZUi4|C9LX<TuYlHo5)G$716=HYj1i|f4k^o{B6QH!$*9ew4 zB-AjhV>a2*6HVk`&5CUSuB<5&c}h!^+rj}?7Sci{yMEpe5IHY{Td@LQp@vk&jc?%3 ziU|wVS+j0aFhJI|ZU!^QA8G5L#m&Ksp8Zlu@{_U1t^+3+Wo#+|+dC>YJ66SQzdwuZ zDARK~T0p6psv_w%dh$@MwS24E6+3wHkMBVYrBXK>Ah#*DYh&OcXU3`2ku_C4mx-jL zm){5t!L7)0>tc101q#?hpm}${N1~i(OwQKROr#E^vWW1$2fr=DQu3X*u;b4dF3mu& zS_=G7d-r@@e-CU&{{q@*R8EDqpH<PL85dUfZJ|N^|4#Mdphub1s>fSL4<NSx4b;io z(Sbin0rAHsfX?U?vnrZ0c(fExfpopLv8v1#gr%hhJ7R4+Qu3+~gtmkvD_Eo(o}#dW z($WrHOzLPzB`rQOwp5M}jw+gcbpd<K^q<MW8}uXn?PO9|xMe5hxYf2JOO*uyfMLZ? zHQbETAny+NDwD2a`rpFqDl(hw`zbd+mGfQWBxNxgkZ}rU@MS@zsmJ(U6=v3rE2r)T z*%FciN{gq;v~|QiKv4~O3kz!IR(Qk4!A`TEUroCSyiR@#nc4*>1t+x2qZrqH7|OiY zzVq0@t)*`kY<#n9B6;*dNz>^oP|mS_R0G`#MCyb=jDna~mf3FL>8pBBY^ablHn4%d zZB&S}qnJYbmjv`;dUNW>86M&Yk)+r+jeaUTljRAEqznY#U;<ViRa@?pZH=cGmVPB6 z9N)b0lwEdyvAG91Dj*FO83Q^ni<?3^$Lfy-jhy{-2V2x72#oK-jW1_im6twTb-Pti zU7hJ>ffgPPzl|C$f)-*XLc9ntMRFe_1a(9d7_Qa9W$)v}IWyrDm_UF2b+K<iS~?J6 zHCIQOQD43`^e9&k&<&cu({@y>tH6a#63iDBAhP`Xc5(uY{QZJ12DLJ;B0>LkTf@^p zwr`i7ve=|*63VEozc1dFK47+&d7-cei2jh!Hm?1P#g>BUv79vvG{m{6dq*7y$Kp+e zT^EILLyQ#4WX1PvQ8Izd#1${5j%#(`aYwrrYx!qbD|!U+r`JqcBZVL|<pexqCqMFx zz5deWt6_-_FFb8l5fm-Fs4q&rP;Nt4QNU|f*c4H}b0u<F&hLE%Er4<kbbJ>W&4w_t zZ&Zg*7^<JMjjsNw<xSHmTM&<1PK|Z_7+82KKMW(EOBWRZ(x$I|qk7QW&H1phWjRPv zf>x<>4pN(q?Rs~?iJ{c~@lug%SZL-XG{BrMJQn*JJI{7CbRKQ1=-hv+q;zUgNp4l6 z7G0}C%{^BHnf;pwJjRksbu(<?e^eP5dpy?SI^A9j{w?Fv6`RKF+vOVJGRl}#L<>59 zS2=_trKU%%8b#$nqrT-#uSvN~w}Z0bu|?QOH40<TAUe`D1bXxiXK#O3K;D;v{WK=! z6GIT?oXEh=i4f|x?6f-dI~s$~=lz<{mpW$DCUUT$%$Q&8?O{6Ikx&+TVBC36CmxYm zywftTmi?}PS(IJn`+^qK?T#8$jD5L})GvT1#SYwn(vt^O=Csy8pTqbHMo_=<^E_*q zS|m-PO#ui-`+c@I8(E5CS;IKY8Fu%IMPE;4Qe;Xu;vnI>V0Q{ErK+rL8Zx;E<fwOO zugE``iST*)s=}<0UzI96F13=2WL*@Q?+R;pW^#YhvhV6}G-AZUb@PLMG?zM`JjSi- zlU~(*;&Or63D`M=I2jWH-uAJ!K22)oK-mv0ku~4X-Prw#fzxZU<{4zzceJdJwz;IB zoxd5e86{lunwMSopcH?^YmQ?5423plpf|Hgh~z46WQWMsR{}X|*QQku-HFykUGu2E zKaMBSVRezQD{A|UdN7_zH8#a@Y{32%+t$g#$g$luY$uLh{AfA7gfzK8dU+Q7jj%r7 zwZ{fNc6c@lWY1H&sd#!KJWh^$7ZL&h=CX$PbCvHl{mN`5Nrj@XPSQ>2w@%Hr;(P|K zWTW8dhlB3u#^w(_^z8m8`|zLofQrrtm5ivk0e(sp<>hgX3zr{S-hgbZHfl3tKO8>^ z%ET!V<&YJ0R-9FPp_-ZJb~k59SaTC-%9{-<%!kdoV+yn)wLBHsbdFtdzsx0!P_U|< zaaFK66OQ%dwVW@rXDT5v$q7)IKC=qaaFjNO4|?tS?#jnYJ6UjXAXS-AHP<%YJwAwT zbt<uD3YH%|8E{-mYlE)x`t?5D-mR(FB@>lbYqkjtmFTQs@wscHQ#~0@bZqq)bF+VS z1&x5A`Pj>DnwxQ;+8v>>Wv84TwYk#|Ab#bC`9Csi^*Qop0p0`vHi1DVoMnV6NO(5C zN5|Ja(LE&To*xL?%5%)BL;}Ex5CIQ}=E?6`xOB-bkrYNU;>kAzJ8^LhwP8^uG+tpu zPRn8BHx1aW#mV}?vRxk%HE}iCeNH;ik=h^#?DK4$PH3m*bE&<0730J?qW;KnD@>>$ z@GW_S4v*|P=oiN*!$BXh={{pD_gz)g3!+$#Wl=B<YGR`xPXNpV6QEv$@k^vB88ZMv zEJAnLl=mRSXmUq_o6U*GdbNg4HQJd^b$K$-Oi%$?XkwGE;~&}JmxOn2%*1E%UTY4K zwn(tuPi{W-20pAj&D?(z_{F@Wmn0+W*U593B`K)gtW|p&M}a{X!g0*xpu-6FbwS;1 z)>fX{FfK;)F0)79oRkp#<&g4Xs@S9Lg*-nynVa{UO%>rtT7ZkQ-WklYd>%#ajp0dJ z6*;QZz`=IO{Tq8Sxzt_{?j5yKQ(l9w_%sJcMC))AsvOBe?XyDf^h*Z#aOTqlc!0aZ zIj(E4=ze=JB>I3Se!}f2D~h7kE$Sys(zeR(hFKfho+&H18*Gzo&o7>fP}Jso-U}(d zMWg`+qesFv1l)`zrLBQ1Fnc+I$E*RVLy81*SRlA?Q~OV=FL_q4HlYkoPqHG^O@i?9 zWU2yIm8bGm&o7-9-<u}pf<2Q6Jlt4OU^6mITTS>-#_(UN^Kc46&Yf++;h$HJ7y6Pj z-j%_dey2m3Y;>%j^Qr+qS*q+^{o$&+3;KHF>iX0#9Y*2AtcS}y;Lu1Q-j-QOn_uSJ z4-J7kGvo1JDVBcUAqv|?wJzWM1jIZBItED;r&4Uh>T2!m`m*ZJJnj8S`}0B*ws078 zs?g-U==r{1U0IKUkTC%02$Ma$7YkRUS^P1=Rbq2;OsC=c)6$S*r(fJ;jbNSz>@+1p z1_?Jqf{!?T^d8waJj|^W_ZA<QCFa@~wW;aX@wfaet%V;+d;9L#v4u8E>!TgcBb{K3 zYbi)L0m9OtTjGTs@zG}-9YC0>Y_O#LgEjgI-HzN%*gg`3=NBiLFJpV`+W0*%7zL4( zbOJ^w*&5RXN3B9$Q^<tl#%Yr+!YDXb92rb*e+rb%W}0s`p%||S$CoYscKR9+1Uea2 zQk=u_r=#=Y9C;T&(H9M=*s+H~9YpC^rE;+Ryr6H6kWX<z&2wt*R@;{gqBj(fM>6RH zX}crcAP@?&aMS*SM5c$t;7h<0G37LXqlO-q<_t$07=R#~;*#q2a%}Rd%dF|(-k!}h zS@I`EJc3ghore3!OSyo4)8tH~2-|#`+HcA{WC>3XyO;Vl_D|isEOhK#c#RLN;J44> zTA1#KZBJD!ez24|1P+_^C7L1LQeJatK@@QF>k-f2B{9=5kHiZ=_}8zf=-a92E2tq{ zKIHFRGp<3<`QIA%gm7RYT6Wq!gi^QnIN9+%(dAAYIoliO<5`>cj$_n9c}LOMo-?zr zY@@pLwpSo=2;CH_!(g0VT1{EsKBVrCenBG;kZeM+R7@Z-&@w)1X5o<<cQ-DeC2U*9 z6cxtMb@<i&^>EBP8$Av??VsZ5-ji}=HV=k^keWni(D{j%zqInj$>y`+W}IZ}zddYT z(7%#dkiXw1yVdu=noGYYeC|G94X3agzCR<o=9RDC#?HoKu3iSNsmi@ScPw-su0CXr zpN$MD2y~*I&}-W8_OX_0(+*lmPLbhIo<PcsHX3*KP+e%sPc54RP~u9=&8Z~qbK&PL zh+%ep4*&*Im)+VD_CuhFzK(rE@4cpH0hVXScvNr#LMCPwz-NX>rY0?JxNha&(=~w3 zIiaXN5)@oNN^$o=RK#3ymuL40wz-VD&dXjhOcR&bE&*Tjz%)!+rrG)Tp>ek@nIFVH zmM-pks8Owg+epV>tzo86CwX^17SFYq<_7K92rEWOeLForD{Y4_86k!2N}~cMAh@1P zXGT!v0yk>dcUO<Frk_E!{XtA-p33<k9u-Q;`Za^|Wd-jmnTw>2r1;@!&R*oJR8yfe z_5%%!IQI06G?3ARjSIKYpt-orojBrsM?<6oYLOYE5%ER?5)M!Gj}`UjM>3Jp<zU)} zVhHNAS#A1T{Wgq&>tXWcW`a{4B>{(CV^bB_pcX3R2Y7!p;vUm3OT=;0Zx()nymlP8 z2o-j+AKNV5uLySJUkPPgm4r2)_HW6(tRu`y)10K6ZW5ujGU-mR2`^1E!IKNdIq9!( zf#3WNV=u#fzb;$7zc8&lcY$5<QTQ@_f>cyi#yh;~V!#;ZVU7h$JmI*O4RONPuop{8 z=vlziEt4phlQEox$)<HZ$g5$igK=mU_k27&QE$N54=8`}fJk+HfpQAYLRzqd5A$Z> z!mtED-^7N`wo4=O_}Zj<aZ6<jl*+q7!QSF?VokdL!hM9L2xoGUMmIHkbiPlwVd^!S zx)%ivz}aabKTS4XUCT7BvIMi@ebbP_%af=kvpdj#1~@$ne=Cc};f}(2b$W*U>0$I^ zdw_86)#hH|Gyaur$h?HIf1Ci>hg*}|>w3Ch=deiEplLAJ4R%BeLknyyym1)e0AwRo z$2dQ2mQb)7Xdjp~FkvM%yGj!X&33Q3Zc(s1@sER~icZLsbrkDCKtd`J1rKpSrC|Nk zRai04Bwsd1Q-q!gU~i6^ALg((s&C2ilMxi9`{bvWZQbx+%x1YBmY;Ia*P#mR7-YS9 z@^9%ZJiLHJ;ie>K7rI(D`$dN*6e}vedT@fi7<ck48Yhsd!$Aj@q~uO2(89zpL%hnl zuxR~=s3ce6N4>Pwy$0#U5FJ}sZHOUy4yBP#d*mBf=_C+82XDk*Nl^M>Y9THG$M;{K zu{vCEKjKfaDg#2F_E736AkMRrgkT+UuW^@>kV}of?N7oiFwv^-1Wk=5J{5s%e?kfG z&BKMD0+@`}82Szz8D?Q&*kE1Z`IaoEbw}|x9{Y-lDcS4tpxlaMym^iZjs7^`5EXi^ zyW;^9dPD?udn6zSsvDU!9(kpR{qnKWtk!)(#)$}r>qpVz_3Ozcn6O5JHPc5vGzz4Z z5i$_ANXAqk;Q47kTDQo`LQfW-3uHQ%>n^cT3CbvtA#Us|2Wj#2;n(4QV+v5~IW{A9 zHByVbKW-tm9uP&*VWNtOiFVp}W=9cNR9*&y->EN_)mw3iUH)-Nc}%F#da#C1$9I<l z85(Na5Wtdd?1k$hmJgfS*cb5%fCb*S%Atn^gY!5)cXo$~`YV$RHY~k)7cn#ti=Z{g zVywK3BNEAgW>kYDtgw9Su;&+{uqN%nZ;q!XN$!g3R{f~t%=LEuPVg>Tg>B`Khp>89 zYPP4zrtJ|0@GRC|M=FTywNX}OWq*k2y25?uY)hR`44uT1)<a&kh!gURa$G6>l6z`f zZZ5F;jI!Q{%&JX)x8?z=1L@u5m*4C0hS0`{hS95D7r7!QdzB82(rU!!1cN#wPD5s; zw)!iyIFJ!Q!auS5_9UUuEP3|Uuxa{nD<&m#=*8bnDQ!!n2=8ID(y2j?)=yV(h(+JU z^m|_SH|%_TKSajn2I|JN8|QQ)C%(XuK1&*t$q`Ax`0PFAb>Sc4ZBs=g40}Gae#Pce z%ycdQ&a_w$ZStAHR~cv2Qp(vMhXHb$wM)ykEoeZzfvv1~?~T_qJOordbMk{Lx3}$l zz_Qpf&Tr074rkHrs%Q75gpK<Oc&%@Qh+d!mJmlWb^_d<7C)8AKJ`&;3?B7OqEXFL7 z@@A;j1*FnEZINJAI%8~)5=~I)+yB_PKvh&EF>_eit9av{e^2U2SifOPptP6_8)qq) zt9Hq4*8wSsdp|`zZw1RWTYjV%R%10K)3fAP@Ez?CXkU_dqdEBM2SGR8=0+dl!1ep( z)&v5DtwCVcZElB3pIJ1(07a@XGoGTYv?be!-{q*bJ2A>{w8b5(-Fty4G9-Q==cEr< zK4hh-{ccN(nhVE2F7sT(RzR8v%>h!#)0e|W_#DKR<%mTTHBD=GDVeN5uYczdjRRg1 zpl+6oxz)P1Wh~TmelBNgU)b=XdC1oYweG6cgKapYTE<`~v&k^guIA309%Vm&tC1@T zR|Rgsr!Jb}&5MlbgwpCU)>e>P>%=lEeml1dPp#|0V93v)by`d4@2*A4Y4O_4jVBdD ziItXa`v%wI{L4JmEQ>JXS&Dt?8pzhpvzh6TM^<LYrS=kfExl{$gd<0Fx5^~fK~^<Y zOJSWYs?fEGjrQa2)&2V#ZImjz3CAE#*(JOCSHwHa>`J#^Y=~{egpmBjs7q?;l<8~G zLz$yO*qUq?NBp%u;^@VSl^6B~yF4mN%{|P)0GeoF3x`a9_t-qW2cBMoa0^qhcATPb z>zN?i>@UiATA>A<<xl#f5)##@?U+II_oQ4SE(1a#rFb&H31NfP6V?fMui)|8V%R@E zqKeLt8z#}~If=+h`p?To@*Vr(K;MOWT@zw)*>csND5T(&nb|DA)QH5k5l1Vrx!)33 zvpwlfCWD?xL1O#&606b1Cox($6Cpt?y~5hFGP<XVj-koT;f3|V5wEqe&9r=e`sluU zTy!~?5RGOww<O>%?-J9gzWs63zvj`W;#2qR`!C&K$q#9odFmLghJ-$A#CV;wan0B1 zhESNLl-i>2SmbSH5IZ~}TI?>^p<RiXLV}q;hRVML>2v8iK{D3wHVuZ&{J_qiXuNRw zeV%;1Na{K~)yzCH^&<qJGZJuJtl{-BL*q;Po?3tv;v-QIJ#YVs$Pg;38CPQrHK);! zQCCyD@xXU-oOjR`gLZROui2uL`#{Nsy0_UP@@MsncM}di^D?Q4eUYIzC%@F_Moj(A z)9!`q%Uz1Ro<m!SI-X$755WtXP=dZvzU$SE>9oaB4sD=nj%90JHQ-~J@3zMA4|TEV z1(7&S&xKvLu^z8w)1Uw<WdvATI25bXWRs@PNoVR8xR3Zerb8i-Nz>7(3wpqaBRc33 z0*(Uh8Bc|33FPbS$=gxI_|0F5O0IXq1y7;HSrv4b$8z?XVM!uSrp$KDkJ>S=$6y9D zI(kgKsxknF3z#3=o9r3&u{9A!=LHy+q7#|TV`8ZZZ>S+pa9Hy7w=Bd1B_Vll3CK5P zJVe}hn?L$IBZ3^w)X#rL@{wT{&;yzK@}s+qt*(-__p7L9+dID?P_RwxD$Eb64d;Mw zYvCkbpP+jkA=U3`%emfDl;Vg0b*{lnCg8WXyRGyv-*-`rQW6VLMc=9@kBN%2v;)rf zE%O~tJ6ze~p{Iy7j>QHsblbD|VwK>-M{>{4j3!s)f@9FY6kl6NdJjDeB#nWqErR+d z;3$U0Z^52puC`J^$M`28G3&OB!gSE1mu5%IR!p2;w<RIF`tsA)kF;IU<+O|2B?yfL zUAqMpPJ)9;l<aSADl4)9JppN0UhALN)-P^d@i!+@Yfa_QHn~anFI^C47OT#bqPYAl z*#nQ5ZikaUt10p0DsYYZrT4Qt52TRKh|l2D7KzgJ!ogx)Zck#aCgp)2yL(MGnTNW$ zmnawCc5Byav^MK^$T?UT3X*z7tV%yI=zI$Gs#rej9gpDszB*?nz`L2@xT>HvTBwVr z{^_E-z1_vvlhtdYQ#W_Em4H6CKU1Y637b<7w86;_=1vCdQ{@XAiLk<G#82g1J>VnN z^!)XzGx-5wK7h-Y20X)54nH%y-!h6bib(keO5$TjeRh*m@FEaYG{<y237zNzR!Fd< zH3HKu8~Y~9T0D4^4S?1floOz>rWN#PhxwH~n#tk+FRG?M3j(azW7KBT=`ZB~+q@X( zF<@f-tvlvo*sDR0K)C_^<%Nvhl^OifSmb*N-H+fta-Ds^a)#+{RVs<ZH9TbUZc1?a zBm&o!l&GxUUv7e!bkF0f?RH%_VZ&HOL(6H6REAvY(6D(Bj+o|KG7rvhsEkbG<Xi@S zoGs=kR$y3(Wz>UuBEz;mI-a<uv-?Lc;GFj}>%!z6%6SdG>GB_x&D==Bs+(4~8Gn!? zHb($|t%?;HEuig^wGfdg->ygWMRGBRr^Q0=$2X8;i|`(Ffao|-IgKZ9P&|1s8r!+& z%;9x?^GBgE?CfJBGTMvc0;qN@1Dcc(gN@So)@^e#F+Ud?DW$oGJI4t7vt`L&at<fg zYz{fa0nIG)@s{~b=ETd11Ks5TW%cFC;>2&5zWi*h*9b5+nLa$uj_FC}=w9Zo9IAn~ zo-t<|8~PkZ@-!(XJ$dx{p75~ZOpn>n?EwICfUaIf<40BkTgwjYm;F?{@lR;ftw%!o z+OuZOKYOz}IULaSs4~$+s$FC*#5@mN1k7=&*?B2DV`>>}+h6k8N)Jo7-VmfG)GBit z<DK8LkdmX~t#)NK^d|Ja+TdAvHRHJ)U?u4|FnfUR-AN|pu_xv?qH)%*$l5zuZCLE7 znJ+!i<Me3~`5A-R{>;zzygTe~bTK^ED&*9rSr$cmT;}&>*-UAlL#q@KF1YlBht4pH zKodUHy*e#mpBg(KEl07p*1q+|9H+R>qoAwdoFePPh$hPM*ukBKqd*-gu^Gdg9PeWx zoUQ!><x@F;-bBAksrMCrRifxt(QRFbu#};n)ctCvQm$fpDiC6*5L4*me$Xq5AZS)b z;(V`QN(cm>n(Fv4&oM=A5hMa%)}yZp)Ed0bml*(9*@_73mg3-v(Y)hB%#r*$p;Mq+ z2DJLMnEY#@pIWNR%P_0C@XL<)V1$Oj_~4?^aK`n4Z$4xcPl%Ul@a4lS{alG^r}xFt z5b{neE9{$jMNvZurNtwls|pj6PIDAj0rH2a%=$LFdOS)X>du4mx_5E-N){gV>Y+!> zgt!0^?D03t*LXJik4+K+xLH<}*6i?03=ehgl3VlXp>N`Sb}HuB5Jg@<*W$93=TE6u zeC;VjQ>-hDQrP3bpv6xO<JPA4-~82wk0^0(n6s0O5eU~Tv}&1aw6pbE%<j>w$>bw) z=nq_{N7*lw`rmvMV4+e{%4XufqKNY6Vuqel;H?S2fcti%P7EwFYMzCqto0y11wN+t z^>X7mEe6<%peW_YB4v?&FSqL`BqhlCv)VBN7`vr8FWUPoF6r<WfqUk02$cBsQDrFC zW99k~yl>qBtfk{^6S@k+4Qv||s><rb>ytm{SoLY|+{K@~x<Y)Tz`6@n;|yxy1bS?C zZ?_UYnl+7NrBsk$`=L$-K{V3oy`L*T6bgdkMtvY*jK3A(^=3{gNC@moJQSxnBwc^Z zS>kkAJTBgL(tmQX&Z7)LH^lYVh?C`ws(KW@kp4p36s<{1#<<C{Zv4ql`&D-zZk~LF ze(ue`#Yz#pfni5<*Z~A_<=wOKGU$?r3t;Z;S=a!Q46wSh&8DrDKoSwi(LQjx(q~tT zdDyMsC9i|8v|))<utLg*Ly7RlACXBU?=F!;a_=L#ftR9`AjEK$N7it-UJ3;Gqzy+J z{^}5gyS%dX=>>PEIzal$Ud*;VfA?*Kc!7wolC`I)R%3eit*&0v)3IATVd>uwgJdDn z%Q>(EgqBuwHAU0cYL9t?zoE+hCePgGz3m&0nJ_<kzI~O&q_lIB#wE~~%vXJ$o@4)G zU9e;gP34dCl3!#&kuPHW87e<PfD127B$6WbII!0l!>{6OJnOpQ`Zv&~(|&M1Q0d^H zIH--)N&s%3SP!9Tl-P5n$TelmRLAC)V_^+<+ndbWSm+MiItg)>v@rmxl&XuRZVVX~ z*rG7>*+zYSWD>xvpg<;Dr=l-Qur?d7?L9jJRdSm*|8m%yQL{IGFj6J5{VmE*lyQ+u z39^t&i1(wLH69k%18o|cq5Y*GDmap&-B(dj{=h?>roDFG2DNYs5c-f!N_xcK(m<Tm z`TT{vU5o^57R-HXrzZv?(!;teS^DfU=^`?o>LgPE^hwFAicV73u2EFSmf?ZTSlNdE z9gJakMEYnmAO``hCKReDbl-4OFba*iFydI+(?OS*n=b*ga)y&<YHWc*bX1`WVrf`R zh#iADL@<Fc%2l#1-HUaz`YUGBznzFxj!4wX6Q>`t9r&0P>)Sy)3@90@Q0aYDA&b1= zTJfhade{1B1w0BI?0|{8EE>5!G!*;P<^CswPiiNI=n+I{<%&Xw2XS<4g;GAwPf1v2 zpQ7cMJHEgaA;HM25md;v>^FYZG$m(m$QC-J6K{#s=*y6&O7nef-e&r!EsovErB7Lj zAL^yRbKQO$H6Qau=u9nCD+f&8ohM=RkRG%WyZu9U)0;78qU_LF({Ar*C9Wcf>q>he zyQvF~Js}5lBDm%czf@V&BC>cG$X6rJsG*oA;W(|=?M)7Dei2T0$qY3Ne_m$uV(gJV z)!uEoKh+VD{`eRgw-L#wj;+XO56gPTjFkiKFw9QW^Z$5t3^-7jOti=X4Y*0H>xWyK z85&1Y?wM!k>UFMOKTS=B0Abvod%07I@Rg7$IC^gM&!cUs8oo)lb*gdKfXczuVFLT+ z`%((=^%-MAH!RXHo8qnE^9AIo-K@jxsNeF=aHINmC{7IIkfjK%DnkaSg90v1NvU0) z=3MC8eeGW~PX=(;x~gx|g%f&{pEgk%dt-|LW*A9JG<QRs5IA^+cr`L~z6-mB6&w<Y zILPJks8Jw_A8Af3U6$iO&)|a{%p94eY_-T<r8hU!)9c(>B^C!_7S~Uav@hmbuZ6wg z_M8nD*f1&Z{n;c5z~|=5Qk_k6S_boJ7jj$$?O%CrATa;n{HUBjM9?O4xBT00U=NgT zD&u$a6$HlEE305numc?p?XO0u+@XVE%(};#KCD}_X*gNJ+t9L?(8Ll_qu+HDq#{pb z5z~x?slQ-b+0yJVt*w&x-gIJE#Y*_8wzmDO#P{7?Jb<;+8yX19kOYbqJ}Ik_Q0jK9 z@^K&pWL;=n-;+DM#&viOYw+xsV_GeSH=6dZG;W{&w&2{Qln;oiqMg3grYG&hqswab zq^Qno%VRNm@7mXbxEmt3s&P4m&u!jEBX^)J;^R2KXY(9cenM15kp;C-jSe<fi<23i zbpsUUtj&U>+X1<6%!vaCpBrQEA}^avG1|6fI9O8_GZ(=S&vN@zW-WsMq5ZIq{tEo4 z7L1$xb}G8oKAfJb;0DX&*yeCW-g;8v@V1KZ#6T2~u!cI}W=&2atnExsrHO&$aZB-m zfc>~Ke@`BdSA%M+{aD!{#(9md#oi|DK)LNAIy82-<DUz#c7@X&$j)R;vLAHN@mR_T z3?~w>a)Qpy;Zg2zkPXEE1_M_$ubt{0zbK<~kQbkmNiQRdBX$(BXD20JMrA&qr*Dv4 z);yawy4aAK3*Aub!?qchy=$GuRx0d>I%c=ovgc~zy=TO<s5<H>ttJx^N}R~ibgig+ zop&Xp#}}sS)Xj^vb-Mh0`WU7R_c>0nuU@IkbE{|#<=T=*Qscr20RK6z87oUne=VKX z;O`7$O-f`{DjvnIv|ImiYpQEHUk%%So;Bz|tEb7dGd9#bi3D;)Xf2&JsPUr#WAG=~ z1UJ_Fdn^_x>6sQ_-caGxJ1cOtvtj<hq<&{A5x1p40pKHqZTh2?T|#ssB7J-CKxFD4 ze@*R8qDDlKrh`=nu-J0Y#E!(Z!@Knv!jm1C(Aw$E<&~n~2KtWq-Mz&Q4Tj%7+*#7# zd~kBB^Zibb;Wyu@D$C=CjyE_^uIQ)0<c<XUv%}YP;%-7sPkh<^`-Z_(b^Hz@7*D z)&p$41-|asVrKh#q|f3j@}o+osje@%>e8Ceyi}>ClYj#{p)thEf+UKD>mAYM*bKUT zXWF`NraK2ai?Ps!enJcAY@scwj_E?!PpSddDkmZ3`LHv|7*lZ*PoX;i)P;nVmG*${ z#|RPG!Io4)u2+ayNi(vG)2T5ner!E{61h5pL?U%y;WMQjEFq*qP#j2^z=*$6o)JH# z+<z{Il1QKlAr(RY|NH>ztZ<^;c9(ASED1{$0%1&k6EL!(_vicb^>+8ax_IdU{4ax< BhtL23 literal 15098 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 diff --git a/images/retrieve-best-practices-per-project.webp b/images/retrieve-best-practices-per-project.webp index 86452097cf515792d972e87da80492f8fddc1027..a308cc5033de180f1aa3c3db4971826863de9f57 100644 GIT binary patch literal 8160 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 literal 13908 zcmbWcW0WS*vMpNZvb)e_+qSxFb=kIU+qP}nwyU~q+s603eeQU7+=IQ(J@5U=v0`Q9 ziinwW%@`|FNm5Kqh8+Y%O;kuhRe_UG@E>Dj3eX%-YH$cDFaebCZcSRsl43%|@Bn{e z7&BV{(06IBNBlYNQ{d2V@qN%WZ_n?kZy1<z$8dc6(ANiy|IR(hnD(ppTL8iV#9zCP z;GP67fG@y-_qjKLcY+n*5)gQ?H7_vew*sUA&;Wts0w@0%-UCyB;y@rEEvD|BV7+hL z4+tE%p?HkD(|ZLD`=z~u00IDiUU<F<dgreFtbu!;3Esax<=5pM@)m&uez!oP>#$EG zK;MnufgkXB^~3Fx0RX%M`T^g35CJg&65!Z}{4U@<Zs!*Gk02yKf4|k2rqm{@cY){K zB|Z>%JD0jYn|YOfV|PeT3^zN3JHlUWpHPpxTXXqHd%Gh7t$woK!+@Ea<1g@jtz=+2 z5d9tW3F3?8?e=x|64;fu(=+)V@QwNz_c>=+cd2W@2hzt4)cH8S1O2D~60DTn_PzN{ z15>}FU-aH@-}*lE4h80X*L)xWZr^!;-M73a-zVP*V5?t?P8vVY=9?ez66L`=-4o<n z1lxxMczphR?)45OdUL^1x%z0EQzsw)?HLAW5MG}K72LDMZomj{7A>ShF^>|_BwqOc zU|6?&_P^IdGz*I(dN+l5dIzi`KfnCC-}+I}ksaFYhuRu&Q%dxY%Z^+CzvPGfqHoeu zUhy}@xxha+-cWi>5S6)nM}C8a5^`=%--Ue=tO3Se1RB2MuKdh+2>*x45go&RyTW$r zU%Uraa<q4q`OpUhRh__=?;PCZJas}M)}>Pyc|~=)EuLX=_v%;1+|ZxzO6UK>-NHNG zkrm)xK<&Tlo(dU^@4|$VzrTAJ9;51u!Rg*l?a|k67Kt%g-AtFFVXj5pINz#bQea&< zCA9uW(qMCPTbop8lLyJqK?e4pI;o_FG*)g!O@&ImfuE#o1aQ@=&Qq{WZu~gu&=SmE zr7=g%JhlOI(yqyuvr1`(nQ?6Wk1l@kB;7cQ-mY8OSFh#0qW^b5{~gq(yfIm%QTL=n zdCr{LU-y0yIKCxBERwK7rip05Go(~7nG#B<tntO<7DN&<i$d`k#dxxo1a8AXJ80sE zEfPF9$cqDu!_M|h_nTVsT%M|kve<t%u?qwvr32^SPfA(us6}*iYT7A$|Mjol_rFW; z|ImUzO>p2GoQe=Zk2-ZSy_@S{;bx6^{okOgqJuM0)%>r>wh=!hyzu1n%#5Cc11|M} z4Sn)%Sqbzi!%Jf>4y^av+OoWEYN+yffB)lz^xr6LsA%u|&F*5N)fLKw13k5Tv98<- z99e+~T26c0|E5gyI*HB(5E4?Tu`eOQ;NNiLk1t-$%RQaxVV=^wa%&uI)ZqV!+<ku_ zU;-em-yis=u%!URnU>x#3nOHmXQNjS&|mSxF^4`e_Th6t4(Dk9ja2`oXcNttz(hD; zyRK;d_5P}sP%(S`H$$uIMzS+HS0B_rWv8wV1+wu^p~ATsqPWuKTb}>5eg)Q|z34y1 z)A;sSU}o=@;}!n?pTz%noNpt6w$vKfvAe-WVEpe~^K<O+zYK01L9P~9|24D!1^H9A zQhWUsNBN8ST^`wPS-&n%tadEkSEpCImmcdf>O9I$^_Yb#sY83NyOP*EMqTL!vA98% zSZs8m3<-<VS2e=^MHy-mhkM06Q;7Uze4It|#y$x{amWz_c7w(0Rk#5J6}_q$ApbW8 zaj$Nl3Pzjz*Y$1R!xna6Es;e@{i^++=uE@g<%H%mo*tu$*y}InOXe#6qSK$#s$0Zr zH*)*Al>b3i{xbtqk94X28Vr!M#Q@;(adH0DF8ufV)NT18v|ap^6c`P48e_H4KzC3J z7Zzf#%}W!wzpwoZ33jjDT@7Mru$>+seZc<iKi))oeITH{aRj#^=W+9qKafWJpTsPQ zuHy2;3Om)v;dlf}aq2)m<{d^$Q;kJ@;pF@J!2fT_{Li(qrrb7hY;%9&$%vpKeZ~bQ z>ieyQt_d8V;L>HhaA$j?Ap_$A<E~Ktm)`#8hc!$zqcg+7K%@MYz;f$O+`3wLH<WS# z)&Ihq=N&24jSIB(A8{g-j3#jYjmTIB|59Qy&Zz0b+gCl7|5fh)Z#PgLz56_A{Qn_( z|EDqDp0t2~0A7=Z9B}ZGW;IVXlbkOUCG)Gi*nOR-|HhEHh7WOlp$I~mRr6{IVg9wF ziF9wm{8H%W`rv<}GmGIO=sV|aKVmMSo0;ksPI;1@DaA>tZF4VRga~8)>kf)E#WyV+ zhB}fZA`(}8%Sr}=x<#Y7$rQG55>fm!5J_<*Ql_8^w|Sjy;*TNjbre(F2s{*mc+eKy z8%wJL7*#_{pV|;FW=MCk^Cs&kvErmu_dc4Hh`mLtZz9^eVGG>em8j<mZ7GZdXVBGe zl`TrVyYVsEETOOV5sSreja<$<Or@P3SqXgIfW#0Sm#!3u4rEsCVzW{f663S>;*nLT zVH;COw5#a6!lvz>z-5IgN$Ae5TF?V59Nz4L2<5aD8xceqzV{xfp8BO<KL7*N=i^IR zR5vVF*-Fs)=F>#lEqs=1P-O+KV%9xYsJo2RPxJf=9gdweHKRCG2iMUt354yrg-d6| z{yaBWpIC<V838?xq?t=(!dNsD5WEb;zEi{KY0kR`w25BWu=ZVxzj^8Ih5JeIYvA69 zt7^UW1X*EHhW!zb7I4cGW+N>-;(z=J>z5t~>m~znqMB`99Q#m$0o9mMeFXeGT#9E) zy>Rl|wj{*69FwiC5cmMSOBT&YU_I%vyn}&gZOep2P4=-82=NKiew9GYq5gVbi@30( z)4`1uF>8gO^V1uUwa5bt>gGNAgDOZ1Cxw%Q;7klUxqGj&se3WV=`8Gbr_S3ZUvcVf zNQQm!YZ(jE!{6<}m$a5!^Vg8J`HIXDSK_=CkuJODe8tt@p)Jhccg(|Sc$OL4{Y(n* zzS2@uc^qnV0S5WXZ?$lef|_#~m@;~MIK$FpaNqpTrCLipsw*WLHEx!{7mo2d-M@}m zrKxxJoWu79fMsS%ethyKz6iGsSe_au4wA(BH%A|@3%@uBdR``;?e&oy2Q?e=&p-#l zVvBt-{Hy{OwJzzj5kbbgic>I!Y^`N8$l^AAEnaMq!d^(03fJF?U=v`E-HWz9EHGgr zd=zRNFMcpD(q;c0eS`#@9nn*i&_LD1!sb4}$USc=!@AEQdHpml{@w&<CvC5Eb*G2H z!lc7JrL`mS?qw4~MlCJOZ7I`fbv(cYn2e*@*g~J?-0nr4!H`5RI4{_ZBczFey!Gvg z3D-;<xEEVJF~qC!BI^q~ob)7u6{_<a8M2FyG3JWT?$9+S(X{g?8Sc+E778p_BT1+7 zy;EbtuSMwl?QPMd22oCfq>NE`oc6;X?s5c_&!0SxhqJ}a7`l_O{Wx@tK?glS=pl|_ z0k=AcJe|Yv06h~)G}6OD8f9$3+mC2}KFa^Lyd9%$gCvI`U{-qGh^y4xAojOnIy*9| zr9=HaX%WC?;8T~Q)2ea`51K6?zf|{*e=U8fE400h9beJz`-=QwZ$51M^u%XVq5n6Z znvFanM1VB{{9D>%K{%4vgK~}=_AOHl958JVJJ+QevW_*YCoWf?-F~NUZtD?M0u_AP z1a)QW+@CAD)Z_nHXVH{T5Bb9H{yVFYp7M&108e{S{^HM<I&c%#RL|E}ufp+-HUZw9 zN>WcF3xQub!ifsbV02%!;cz_@N(^+0z%M_#LI+u81+86dF0^rUMlMWjiAKjQJybkj zi1K9%du~4~uhOk_$^Bkj=(9>LM6WrJ^fivmFfPSmXygcJz{t2k3(BXBA}_}_M~?tS zW(8Lvn*w5WZiJxQcmLEkS<s8cas*kYR@iWgC@!he<usnTHe`s#rj<%7!qXiG`6!cr z0CQ&n@fU%epIO}xnpuT+OHH<-GLd=XH}73J`hyzZ_5)?NN(96-Nm&`z2Ff0pK0;|m zm02>f^Apm%y?ckm5Lm{CbUY#w2jb461oK!`7WgU~muGFB%~LJ(qF9~49%m&z>)gOq zJ_`wAm~|>Y${d2$#Odf``tk3GFceZcZ(@|2S6+}fw-0+d7069ZkS_LGg4&iRu4jc` z_-SBNWY8TR;_6na7byyTQ6_(Y#Xs`o@bF6lcex_Wq@CmkV(&AsMPn>AX2tZJn0(x1 zOu>$9u89>ihjz3g%u3PL6Ic<|*MRRr_G5!3JEGnE!II`w(yvvjxLc;M=PoD}&`@)? zp6*1Z#ZNBOU5cR(I<z)X&}O?v9ZzC38O#med84MEWq<MUK}N53*j#wxU3}SW->>io zpB01^J9@hvj)Oe{o9ySxpG%AzwL2Vs`eNj$h`!7^zY=XAHfa-&35SR4NA)w1(2y!C zSLwWsqr8v%(mODb7i)WZ)KBV#VxG?Cmy0>4xH;;D6@Q4RI~m(Oh>#I5A`ym0Q#`nQ zY*_0JPahOq#awte3SuhPIjWvFyO%f{CrT0Rx=m5w`g6&K#neF3EkAx#heZjfEx|5< zcZu9&^b*JmbHZciKyC8+&bbzBc0}0{F~1eV0Z~bk_wc@fL>pVMer?7dzzk23x@~_Y zg(tJWQj#s;GlObw1RCLgXm5iCUbniBIpuJ@C~DXJ*eZq+P7yCk2wkP8HVLRymf4>9 z;Nb`hYkD0MM0+Ch$(`B+q~eHjT$<Hs6Gf#ZN(_l0#+XKYqWCd7w@nQvcLME7$B~X5 zH_=&E;Ctl1<uCRVW~+0cROS4wM^soq5IOU2A>n?t?K1<u2{&tL!wvfF&*Eo;4{+Xh zHPj|NPgE;M^1qDU&xkv_uUeE|L>F}I;J9-sINXJTi{xh<^gsJ!wPk97S=!+HRr<<x zA)B0#>jg&U$U32}n<Sy&AA*AR@Nkeykjsev%$9tAE*V^5H8l-W&x<!V2u4U)Ap0os zAJ`<_?R81RrkV=NjrKkj)=y2{;E5Zug+$&yU54th;Le8752ClZUQf7|u*=dH2md_( zIYW+6ELHG(WLirl`uIzb$(w{0J_<#I7<kj~z$w7+;sb4?oreHY(n`&CepAjLFe>4K z#~8_C<5pce>!lUljL<R$-DRe)>QddR$yI_&CGfz*^t%w#8en7-m}|$eiO3<i|9&ap z^(Gi#hXHrPr<dA8rmX{&DLe94p2&sWu=LM+XpdN8v6-^~G1WDT_=m7qn4z2Y!--4Q zx9BwvekY5yOvWBDoIn@~6;vm9n9iyN*Ffx^Bc^`uY_7N2=A_sDRiH%TAeCcAf(5!$ z;Gl-vgQ}Je?qK1?nZezyZ}GsGhG+55UsQ`=b&YSYgH0{|7D<^YZdF1&You~0cRU_} zBmQD5T}+r!ONmTtR>i4AR>52HGafXr(G;0!{%CAZc3-_KBFxl+mN*Ruzty=Z-iZ+} z@_jTvRl;F{Q1~5LuvN)ytfvQpjn+6-Mv;rmUR{qRmR~pv<)|{(Ze%$-POb$XlE`&u zXe~&g+KJ3y8>`KZO-VfV`Oc(Zu^WsuC69$ary$Dvv>If+#Hu3?QBVg)Q@(VehCb+T z4QMTH({9`twQ_M6VU(mM50*nFV)SZbQjPGydLy52;ME`jHO(k<a|1tdG$ZGS1+J9H zFQK7^!4t<qEid*N`qLpFwJGrNi0rJvn8&AXcmvu6MIy{R4>R$WOahxoGSjtVQW8z7 zY7CeyI=WjK(soHExLSR{)x@+2*l#6lIl#1=Y^$@>@B!lT&4O#62i)aEm<?A|BbOTV ziu8^aY6>b!ll-3Rcb4FiN-V9yol>~J)W|U?c9c>gQ|W}V8n_g$1j><xc?`oe!74Gt zF!VfND_vsmV!COdq*x)8Tp)XA-z4S7u9J;lik%;>;g(c}_x8ZqYTc+8j?rM~;%|Ke zm)|b0bEG$<k}7TRbeU?tz(W%kiq?DP3bI1xAL$ysg_J%)CE#3P-XAP%Ev#JA45196 z23#i6%62xx`v^<s)0Ktwzja#{gEgH;Hx9r}KF?~CV>dRcWI<P#h3-g&YY}rgR@RU0 zlbEcCkjxHvFb8@-S1{H?aUTe}yl<J9X5BafF+dT?O^QThGCU-Qq?bJj7ENNk%bBz} zP)WC}m>2i}$4v#{Ab5xgGQh-o{z3}*uXuYn{tk#VR|rFY#j~@1k!62LLZvq40C1OY zMor|<TEavs)rq7kLYGNN3es4ojV=3qfcq|ZFkCVTi)-~I%j9&z^@e!3Ti2;O(g79B zx{t0^zt`(irMass*e6(Lg9A77=}f##jqSU16*!4BW~tnba>*$ilfkE0jry9C69WAu z&(-878DKsEBcgnYYV!E@j4D=xNP{<7k-$x(Nwfl|0$CCbL|~I_Gkto<?_D;Y^{tFm zvZg_Eh=h~ISj@_cK9bY}v@VQZy1**}>qtPZLQz0G+Drds;5uj%sujr^e~qvHznb0E z?LV@Si4bsLU-A-ueMF_zX^fiaA=>-bc%aIn9PL<_sYRMaY!sU;6b`S!qu0}{=Fgg- zoPA=588rTIgi>6+UP@c!liFo}DMnY8wB1fPVZJ|DB?jB6mBhRkSnPCff;t`IU&~97 z0J?Ca;k=8*Xd<D<7EukJ(Yh%!7=z+mS&KN!t{OG%hAJY!ydh(i6VJt}PY5sUkyOEH z%!0;6?%>h}8A|o|!DxYm)&u;h4PVa{O0|g|$vH0&HwS4H$pRTG;Ac(YauBR7{?^Be z-;9iHN=ikN9+JI{uhA?QsUGG(qiYXYC_`12f=jN4>aGY&G76y^ta4cXwCdK?1?m*l zeo$3}=2gOSbreX5@^kz&RQ;|sCGnvSy8Pw_W8*Y(Vh)b$BOr-L(pk4hb_v&y%}q|K zOVPlQZ$7xfO6_WG30n|c9fg1E_9U(C8l0z9p(sSW*?sTJ0Snfo>hPY)s_>p+r~By# zc5UvrTQrhtJa7+cf3D+qBlxy^93{rmzjyUUW*1|OK&;J;9tps62%|$)ok}b{rOD#M zMBcfdQR$S+PoAbreeG=B%^z#QH$f%f+FE%b2cg}^t7@ee+3ENd@x~m-*vTcD-|L<a zF~lZ*(hY%@MpuuOKk+Rle4kYryM0N}F9~jlGts;ra&COwkYPdD<-0^C3XGG;?vQX) zY86SZoyDsz6(Lp*=+r)zh$-O7TVcdf^0#<b1tpG68Ixc<mZGd<*T8PpV=hhtZ9&^A z)j!e!Zx+VIh8fmMbq=Y&9ouUR=<A@^Q%|i%TWp|l)pk+clb#+(-SyqyU~l~k9D?!6 zDJs^A!C9i0XTJ1W6=9GHwsib)mlgc-p&aO1?1pvaABtbhWQ-_eTr39@!FW=dLOYAM z(g~(y4#(d!y#M+KW+qZT_FzSs{Ifq0QBZw7fV*1Ag#=bJtf`OZF{F!6wAagwLq&J{ z2nRChAN^aOTrY*)WgjU&yQ^<?KjC`-i}Ux%QvtVZ_5hX9Fg@FYvoq$OkqU-PZABfZ z*gxF-NZLEEo%`XWKN1>_=2N)Rj*;+WR}_6`t6)rWCK?^(j8WWwzPx*r&V`sj)TKzR zEtLFVO+n_27VdEht9DJT*UbD&>46jJ=hFe7GE^gTNWFAx^D9jcdFZv;?euJZF8iCe zdmF`{N6}&P;KUoDBw?7ZNOhr+^!-kg%M6ly42@U4$9vHgzy4mR!8~SKwpPkkyArU7 zyJHnFWfjCPxV_YnU|b@5i{*+O%_P6d=z@0*D`W<1kY)jr`Ke|NCe4E^8h5$wM|O4J zfdlNzJ<XWA6bnB2$kGnD)TZ{NsfgM(V?4q<?`Pw;I~98QlO8-9SKmH5#nhzoxE+x? zBD)W%Pw*2=3M^=9q)lSOT+0r?`n#W?n}b$Z1_#r)(zIR$l~g1YhSFV^y$8J++Pv!y zPKcm)kyX!yo$j|xov|LY%r^cR*uYY9Lm{&!y{$tNQnNHzaLP}^d`~SO!`!-gwxnx5 z@);{qCntyLvT%AYTX(^P>+EcEI&4(znoVstEoCd_negYjR*`LW-%kTS`1rLUvOjEr z<r&1Jl&@<hl7kX#$U_0*ShFCMt1e$pjHnEgc`JuT`wsU=btBl5B*S5gx1I>HJl5ye zY1NvNCGQu~FsHC7J%8Nn_1b`N`zDvh9*^Zp1ev3P)gldujlA#A!^4pJPOcIcaS8>= zpwhd!?4NJ0IO<`hC@^$ffQ-P2fVdv$HQCN1y(nT|E+(mvre)mxagv`CF7Gk;FV;Np z^w{$^1Inq7a4;|ZcHjN2u-pV^Y-QG0jKpKi?}hWOqpO-#O%R3`Gp~ah<lmh+_hf#@ zkZRP|XOBesAB&hV$v{C20aM=kZB<&QJ8Is$t5elyFn_|KZM!z-LFxP7M`9i_I=4Bg zQKu$F@`?UfNezZ`>y^wJDFYuno=_CgLcIN#G+Dt<hUq_zmg4q_Eniq)L&kJV(1^Nq zA8l{S`DQVsA76EPFI1HWZVca^g#(TM@s-C@Pvhn;UTt1jlYG{v)a^J8&)~XHr-1I9 z9Et?;QVy-+iQz5dILE3cRHv}JL}}7eKJqD5GDmMdqSVdhTc<4dH&}Gtk5c7_O5<_4 zhTl{Oh)35h@5(o#s-0`Hw14}q|7=B{Z0}ao9W6ea&MgyFVO&K*r5jX4(L?gtUbUQQ z54PKg$q?S~)Ka49A)#bSbUI9iGtg$>xeQ7{F7U-f6G`}JffXAx=Qe=lQ9&ID{A!VL zRc}$cfa5iES=mI20=pjZKG83SbOcX0XhgEY_gV0#R>%{SwPyZXwqRy3G`y|rD^t&| z7P`GXVQ%&uuy37zUVbdZ(S1Gn$N=Pp3&XC?Z&)$mox5=!nR20wcPZl4`CAYZqU=d% zbe)$OkcLAG8|^5Wo~iTO6=KGT7b!iQMmNBr+C<ZWTFlMyYfkOjViXzaFitZ+Un)~O zsEu=B5eF`{TYC$<QB`hO@-W<lNA0JH7#yD>UN}=A{9LFrR!n@I2Z13GxMkSE$?e5! zRvZGy`L<bM`lxvn2=8<M@H)qk=(8j8t7ewqBMJ0`t%}28c3upT3I$4rC-}RqhH(`F zfOpFm-(fnWIK8S+K7CB^OYV=}hDW2rU}Zs@P}}GAey7<HC?<xO;^`?v2<J~e-{n2` z<cg`1umDPe;;y!@cS)vd735tOl|1Iaw5tKdk-alf?W?@znEHV$q<aJjdHaScdm+S9 z^Q%$yvXG*f7lC5J`1O27kR(HYqR`pOZjKv^>D(Q!zbaz+E0cbf3-R-gKXPCP^bUC- z@R<6#$%WHbquL{m52rHW;MVL#MzL{we|6scG&+r7|50wogpM|PCGOr=f-r5(ZV3@B z+O>qCa6R}fttJZ*1lf<hh{*G6IyYEmSJL5E!0HFk%8fHM#U^+2(h)x8(JTMuVuCgH zj{vB2zK0nE<kVaTUm?z|@#)@Eo`0=eRX0x6Bb!Hhq~lgWM@;C9U_*GDb9MYg&>M7z zP$o}*Y4;B#B8*Zk2~b~X6H5OlvStHU5|iBpP^k~^G@bTr^`7sKG3bsk*3uypMf*cv zCG@V>`Qum{#=>CaBw6s-(ANPxy&jrrTKQx+%qTZdwdEDc>k0DY^W#4Pn-9s}nhfn6 zcThN|x7Qbe#D(eG;kOv^Nt4q`U9q!;>CgRZgVt#8$}|CV+(FwFP<T-%@<Qb5&u}kV zU!CKC&w_vuVOy~q1Z*M%hd{Q72k5_%jBnqUa9{Lu*kBk7IokaZp?lw85w?P>GkaVQ z2F63wnuYUhge^DNzq}VBwp?A%N{5V;c#48zc7c&U+6_fg&-3Z;?0@8)?up&fgeLWn zgL>M{LpQRzDP3l#Ka-I3KERO<hvX^+my(Vi3+NKOL;kcv+KK3RJI(5!_stMh4rDWo zHl*8v(3AIvjE1WT8ug?e-A-+zy<r>~{oF=*WAPhmo1{FW^tXF==c{cQ1hI8p>AqLV zh6YW>9eep5w~FK~YXWNah~`l3*_!l2%oCOdU0}?>^*r)E`KxHy%E9@K@h9$UY#g6A z@(@7T_R!ZA9_^=TeJIOAtkAwvOSfz3$*yqjawf;np~%)4&F~yTHVTU<yAbCiicx$C zH<VF8?<Rb2@6>`+8Iivz%$}6LRxQ-RFXcHjs4r4a;Kw=^;;=I_3w>r66z^m@o^rx~ z@evfWr3ib#Gw7})x<aluUI#KUX|ViXYpWyw@Q!^I^z>;4f+*6OoO%&v3%{+wSkNHt zz&v)>{P~vUhY@XxZXOPybG>EkXsN8ml`9lXWG+V9xK6jabp8H6Ww+1rP}sEnYJOL^ zK=c(PkE_U{lGyHY*;Vql+ps*Ub!mQtNA#!tnc0eC6{uv9TJ2X=CE~2ZJv~Z48}5v$ zc206B##Z%qtGvCE@1pnDzgHxBxTv{3<hMGb$H)=i={MH6qz#n^rTi3XHroIY>~mv} zR#4N4Hhm7ce%l=XZ65I2L4}Kk86SibQQ#2T&z0*<*SJq<02$v}4fQPNDEl(QQC}F( zwU;y@htCAgpCk8|fsoYukf5XU{a<$|FBWFmIGZgigvz2}6b)|}r0PiRKIo?pTx(^Y z-d_+w{cRkc;6aO~7$mmvUSfq*`jNl*gvm*ONQzo+M`7mYrS36zDZN58No27%O~4P* z7rZ`f9^If74Kcc}E1W1;WZ~}%#CMr|s$UGLm*w&RJ#mM269%q|VgnZ3#J2nGq(>*_ zE=il;9T?r}#WNJRWywD|i`qA&u!*3zZ|hH22}(IcW{exy=*b~0m^isf=AdpHYy5)l z<WW!(V5rZBe)K!u1)R?t!`+mS9fcvPWl#HP5)L%>TE9YJ!Ri?R*idQpg{fC*Ap7I# zPYcL6Y#%)CNo*I+CnQ$Hw9Z+ADxDi#pl4@6gGv?+5u3$J1O*#k7~d#t_Rj-}LI{Lm zMfxqI!&6YGiIqjlBNTrY>@nff+0H!|Dsv2b_>-f-|95At|9uie-;b&<Vs0ZTV<Q^y zU=Xm{pG8KmBep0^lehPDxfUwlp#hGC$Up$fL`=uuTN0#&fK};pXtSLOaELn{d=wPL zv;rA=0@t-vWLk04hH%2w=B<iTX=mf-H2Q;w&$F=%AO;+l)}bA#Ff%>ThM5;>@?ELk zw9N?(Hw-lZ*D^z)+*GY(g(&idz~#qIA;Iy(ZSP=`&mjTnwXruWI4OUsN`4iQcnP&~ z6udm;YooGQ32cnCS^qj5xRABCCaI7O!{PiI4s@++JJ5kjV#fqJ3%`HJNMpAbT0nC- zf5TK4BtT36E`KTbn)t|}CTqDarE7)MzBjBZLQE1rrtw>%Lf7y>k2dr|<#<^-bRe&c z%CQjFB<L<v%{KZENv$aVaa#u~r<tsoqWnB3PU4gG56Mec{#!H_J0W-3){1O>7#mFJ zBAd$b=?Bj$2E$d<K}G5fVN%s3zjo3rZo+;3WO@r8c>xlRre;A#k*rzg_LO!I0fLFA zMX-3{gqDkofa*nTo%{_{@u?%2>bgS)AVc5~(Tj0prph?rM4s(NM2V0gvKv|2TQ&qk zu>rHGG!ridZbZ50Vh%P{_>RXtxZxeairoY%Yli~MD^nUW8p+ir>|QU3B6)v)giC+P z>4Lojjo7CrF4$B&u?(*u8!KiaiTW6$S=W@by~*7GIr2D^;#PYjl?`$u)8%7iUid-_ zI(3K~<4;%l9fH}hU}7dF_=3^Pnwb=%DMZ8~RN$(9F+NG;uRZ{}2LZI<x(10S5oqoU z!N-0OtyD@B|66R-s;Hb^OXY)AJ)DsEI}HhQ;PdJ3RRz0)^*8Bdy;ysx7Efprdkh=U zRkPzu_>}9&g{R*tq}2tyyXpho@*`_Yt+hhJzkB8G2)SZT7BSP@UFU7q*4^YLRgd5G zX3LABUAJj_1qGwJoy-uls5piTL?-`=H=qUO%M}TInngzaJme+sT$SA-lHcfQ2eS*p z&YHBb$wGUaNM3nm7Jf$uGAaiIn>O*r@&)f5q?P$3J9Ya;=JO~z^rFHOK=^8|`buP? zyzXh(Qz#}*%o89b4$wN*`_0_g^>?R-b2Do|veN~!Tm;g9$+WHt(r=@po;$IKE2T+v z+5&Lpd_wzshQ`n<ZdM8UM<s^oYly=$uSQ=#3dM$h=P-xF?nv=xR7A7%6WrxUXr#>p zS`CAf8u$j|n!-#%X=sPV!Zf`T_4LqnibCYVGRP9hCd{CuCPEx$gAcnJE=6Gy&he(r z6S$9&iWE<>h$?dk)xA(b!gQ&#C3gXtGPAIo3SS9RG~`v)x}mIyFI?dt*y1I;85>p` zu+Yy6*ljP73df@9Ve)u{&xFP0!lwh|)o6D><I&4$NmrC^qZ|=b!hpS6#fcbiCEGn3 zb7xYi_Aln0%4eSDNEF!q44#Kr8>zTHEyU_XZa>hw_VVK)MQJTG8PSwfFhACFZudOB z2ox1?5QF>HF4mt8pN}8U55}jVV7^E`#*J4^oSEjHk!8(hAO#0?*HaVbKHn8GhfN~V zFI8Ng-7OqvO&`dlP?Wbr(bI$i+g&VqAhy2rrgX@M^DGDlkk2PijLC`MYOyOl_{Y&L zDvNlRSbFWm^<?<h6R^r9pimEi0DWm<x8dXc_3W`Cw}LE{4nqiA!}dSNMXsTg@T5hQ zu1ANeiz<JktH58Y$A9|prtM0k$RGZ)HmyEfx~`SH%&PLYGoxg8vZfl7F{3x1|Gm)0 zHrkA;DzSx*!D#=AZ_1bbMJY|!LU*^k>OmiV^Y=nPNx+9l_4KOl6R|mu`3tBuMd;cP zkhD^Ak@XAZc<>bmjxOVO#{Rqh4tmS8MQl9<eeGsyv_5(4qxg^|)9g5jOf@923fT+D z-sX7efpNJlOYt3xFLnDA>C3cc#|7Xr53JT&O>}7vlAON4^(wIgv^_dq!ZH%2N#D77 z27l;xHflQ7cG&ASm(SXdXZijn^q7lpK4QV#l-JM`4B$wpFXq@socqxRXWF3e#fQsi zx_~g_B)1_QT;7^mv2V)2PcDs&#B9cljjZ$%z(Lp_-zp941+%Y&-}wqXW$$Ts_Xr$N z4<N|6>3>$Fu`~}bJYk2k)w0BE28&%GsV+6M!o|w-$DOG;m!PKw`d)she#fug9~adI z)hzV?pgU*byJvDtFTLzz0{X_t?wVJCc^QNuPVlvb>M#?i9Wp3MZly8H-ctmZOGVwQ zFi=eLC8MA{a5sN{CDP_@ulTBl&f!aQTb2~y*vj3-qtt(;=KtK3J-1}fW#Z4SHfTeG z?Cad0-hz#(_S+Ga5<-3n$`?Q9A@mObq23?07eF-^B$U4tVgX0V+kmQg$in%_GVUgV zMDSx?hY@iH-N<<~b8<qz_2S1iE4}41wn-Mym_{!b#f|YZ%tTtW+k?Y_+{YW{Ed2Hd zoeSb&WY!zC^^J#bR5^DYS>$!{9|bDE1T@)X=1(26_5Jk(g8lPTh;y{iS;GKdA3i0Z zQWR!u<2U`g``j#_O$dAtAHMm8^T8)-1u<1NGcqU=M4QzG3QMS6e8pAtb22Ev+9Hb# z8fu>fA?ES4%^H5}kO!K|-YMXK*1Ek3(|R%2s&O7<$@}&?2GGzv{R6lw@X=k?7~q6m zZ=l!lGjE^a$r@8tIrSJto2*Wo4;;n}pultvY9#!%u)34eBG9JjHkGssjU0q2pzEha zY?8kjOyjI<77nLF`4Wk0LAg*t*Xi06N@K~m<co98EbiWMXctx4CwU$f=~Lee;f;TD zc-B10)ovdjf&N~<(yB$Cd!zk|(ct?O;zfnxt5kg((wKN?mtY^XIE6fj7|`8C)tHJL zXI}G$dw?skT;`j-a0@l(p>xDXfOc}=qRGhe*q(mMG%>z59G1*;t)yK+tQRHo(~umM zO-exAFtD^NWpihg!OG3bRo0Wn5ixO$Ie^C&qYZ{ut7eLC$K`@;!=Km?f|!tAWE83R z1(X;;#9DIj7M?n;#;$4WC2z3IxzhhstZAc#Dw<4zf|1HI(y%Bp^10!Joi~|?`BF?2 z{8gQoKhag)gpZ_2`MBfSmiO`|Bzb{<J1dt6cko_=d5O97BJooaTKV{ReT%{nDfcsI zse*WcPL%<7FAB>m`zTE0F7H9h1<cY}%-<|a*K>)+hhz0PV(pqRQ#wX5TZr|t*;}~V zQFqx9!=(^J0(NcyHo5xBo^gl3Zl*&A8rAdC{x70hC+AJBp~wpvbQ+KAkmjck>niue zdOgW#)E1-*A|FC0f@j%!2<)i<o#C^56D<0yuja@_o+%nl_E$^PU;b%IHLf?eORc8e z9ah9P*#Zq+&XDz$5{vh%j36l*9jB4;;<IM;m5T&@+~52NWX{PVB4*KAh>YTxmrpp2 zQ`n#jALVTR!eMmI5JV|*=<tfI?Pa^gS?WQUT~Qs$O4uck*Y4Us;8m?fp1vyRIkT`q zOBc6_Ka9={3i@}&@^~QZ&Q$lO;no>`lb_$@vR(7}c5u|EThjJ_JQvyoHfs4}yk9i3 zxoZ*LVea8w=f}qOrC6Lc^!+pgJ{Eo6eRIIQC)Fk84UVLph<_7VEV^HIRwo*4wf~kk zz{3FFpI2RO>yWynO_m(iG??31ZM^vcUu}{JVZ~udvwO~ffUkuAb>m|dkk#G6HuO;y z{w_ye*o>-4qmpTHZ@K@rY+qzO73HbG&2H++vn2-?00@piV%KtPW(60gXN+~>3(2Xj z+-(vaJGZowKdKcAjf3bUsCq!~7^r*VV&3|mN~7u<pj&IKN~S8EZf`4rKmnjm<DQO> z&}KJ8QbDe(@Oq_sXjHr?u2mcURC(?Y!ZgP0D8C}8*8dGs7VOFrmJT0RMl(!}f@aR9 zhF5O`vQz}1G`m^+sD<I)CK;Iu_)r3$Dm>244e!#Bb&U7Er_2^H95J0T5%U9S4FeF> z;mrDW6HT$30co;#r>kUcHvvG2eh!0*VXMOX!>!#lIVIe4_v9bjUGFd4(u3qJb_6F} z3p<{!L5-W#!Ln{Tm`w*=Vl=fw)~rldE?co!P+pjf@Y03&En)2OuC`O?<2)s#6*irl z-9kFt=F0+^;F^_<y=jdxzm6VES-hUwHEgE|o<$Jiq+QSX%gACkO!U8{gA+M++uCNn z^$eb7P(p0KoL@+Jt8UGPvcmDDci30zYtd8_9rGMV+(L#h9ARrOi!iqPM7HP6%PjoP z)0EX4ml7B(gW<eZtIBHb*!Ov+wUUaKN&FBO50+|A)L$Fr(Eg+ebj+lI>9DZBgTR8c zMYw>xFRt|_Vc){9UP$G|s%3hmwLHV#xuE2RGPWQR+M@Z+vYvgm@R+_CkD?Ab;ayJ5 zQR9S?CL(W&Lh_>R1xY^l*k%Q$kI3&s-(f|q>*7Il@Ts=hSQbgH)Mc1sGE5&_i=}wi zE+L2@k{~DkQIGd(mY_neH2fr1_LQxI<F~P*QcfcGRfq&JWO&>`7&Q9p9CMR3`p%t2 zv#<((gH{u9W&90FIK`ikyR(rE>o)Uh0{RuM$7BNl^^o=rGvKx)31Fb}syPhqTvWJ_ zUbewLNh~KACLEEAMTf)<%JY`NUbFnzcEpZCPQ{MBGv4oz^JY2G;wrG9XuS0{s+nm2 z(q6SEQa(YmW)qkK?(K&_6WvY~<~Yx8ID^HPI7RE=q`n&ML7(=p#c&MhPH6AO)U0=G zIkEjcZ~y*~^)T{gia4N$`6y=?rO@ZW^i-9ISa0MF5uTcSSdrX@4xc4|+FpbA<i3$4 z_)v9v;$cby@%$V;X0%BX3`{ka6vI+wH<e>GK;6{uSkJldnQl>3PK+X%yRKbnOg3ed z!IIyzS|Chi;OFN&I4V$r`m!vCZ$ze?^LQAk_9k9oAfhF<w&)I6e}nH#4(e$Qo-0AN zU@pBcdVBvMkdUSjQ)$4gB|cXc-S%K0bWi>jKM9?t-pX`q`Xe?#>qx($abyp?N-^ZD zhxi@>BGbXd;|p8b#F2v^EIBLZnq+3Hzd(EC$C|tkmHYwgW`mSoucu<dH+V?l*buQ& zi`7rj&WyRpa8!F5c@_WO$NJBNEROPU$vu?z+MU<DzwHZ8Savu#_WZ030rYrWuzr2r z3gXaymRr_Km!$3mty@^sS$kv>s#A;dLcXcW(*b(~)h_tq<1cgPufH9~6jiGG3aUt} zmDQl5AheXaW)B2}-N#~aT@3gf)V3iP)Xe9GF+sMmt=#GKkbRIBriS0dtt#Dj;sI*W z>+sWV+?J?B_WFX(U=0N*+{-4!jGI0}N7WGRf5k&wSFq1t_^D~iZH*|yx?wDvZ%U&r z7K+-`#Snh`p>1#S<8H`Add}X-oo^wPEDE-ZUCfV8Bd9qK`?@#)8&&Z~TSf#;9|D~= zv769U#$7ROFhUpKinfXTdR^lcP{81ON`1^(Vx_ScXmc9j)gg<V7BA3ed!ZL>POSCk zOS<r}<rlj#%Jztqqroln;Ir)#th*}%+hmnMJ>xW9#Xh+=CQ9(e&n_^HNQ%l0qGMyD z&PnPOLqh5Io_hrc1lAPrH*`N}W#p{2?Q>F*OdHie@BDiUV;6ht4l|e)+1v~{6#H#{ znGV85UCMB0fQw3~13bnSq7x<23-YV&YET{P{l|y<{c`;J1wpyLU`%5Cl6793kL$4? z^I@l0YwOU@yX?Ce9)@r572r2-VkQYrW4kIR$nmCv(Oys%^!f21Y^1%CYa1uXHwap1 z4>$HVB!tQs=x6tNkiB2G@N*<FA}kx+Pk*RSZJiROCp!zgZT}%?NW$%^r|eE~B3@5M zVdiYKUio=pD_LJuF6<7licme4I3tKBWT)P){<y&jJ;wUM(crqC1oI>l=!Y?bmsd}~ zSI_t?k%0Yo?pnj;TR)652z?c}zo*sJVdG>!LRqqw8x5xb=d<6W^QcICixwwiW-q5b zF>fjCVsK(4vRS8mgAV7k*2%4<`|{q_g4&){^pBs7sk_*)?)bDQ_OKGqMN~Qk{oijp z-B9&Ff-t~?v$ky<YN^sdc8I00#pL#axyzR@GD@AR(c+~@S+w6cZ-@B7$v}i$H|Inu zq6Xszp5+Q@lnYB9I<mfWl_msDr~O#U9gCUzkOww7GR#a!Z;(IL7E%nY{vWYDcJ@(R z?^Tj6G&GyY0euyF{AhC`StZwb72xF7*toY@!p2=_^GxXDriCr)vO-yFc~07#CI78P zu9cE&<ijhyne^(H@bDPRVh-Y@VX%1e=d8c4ewK_a<#l7eaE@)Rr{tPAJX`HTu3ueC zroKLz@xH>!GeDXlrB&qywhVE!3f2)?aogWmyxV4-yv;Z>C7YdZZHoe3M^YLcYRlr( I9|Yw80k|J)761SM diff --git a/images/retrieve-best-practices-per-url.webp b/images/retrieve-best-practices-per-url.webp index 5e17a22f884870efb383db7befaa1f8d062c073e..e0554a56b7acbba8ef5af838254c9bc35a1faa40 100644 GIT binary patch literal 10418 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 literal 15494 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 IThd3=}%(?4$-cy))vZE()4)5V3sl z-ht@xnYfqzm0b}>&!i`?GzH|W4WU2`PJ9sGL8luiwM(C-WhV%6ZWb_n#_s-ot&Hi{ z6qt2W$>%s){nse~qU+pHN&bpLP+B8@x+c-)*YH0*IV8xSt$ok(&Rz6kI}E>;%2Hk1 zJL#0SMOpg4(Kz;vop2Cox(VI+yScrfw6`lu8B;w^aHQPMpS=a`NbyE|UFYG>d%n*1 zT?{Or%a{23X}bkF3@a_)2YR=e`jepyqy5UZ!+5ve5WA||FEM%6HVxm>d6$*!)!FDc zT_P0SYj?t6XM9*O*1kdZ9Eg<WnJlI6X6IEiO{1Ox*^-1W8JeW(6eRg!A#&)_#+>#2 zQq0d*ZRR}Y#rMq1D6)X(Yo>IUFz~LeUnV~0qP7zSXD=K-$cif87@p+_0=$^<#R^*@ z6|4JqYds=-=pQ?uSV&TTxOn0+`>J3$VLMIiRj9TYBV;NIlYIAlQwTg6xGmvVR-7nL zD4;%+Bi8fc<JwZ}=|@ETrT%1wGsef&tH61B_P44d&I;J^tMhtu47F%%!CU6~Z6hs0 z)AqCsK_Qlr8_)AIw0L59W#cTF7{ADAJYpRuC^DDOno=udoCgdZJ8igeRGN!Z<Bh`$ zebsh(6$770S^iMd1L6Xui-$?EINM}NIy9+uDs}4Scu{7!6{9N)y7@KhV;@*ql{&)t zSt3xer?`^aN7^g3JMcT4Qezo;Y4^a`E0aoyfwpVD*T~K99ksun^}gtNJS?bvpOJQM z4J)&5TDHe~0@zuGORN(U)gTUuZ#CTqVNxV0GTmeug$Q$-ayl{<zGx>69Gsf_*wGgn zXd-*&$s%Tn(vWK_eefwktAkZB)6FW>j<6yrmoM!^1%>KTgQVeK0&nNN)D{*9Lyi>O zQ&Dxe^XC7wVhbtNR;T`gAe2igX$H062PG$tY_d5H4DD-Mm*g30y;mqJt3eC9PGKcK z^TfK+yaz%D{PbVgI4<~(fl@jNqFXm%4x*?cSNiRO$fH$FQ?fO~g>RYHB$@b11qqNr zOS2v_313yqq-Ia!kJUs+-7!}eN}2c}?v7z=k4o-PE5&Y?{CQscC0~+|dONI{jkh_I Wu7jQs1rt!dq<ojJ;|~G?^8WzGzhd?P diff --git a/images/retrieve-procedure-saved-for-the-project.webp b/images/retrieve-procedure-saved-for-the-project.webp index ae9534404e1b8a4365718fa6c9e686a1e6b04976..939b1d5da3071d1072e77c33df8eb7075a1da9b0 100644 GIT binary patch literal 8104 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 GxPJo_%n$DX literal 12920 zcmbVy1CTCDw`JS5yHDG8pSEoqr)}G|ZQHg^+qQMucK0{;O~lN5Z~l8{CjN@pv3IVl ztX;V>_o|AhQj!!Cvu6eZQWq6cP*dO}GWjcJ#0Sm+riKHj0O3at@7AKFBr7ITDA)8S zhBmYP{`5nh>v4P0{~$d2%;~bZ>w70W0E~Q}d%)hdz4aaOw}0O{(VY3M^4|fR0Pxqa zZ?jK`pZfdVm!B_RewTTB+$E3tcl<B>Lx5PoU&k5bz5aRM2mhpB#9yttWx@^qBR?Ae z=3kAx_Pi-TCtwYLehd8h@`-ur_Ripgxcj~Gj{3>*$*_^<z(3DF;CBH)`~cj!y#v1U zZUAR~0Kn>1*W=CeZX@8Y_zV6!?VIE|>gBKNg)rQ>HOt>3e)_IB*ga4E&Ly<TGrNi1 z&@b~)d?38wzy8VfdGRU#w7V`Z?1%lG^iBB2&~A5UccDKEaNw`{-t%ts)BO^-<2&&C z!{6^y`Q`5i|1JD=_(6DG_R8R>XW%CZ;5};rK+Zwt>!0{te);pu0}kF-zj43S-|Z&j ze(|UK6#y!}wLeF%DCX==02_VRevtsp8?sBo56zE=%c_g*r%=7H+M98@jF-ZJriHR^ zy*z@9j!O<XUTr|}<CW(o;24pcZ0WA7f|Wof@w;0jH*@&kG7a=8VxUW;3PBlH{~#9B z^3AO*X<ebG^`JIWmTRf;=WLt=R1|wl5gEyW3S=e<h+>i9{}U>}wQzNL7|||TU{5%r z&$H6nQ{%Wi8&yXbX6sk5TR*~XF5r&t(UiO&W3do&!S-xSI*vD82tH?i`b9BGG+hF{ z^y_>=K2<PF3blN4IXRCuh&`D?F|CS<PZPo_%+TKYy4Jn_pVR-%9sLF6r0Ml1JYVRu z@IW3`;}1{CblX*v6x6_*x+zXwvg75QQPZV^cKQxV{GYxM4(=I$4Dm&*PDKQeF3z4; zp9m9W3UvK1zF$>;)o}Oy?>ql<5HQ{T$&S3N5%Ira7_U!{MOOr_L^VOsgc;jnC$45q zKyLDDlHj6$>v57W!Oi#7=ha!*2Y-3VrsEcYIvdzV!_NnFGIEGPob_*G{VRl~|32OR z(?2Q6`nT-e)W2clDYAFtkuri_95mePetkQ|PUl)2>{Gzo{D!3H82{?mnBCOqFC2CG z4eX>lyTCKJTK|RH|D+FkGYC8wZ{l&p;QD=}==|t`CU0C--UD2Vrb^VsytW2?xv;ZY zT`lr_UiZI4d`M3o#Ouw*EFs0(<w0DRbTfrE^;%-Ge>H2(U?ouawr!q6dUZKQooK!P zks#69#h=gPEfXs{BN_cOC!)R(BZYRuHb3IpDzf@p*)0?QW}@Tz#{ntyQ?~evK9fSx zy3%*>P#$EJ*O4;X--LpS*8TX4&nW-hhx`EjYa6*6`?C>KfS>nrmH&rr2FI&tGeSCl z{de!=pCs&L-LF|GX}-1juigLq^nD3|@4&(x%-4TS_g~Xn2E^h`oIco`o89|xOqRYm z@6u--FM4;{rODp^`HP*ugZ%2Vqx17s+i$^Kmgi!KJpNf6&>^j(lLV#($_f9fX-GyS znOZ;gW`vYggBt9J^bDqdsGUk`a&q1D@;d1|{m5R+rf8kxQ4sWet&mUuQ>wh{1F|DS zgNECG+|F3Ig>UTo<XP;CU=yo2At2RFj3S((R3Pp2&{`<;(t7{jbtq#IeBrOIvye(F z=m}u9E1psP6Lh}#ckB0G2<5Rim~ss^+u$&uaU09{zp?nAT-&yBb+c>KQruQCV-F4( z@BP0D_J7teqsg^UuYHCA(G0lN?B9yPe~JV@EqSZ?ap9U5@y-z}dRxX09fvgXKTibP z$3+#@;+;)oSKXyIIPUjA@QA_Hx|{a-b-ibCYRvTCX9K$$@O_%FJVV#~9XyBzH=Xp) z3Gf#~{!%npX1hT;SkCd59snTVpS0pXaJ0|*N}0dPz~<`j75jfFIE5{6rCqEk^}lT~ z#Qi|ui=g2%ZXrt&(w@p1koaGU4^rbgnK_Knq49}W1f{9R!h_<v$1ikUqXc7|mG0G* z?g{~>t}&&a=m@ybPt+>%;yM(El?l6pgDRPh1R<GfyjK0u?5hgOW6R8ozOhFHORNRz zJ#pTHQ2#MB=Zu*zhv*T4O2&>yo^pBqW}nM6eFN&ULY>Q9S6rs>ZEx!!M*#vwEw$nr zlow9|f#Ms@wjYNrc`MH;yRXD(o5bcB^;ljP>W|8JwyV;#GX!C9EKU;tl&(94B?b`3 zxY+OL&VcwgL{GG*Y8+V<>1v~6@VN2)%w~SdcCcg?h2LO~7{imvx)2C6Sd>(nx2rrC zRQ1ed@QB?^k4aoMFkZWY#0qJj*k@!U!h;NQfV6B52HtY@(-9~?WR00N*jwpnosIBh zo*cS+Y_zy29b=rqVD3=PkGaikfCN-<%8I43qQWR_+0-ZuyG1uyg$Ltj;5fEcyyLaK z0~{?FQH402x+_Ua4@KasBBJFA2p%J8;IyP9m)fIAG(X9tE3QTS=>&<qn1nlj1iF1# zR=60aplZ8G85?r^2hlLC_9E1u8O&iyTb!w|(!Bk<EE2Qu?Vtu;*hH!Xn`~`M$HhyV zdf*TBfj3AUlZ1Xh4#cqpKLK&K(Fd7}xdQkfNK5A0`LxOukdMZXk;A`w?1EvLms+Z6 zo#Me(L+62B1@04G$ym@z6V$p4Y^_*Fe{-=fFvM3)+Wy&?UB$*62N1u6^EZX&<!z!b z1_=b~Qv{!2{Vo7D?3Cb0`mS|tM#@bpzUD!DPov@2{T&zXl#cCV%)S1WJQToRQVJL* zQ5xb8)KwhO{{-!*Qob0vZ7h`W%#QR8t@~XZl?5cUhgWD;>C_K`%R(45AF#sr;^h-8 zB85oB%NT(BE8ubM)!nV9NV?Z`t2*Ek(JprLT2C0RWz=x>dusc&8xm~FO=aR|&rP6N z5%J@)u9Ix?nkbK6lS1$vxk*$bj?g1l#298o=u+XzxX^e0oV~BVeO)*9c=bGf4?BvW zQ$n6Ae&}evKXOM{PLX!O6s1c~J$zZGP;Yzp)=ypq3Byt%YHd4w(YVrcIR}bWehU$o zGM_i_K2YCYAEnK(iymVA)grRF?_%cAtJoN9d{<PGX<XFjB3a=-x+D_G6jKFSvm;h` zkth|w{aJl-xTT)E>o_!va2>1?Nc;zuiSn=OY_YEtS-SnHC?Q6knrn?H4)01>!9c14 zg?XaiT80+kGkPD5X9QB1UAfE5<M05ir}aLyrs>g@Kf+W5^9l=?C^_>yMmy9>uM0na zzLTiPYvxd6nuC#tvf1X7@y?1>QuqmLK2!#R^V@wxo^|hGV7sZmDGu2Va;9kOk=*aG zwckxqW)|kwK6|-6A2lxzp(ezYx>n*E;FoN=#$9k^2^zdTRRqKl`_sn+O$56Tp2*K9 zE@%iA)vG24|K`Cc(1DsG2PuSBz_?6Gca2An%p_J=0;=M#bVu57vi*v;QqcO+ooc-3 zrIrYmap?>)Op*xo46(q6{c$9rEZtTG-7eNxgvv|Z^pHW<VF1(9z<(YQ%0nJ(p%F%a zKq|7F_rR{pYcW<#@j0EQfC<Bo|M<lj-*MO&tg(zR=r*$xs`3NhNT!MD##~b4?hg1_ zVrrQ2xKyU~5?v*IPcH3R7H<Ec5JgF$v(s0Xn%wUPeGnj|jizq2i-$Dznb2e$C2;Kh z`Ov2D)AIvwdjqSpZmZH5v_^sA^JCk165rbMXOMNnXvKuxSxPQY`?m9HeyeRR%jda) zrDB1QJ0^>);d|b3BwsI*VB<4nhD-M+ESi5{0@F*i&jq39=uX4G5sc`zb6VD|>!fQy z<hzawOmEF7{vw1t35rv2YArpre&h?LYaq_sQ5b!eq`!==3&7tWr1@$+A-i)uG_7Q} z<0PjZvn^y%5jBM{j7(oEIv4mZJe@*&<Z`#0=pi4QtnjeTJ@K;3Za5&aFAA)BD60rE zHsckpt@b!}8HP7x36Z=v#^Efw^<#On(<+E<_lzNn0@MA1D1MY?Zsb4VI=^bP7VcNS zT-ha%D&iNq!JbhDC4<^%e1h!~1BS|?ztEh2^6gOtoGBhjT0ZIuqYab#RU;qvevXuE z!yX7+DZ$$lLdI_BTnlrIPqWUSQdN}cHOAN(X7aQpr@3BC?trOSt><@<QstJr3O3y8 zaTxX4RPm4?D5Z9d-aa&zdTr?Is_xs9Q65uFoyhQNj;q<Cr;9d`R_6_p--Jb!8ENH& z%u?h1jQJ_ky;b#K{_<xJ>9l!5hr>ZLF0yaZPg|%Q61MkG{@X%Mmi$ZDxl2q)v8tWY z4~rOpAC`wLtYk_e8MJR#s?zkVyfd0HPSqa8ebQa4%#JJ%>SFnEHaf<IZ_uO4?D*1F zt;So)f?xyL=ZBGO{WgAsJP^)E(oH3z6xy1JuD$?XSK%Km=pV-C(L&w{#)y{g&V4>{ zIy$uz%X)B`3fWg)bp59YaxuMq*Gs3kBw+@Tf<|MZst}Xlc48|&Cr%nwfsE4x(LJPo znvL0|sxV#xi_#W6vv_krM(NST^Zw(GHF>Y>meIcyEzaegOu{_ix;qC`=RX$0nk9?v ziRtf=_EY2RkI@DYU}-?X?sgao9gP+8c~bo+QHB`YK%pYOs@uAMC@1bEwVQzxoA{RX z>rmnc7%J;H!@eF=J1~ADmTkAMe<}&2`pwz7!1AR0n*5pjL2-Qk<0H5bzsXhf!n&=$ zq1Ea9PIFn{=bPVgQ+m~23Uzo<sl~M!up>6Y0WcU<X5%aqtWEKjkx)Ymc$0NUQ($;Q za)x(o1um9Y|7z;upLLq@4+JpdH4oJ@axr}6i>o)iI4pM@X~>#GV)x`}-M3~zBr*n6 z=F>Pgz4qaNdl${mZE?)6&gf+{QqC6H2f^k_xcXV_+D$Z(9OL`9T9&KGytKe<h&*r; z-;dG`g%xgUzx8SQ5!TYjFglb`XgP!BtbRTcAQ2uNw_H|-^)CDH)GSm-t7Rd*uK?@K z>ct!3r(MIJUk4TR6KDr8nK{W@6HkOH_~HG#z)c{LS4tiNO5FZs%cU|~AkI)<HPWfx z=X5K?aYeDr)TUf#i}cZCyud|^OUBgY{p+7~2TAxj((UJLahRG%pTv*_wA4ug3DIro z24Fw+&KS7F`(Z`y9RG+3fa)?EY6E}Yj?xwH0nx7}eMwQ?yzIB=3lusn<pE_-it*tM z;0x+0_aW=dZ%*YpQlo<SBA41Vfy;#*$HQ0bu5c9cLt*7z;ci#wR`<SCKewfo>Y%=! zG$*4%B3m;0^Ea$7?WZ)DSg=nklz3NRLr6!(eU8cKDnk~{Se5S-Gz^MxdY{c#&FQUw zI#dVxAy@GrxY*kPSRXg3=J*?ZqRz%k13Ov`&JIGC9Hjuq*?ax7$-yMtz{8VY+>V=E zmwzx1oda3fcTT&Hq$ftEO+>$8>y+*J{H(%;Nud?%^76<n51T^zf-9u@iW9PC?|yOQ z2sJ!l7eo=&(6#EHGLaW(&^(Y>2i(CXu{pbpkJI9Tz9l8$uGyWYnbJwbLykgEvF6m< zh>~cnk{z!(!`t~DHYXT}+JwH9Gh8ppS?z_Vg6Lo$-6G+LdVIkDV9WaDVzIcn6OF&} zIS$@BCW&i95LB=_YmM)yxYw(#i*!F+e-K?M!cz#Age<VsY4&Y@|1{mmtn0(1SdE{g zYuB+<t%+nhb^=FCjbf1W`bI5#ncSGt0`I)*CqK>Vyr(b!M8RWq_-#!gK-qo&%Olj_ zBAD0BQWEt&i}h&^RTNC<WtF_2Cp5zD7T%Zv1c@Rs4W+MN?z)mfAMYwRY&qIHQUvy5 z!sO4Co%gh68NPT}G|Z^NRcN|#8RnYzo=+(Xu+w(Kr{p~R%=!o45m^pbY0kzG!Zd|p zXnnQrHCL=W*&wLfArmp={^W<2fS`&&q&X)X#>hZ^Iyrglhm6nEWcbVtD(4LX1}TVj zHl__#xob9M^EY!d=mh*gIm*_4nk%x0H%4WZ@1fAR&OD%UXz!Oa5@(_0_OGT{kbJtI zbbgzUra%4w>IfH}r!XS1+ie)U$}Ibht`2{Lja}j{bw`<$MG?a$)S_UrdB2!ICRq3o z)-m;a%j1S^Mj%JKreL6lSNQ{@GdX>7+i6EN6~HqvDoQ&~atShp^joxPA$t8#bLF{n z)>Biw$_J1<)*klDvsUg(EpQ`j&R<`k7KmHsY{ns{wmWMGJPNy@@7HNn3jXd5``DJs zXegZyK+)rlZ1C=e7%hnKJX=;%r8WAgm-2CB=T&_c_|_3=)q;YrHCMGC5Zc_StC#gV zK+rePACGQvn$WPv_~NHUuhW@h_25?{+aB&0;zb+v8GACRAebx^H^g#HQ|T4u(73+3 zR2_WJy=ZEdwt=O$IrI@^sR70_x!pXeGM;2_&FTs&qlH18o2L1rWV3OdZPz_vdm#9U z#wuw5ki&UPyG37I0t2l<f*6+bpVl9=@UlL*78BIKGn<l*xgE5VY$J*4HxHRDi(X2! z6~1xa1FJ{-=nCMmhk;PNajhyE=DFO!r{$3cw!KC$7tCDp?U)r?7uC(1OKfN`-$fmV zB>}}Qdbh(cj^U(-t%GYY(4z8tqGiiLSnmDR(r7HdrIUv}Y95_Xo-cBS3-z<|$Hm90 zMGSg{EoSMc^e(>Zstji5P!kwWAce!BrW;6T=JtL#Drprc+*Yt@x6M-%RX68M#1Rk) z29yf2lX5s*5Auf5OJ?zyOz%^@Vx#>B=3f$okO7^5sW$L+=}I{nd7J%mNJfqH>HO&L z4m$oB{k*hyuGPOl)s%OT?am?$+d=K-iV;GRN%FIs{lX(2k2`Mf-P?FfW)}y#c_$8r z!lpC=H^r5o+o3u@uw=Pve)xSfewYwG=zY>`{SyX*Z?pfRP#Mi1R|{0*Apv1wR7!IY zMRkJB4hi6%E|Z`GA@7WZx7u7+aDh}PT=R1Tc2B($ZtEp~PNR@~YD*t|#%=P~9yxxK z6rKmMWWKFhZm9!tRWD`FJc*+T?t@VN>oQv;C}hc1t4I4S+W>R7k4v*jCIwMa^Fr)f z1S>}qfY$lTckCQZXFeH6B~QplL9<|o`-F;>WZ4-zf>o<i_P2GnSiiea25j2iJbrc5 zN3oYhV~MYuaG@uQ<QODG%RytBg#O7d74UlU=4YfIs^geY$_2L{4&^I>_~E)WIC+K9 zcB{EAp|K3gY#k=WLB*Bz_Ab@q$`d4Agh=h^=~6}Tf4x}H=TQd<95<skB4jV*SMKJa zPAsnT>>0zRSN-z5hpyU>8Gi4T@p04j!>447;UV%E)eCcJdUqwvC(X7$ecZcY=T3`3 z&7@lnzO($$fpnjFx$JBM-*zJ+D5rG7UJO8!zxTBWiSX1OX=hLQHn+_@Ux8Oyg;YlM zDjI7zBh#MS5GI{!=xE{M!dD%rR=FCM+UF0bk3a7hy#Uk2&c{VsFrZo~y|~WFVAgc2 z|A4W1Y<{=yDaRAra^F1^jBu)n0%mz89G8>`bcAW*#T-hVgz~C!LvJ9(__}H=625|T zkfeuJ&s$^zWyYR-h<~JAXt>Y=Gi)w9bQXKOxN~K7y1GrdyQ7*Nv<E{No<SL?qmPae z|1r9>d`vvP^NYc)7A*E51$AZipe?!LVi0UF@*2XI9jokYjb)9HZYbB^Z6v8l$qkpN z9puSds4eRbbF%CEZfu;AidO*a{bN0QbX+z-K4Z)i!$RY!4uo+-w-I*j0h5#A-ji}< zt?`NlnY?zvIP4VpEOA!<Ikxx7Y&18{c_?XYHN!~4$tGHhQSLoEtiUuSPV1HgzW77F zW=A({(nLO=T1u@aMfQEf(xG-o3rOWpbhpfuu!dY3XQ!4{wj)?gdp#*0V;-Npcs|ue z)!zCeA(2kq5F5uF7unD~Expu9yud0{{(fXMFRt}<k)vi;jnt4s6cGZ)-qT%4>qL^H zv*ouIipSrl7Jik1#={_CaHiaOURYuSerqNB4c7|t8T3p+a`6TKUuLUldb|5BYkXF4 zMM=94?1`wh$xa_hW}c_r-G%39wdXQVX97QnDlR^O4d;VhaSF&pm-DufI2j3kbwnsz z4=wOC^C7B{*(><7;WJ**PtIK~H*D(8hv-d*Iu&3L@lq$K|HY--AcQ$<Z!_=C#XHw} z^D^KM(t>nIV#0lIXqe9l5*yDTlY2&flx<2BfwC(~=I~5`4{TDG!UZS86t^U*@f5+N zwera{$05+_*XI0_qsS~^Z<6Z;zR3g_Rc+2i4rS@iv}T|Bk)wdz{P1JK;GPk#zazw? zCqib8w=kG$<olNB*XeFh33WQq-n)PhP4<}8v9JOe<3O=q`w9mJl!X^EC8E1&>)}|Z z0aSz7^fPMTy=*wf=}Zqlif2-Knp)%KhDl}c>y^Ejo-oqIFYb-FU?jd6m9+up;P7vk ztguFUWt@uFkwHy5A&qphR``|`1sHSR-I<^Eq>KcJ+*UR#$D!y~zm%Mnj%pW67D?x2 z`1r;HQIPL0Obc$s_?5}u9*^zFdha}JP<lx}$9z-!I4!u+%Z+%nz<fE%!n=N;-k%sa zrJuWJ;|Newms_e(txjsJ%R{h?ne%h%^64>|;e~Q%os^_oEB=(^^xP*o3gj6O7%r!x zuPCq&&kr>y9tmZe;Np#xmkvY-jinpVLF7G~(i+G%cX#Ycp%U^idz+n_#^DF_Y@r#f zS#O>M7EZKAsGPJ#xzM}ir^wu1LbL0Hl+?jAvv<~>-b6<EXv3!s5AdB!RRx553^0$X z0_xCoBU^^o)ZEhI3MF;7a&;=ehT$Uv$e!(+R+Lllr(1*uoZ&viGtgIj&#<(-xwrfD ze3}Ts(J%>;Iu<z=KQGsye<vw)EEYs4DCsH-?b3%TIN2$0y}r@h>#4Q!Y?S8SG<<O4 zXfgE+oE6m`kxiR@o#f@19)*)nJwxW207OShp#VN{BkSpm=9DoD-lAfOa*-YI)IMs= zNo%kgBviTE1uO<@L&JB8y`VCSKB&5SQbo_1oD41*!n|0mE$chjQ2f;VKi2(aZqz;O z@XA<WEu$P4`w4~<VFzqoWRg$*bSPqv<j*VKmlcT)x+h+U<b)`F)V1hK{wcckf^ECT z5cX8d#P8!oH7~N5n>EFdbzo!{WvlcUus4P2Rm9I@8pE|reDC&^-GIKTziUw1|0(I> zX}=Cp?u4_-%>Q1S>-Fc3OBEa*thrU1mrdtR6B`~qAoGntJNSRDqiqBXh*?F{aDmE! z>l<r#(&;RS5kJ;^r}$S*b@{7{D}e;f56qYBX<);#X*UHvo#&wqtGCyS9wHB^P%7C; zr>~<^Og$Ce$^HdP>|7ly1;8SNVh&Qw8udbeG-esu4{O)f5#qV#nUVt&AeKcNTK!CC zR0NIJB1WGRDRpIPu7r|@7V#t)mfGhE8_H0udbu;#h}(}h@LY&gQr!9oXz_~H+nRUb zlzLerPjvjJobW{&n3-xCE(R|B^wiVlSaR9XK-})`-x(GXUtRLkw8%Hj#!OK{jMT>F zN<xrNSV(}|%L}4htPRyXex*6O+|+)?Ku-1<2Z8fVQ`sKLR97jv-<Yhl@JYivZfr(m z_t3=FtGKF(1Aan)kti#|E<*1m3vfZblbSu?>q&kSxY5#RP4Yu^b~O=cHRW%Xp-{Ik zc9q8=e!9su{&h`hxZnpmfB>CER)((IuP>C6{Ndw^v}O2>b`Ts#_5*U|Z(NcM7HaGn z{uQS4?86zX%-|rBaXI7ZRg0s*l?Pvw)jnpc-3+#ysZ8#i=4CsKXmjQXGzOZ{n0Uv^ z+r{hvXQ~&#XVYX}6RiETmGKK|=0ORk6H>)hq2Txla16OqTcctp%h7PV8}%t!t6!+E z=OLBhjmh&oro8mB<u{?f47qpN-X|8)xL->l#N|WSRH*jiRxLD8f8-yh0<JXq^4<Kn zY$KN2S)F$L{kTd95cwX7GP9vOdWg8K;rJ0Wbvp^*8z}PKVBm6j%V(2buzVXWS|)N! zY3nm}3n>F>dq)G>sEV@i!Wji(n?SRLhQ>GN5#V3>>B1(7J&~HWb+s?VhpgzUq5_D~ ziz38PP$>LSPm0MzMI~kqG10M$Kc3|2Rze1%;-%k2ED7Wg$@1+vUFi&;iCZhgD9vZG zyrd2ZJgxaEjyro>9R_AZz>HH-X?V#2c~=A{*QGp8#BxB~P`$YNhE3uvXC8E;^|PD; z<@%&XtSRwwK#KNw9H#|iL}YO&UT6%+SRGv(ZUk%xpc+c2`Y!`gfV~obsB&;#FjThP zhNBm{`Y%>2z$B9ZSkAZAAgg6&NZtJ2nSJo3QK8q>#08p!E@MK<A;fWV8oi*EbYE#y zgt=RKAr<ko#fVNi>HA{5?nJq;oX%3<o}#wT7Smhep@8v4-OMWEj9-i3GcG=_XW<-e z+)pA{%^<j^S!ys_Cdy6~Z{6D2_}arux`!kwzmS&0?}|r(_NXv-OoANv8!l9plwWAZ zw)OZm7723889`R*4d&s2(To)b)9pLJ_aEVKTobfx0rc=5wxKn!)cWV0%RvD#6e(6b z5cK8zz#(IeUgL}}=>^;Q^<~rW&^r&}>R{#<NvXOTTepo}bbNWiOT0f)p=q){$@)ah z_9rK{oRWNu{kz&?1Hwr9+zkcQj|o~lAO#7TrLT=@`h)3WbrDxfHJfVRm1p<;#PO8E zo_DI9n86(wxEzOHoQA<5VLZYN<u#r&TlE1SH|-d^&>q?q{oiwlRmL+pCZv4*;ii#w zR5o9<!F6^ey((I<yx2Yg*eRB9{5aa*nA|i>LmclqLT!h51_hF&<);{?T_>O8b(t{L zN6#(Q0-Smt4yuv(408Snik1dDyx@aC%kr0(yqj^FP^b}^m{WeJ@7RdWP&b8H47v~9 zOdplnR%j4=!xr$ui*G2x54TSA6|h_Oc+WXI@^?ycknHq=*`EeOOFDsF&Y+53592Yl zX2gw5P`boj@edm2w%n?Xzb(HiFS9IL`XlS{n!*O5zB94LSZ=7{vqh=e-6qck1yB(! z33VT&s%g`MB6|nsWP|eX`ZVL?1ZLt%Tm%&^mSx}P5HIOD)J1cxi>mF!K{{pQ<h!7; zCMr?3gMLgn?W{>`PSn$gbL&F!opk+dKc($1i@tctNK9Ec8%A9o5j0mIow4zT$Xn*q z=l~PiB=Yw;L>w$edan(<{Nb6_BEq7cGrG~AIh!65$x3?x>Fy#}?oz_4W+5*xQ{OHy zjB>8}?bUFH@GWuLB-%o^nQ7Z7t3$L@Z2#1bCpMrmYB?Z%>gPevf6zC#kd`w}OWNM# zVKpFUf!uXGE1-U!s2@AFq`qGoT94)qPlJC1j@64akN!w#FT(AMa}r(Uhd2q(hiV|C z{$rDiFq_Fxj$grY_4CDe9ywo83AIqF#ZKSQmY&n3T@Yjc+(mhlK!}PR`%{ht+UiaF zpmVb%#C<fK%>@V}f)0tI*VkPiB-G15b%Y#i@<P&1pF*>+JgN;Oq1Ao06(V%;;xO8C ze<zpVgipY##DxvSntEE}bWgq9)W7Hwv_lZ0fy(u5c*!D^mI2jbEcBvK0{k?Q3(><_ zz9w7w#R<Y_oz=>3_jBTeS=^)u)tk3be+caG_+HpfT-i+j2_${0k;WL_EX(Gs1eWF5 z|MQ(z8^UyEdppU0<Q4H#q#h1o9r1|E&q`uw-?mnUO0Eu4rO16)3JPL1&C51Gd;zz^ z>Q=&)%R(VNKiD$-5>?l&!>zy(+z*Ayt$vy1qKO1edU1@EZlsk8<w;AYVz3jROz=r4 zo0AI377omLY0C{`WSb3ngbvq-$opl!Z<dQ9(sD{;kOQ1T4R+Lo{AF}3WP=hN+mhlG zFI#(rbH`N6)^6#j$X^d9Ao<GnG&c1IadymYb=@WfsX+}A^D!!(pd18AI$z8fKGaWm zY%T9A>hL*6W%crl3=<^fKKFd3$TtYw8KeA4S;OBaxL>}!NNhOgHg>Csy@z0V(J7Ec zPztFg)z|@j<_f}doUcYI;~uw0x9s3C`|;e$VJbx;c-RyDOnDhBOm~Zh^Nh)+=I1gw zRD_jry>3QuLJ9ZpyVyTu3HXt2Ic0@W&8xx=d3Wn34-4!h`qIA0*FMpOCJWbDh@3A3 zX|!sz{`z8hPqjU)A@Z<G<3TfVygR*mxgyKg*&RF%FZ;!DFkciDON6-Mzu-dL;B2(P zY4}Ow@$GjmU`pneI20rpXWV3B1n=c?aB6k+bR<)U+^xAKJI*p4Ej~s*9D12=u*O=A ztAUU|*jTYIbU%dDHwE&97Snv-&?eR>=LZ#CMqMz!w!GvBoNLeUQyg(;dYC36&yGgq z<x_}($kihjf<1Xl1S6#zgps!!Zc~49QK!AlcyCx5k@x`^JO8Q*S7)S~!uQC^d>Hv) z3SlK&QIasagF$a3jl1z^3O}IdKJa%DSWXn8X<*nsS%+tiTX-jcODC$S@soi|%dJ_H zIK}Su%{54^h@@kZ=Mr*nbw<$AWYn6)PpAb_O>!1AT>dmbgf*?$?t&+!zHg^2t9|Cf zPvwh~rl?aWM1B9=al!Ferp!sVdbc<Zbm%A+ugsRDCxd~LyCE3|a1ow8-0+Ei3Y)5^ zMCZ%x46DjkaAUUUc&DwCf<EAq2KSRhL!lI~m@K}Icmb!?ZM}(!uP$RVZRfQ(3-g{m zn!sTDu1&BdKk#i#9+2WQ+X)0+#W0`i9;)=^Ni@Nd@z8qiZvQ*6XW%n0#<w8BTyqT5 zJG=&E4VXw!@YrAx;tEVzs1~Oc1m@e|Z0_SyTB=m)+i2%w=-W748pdD;l)v9K1xxBX z&2d}7g%sJ+ARAMfDcL8SH-y(A!=K3VswRi#(kSXgQYi`1HB4TpSFF~xU>MYCDTc`U z@gXWGZLOW?OlE<h{&4M=b+cq|E}0KgdX|qdPEIGrVc_rXq8okGldr@|Has6C#qB1U z;l3)!C}CbzW+9@e@~S?df$j2RymAT^h_X9qtWNe*@Lz-s7_n<W2n*4uV`*`oha7=4 zwkhgr2y&L@Q$PI4g8S6Ts{Xv-zA{_;!~<<GVyC0gOyR&|IUH5Sjre1|H44r8^=*e# zc64R)DCsb#30d++)-Rut;O%q#!f6W+$vWVd@pU!)>fDWJ5c~*_0|HjVP>QuFhNBoo zmPcH3;4tagzu^Fw9-ylg#jKoAevxyo@5#+y9iG_X`|sbr`eH+)nHmwCM?AV{T9CbV zKz&&c3DX?Zd=~C+ALA(u`lOyTxTyVz)P|nXYu_1b1Hf|ca6vt8OF#H|4wz-0$BF&? z;?d;KBYLOtmd%J7<gpa_n99zoec9-W#6(?Z*W7y4G#n>YdbfhsHXL_`gC!(@hX_i& zE`<~{4^&Uo7R9`Xq1XM!^O|0q@)D~Py|>Mz>S)P=tvtx{n4mywm02|}+nFZ2_%^Je zRA06O#s#r)<7Z}3K7t_AV!hmvN~BYz$UW2O7qS9Di<Q^2r~d4uw;*tO8{H9hI-$1G zGz~G@rW(>K=vlcK*Fqj@+U4=u;pjk8{6t*imf{d_LMZ$iH5m$_c=H=B{X^OymUZ*o zb4ef>mDi@xY8v=jjLbljPqDcK`lFFJx|zp~f9UpXq)!5Sn{f^3=f_Dt<{BNRfL*<| z6$L^;GsZBvm}1pLy%5A3D=UT9)b~9V67Gppzg)IoK$<yw2b225<Ft2$LjFuzLY=pu zlKOx&rmGQu_T5r6G}_1jZ+T1cl4=u0yMB{kOod6>2IUTn!-)XrZzgE;*a`>sDpF$4 zbT~9H<qOtXVqA198uit)y}^gv^N`gRXzMF0>`I;#2wDHjyF8BhGacrX@N^v`2B(M0 zvd4l|2USl-Io6Gu_Q(qszD{}kY8#+IeNth`80Z1{--xlO25DXgLR)QTq@)bUxHS|0 z%g?|oKL@ZlA&`AcY>siV#%%WU4;m~*{2bR|z(zN<D@&2fzBSf2c5Z&vrjp7hb$5{l z%`Ile%+U>@Hx9Ah*zyCTliImvwo+6I6Hd|20W)TJOSc&$iZE(pA+$jA*zBm<U(x_q z^}}0$Wo6^A)Vd5sv2yH#hxz?7O@WEoqYvMQx~_t(TxZAf9$@k-Eb>s2zn^e8Bu>*N z_5oHB*zQ&tACS?q(5H*S=n`|Id})!mi5ICf;Z^+W$Lh8AU)|gOy{uKR)}ZFQm+pK# zbftrkk3Fo7-e(TMD%roUa@%=zbIE3V-&uaLMu|a%swAI48u!xn66TxLZprqzSQ(1o z?eW~$mOHje0gXWJv$eb|Qbi#0cEypJR-G?(Gz8*EMNk`eJBP@ypY5=}`RG!T=`UNA z9OxJB(F~AOzFQd4YJ2t<CD)aVe}QQ34O)O)!O#yw9s|_PY{~2l{H7uC=+3T3jnK`a zpZ)EP<mezB64}^KbJbw$?j8d=6VQ}bm$h+_NOXY%vH4XvX}&@jY^>3Gj%`kijL{^B zz`CCe--{Rh;zi7!1t1lS^Wg(ne@@Ddx{l^gv9jkD>V3~}8&|GTqbEeG<gDL_&((%U z)yCyT+NlU9Ex*Y$sgoq(^iic+Q>V~2_>TjH3~kFnCS>!4ap}6|NSGuWFms{`;x?~; ztC}cyg@Quo02-Lv<O#<~aO!ckk<QEXFkeS&6S)Pw6r6BGryDLHq~|lh(T^6Y)A>r+ z;g?pys*#+uVz;Oni5Zu*V#{B#=u06J6jgL#FMXR61KWwS>>rtvd6JKFKrzsYQwa1q zrPFKa!z6&dRM&w>hYpFfet~cRy+$zf^FX`AlW;ojQ3Qa+B%@>EBCo;@U1*NB<mac3 zGg99w9tPYF_#Y)vC2;fFsx{N=4Qyo>xuuIdzb$gxhQaMF9nqiToI~sX@nF6gLFWF2 zvlIifV9qyWf8?Fph$j9==pIZnI;2|>S;f$Xy2xniWh>qpA-atyABK9+@N7SRQI>)H z(ofnhupA+^0P0KVU<{a?Ph4R=AU)OKb*8nARGp}~K#MvvCu`8tTn?NPOg1*`=<APx z+1()8AFxW!9inf_n7v>kcc`R;daRuX<4XGESN1RmdCYLx7XMDvLDZ`T!i+k*3j2e# zI7@}_-=s5Z-BReXO%^DAHu@(Lin~?OZziT!L|EFGz(>bRc0_sFN-TX%r`HY0^28an zc{IZ5a$B_ZJaG@}+Lryh6pKJW^<R+;?!5yRgP=Zvo0^>T+VSu#bwiybsf1WH<$K5f z@XSDW{@Bgup7;XPW`sk+dIjLks36{1Xiv~AiN!GWD7Kz-?sB%1{$8MQ4vDP!zOS5X zpDX!wO?)T2L!21yJKk7OR?MI7uiOq83trOZ*%*$C{Xs!h+-5tC2NRW3XZ_fF+HpKJ zi!g5J+QT|`u2)kB8JCy9jz9ZV{^|If3I;uygEbu_cA-kksgLg@L|p>*TdZK8Y_??X zC@O$FFr}JtDAo`^iJJ@#MvcCRjf=W_LRyPpDp>4OD-k*ObG=qWlj|Ln5{}2)KC->a z+4$T+LsFKwmVRL6t;(Bp%C4hek<Irf4m>2?7F<NB^QBvJDtE}Fkvu8a@XN4#VVvfw zPW@I&KT5?_GE&RTn5yELGrQAD-CW9gKcnA_)7jW#YcqZlZ!{1i`H(R7{T0ZgR?%=D zD75cgN>F%}&u{~U_T}OTYu})?g0f(tAHM5}cC!k85OwcLA@%u#>djDaObv|zKeYc1 zJS04vfNF1zn}ZRt11yu$;?@>s1_5C!AUAG7)?XuEWPvjmCbQEYdfqGsNt{%121;?c ziD*t@H4T3{1+W(hS12>cNhk(O)Py_iY;@Fr;f%Wxt*Zg{M}5$&{`c%|br<TIu(ZuU bNusyNermn6yK?j)BH`J)(i2^+0nq;d$=V>p