/
.eslintcache
1 lines (1 loc) · 228 KB
/
.eslintcache
1
[{"/Users/gregdorward/Development/football-predictions/src/index.js":"1","/Users/gregdorward/Development/football-predictions/src/App.js":"2","/Users/gregdorward/Development/football-predictions/src/reportWebVitals.js":"3","/Users/gregdorward/Development/football-predictions/src/components/spinner.js":"4","/Users/gregdorward/Development/football-predictions/src/components/showCardPotential.js":"5","/Users/gregdorward/Development/football-predictions/src/components/createBadge.js":"6","/Users/gregdorward/Development/football-predictions/src/components/showBttsData.js":"7","/Users/gregdorward/Development/football-predictions/src/components/radio.js":"8","/Users/gregdorward/Development/football-predictions/src/components/Header.js":"9","/Users/gregdorward/Development/football-predictions/src/logic/getFixtures.js":"10","/Users/gregdorward/Development/football-predictions/src/components/createStatsDiv.js":"11","/Users/gregdorward/Development/football-predictions/src/logic/getForm.js":"12","/Users/gregdorward/Development/football-predictions/src/components/Button.js":"13","/Users/gregdorward/Development/football-predictions/src/logic/getScorePredictions.js":"14","/Users/gregdorward/Development/football-predictions/src/components/CollapsableElement.js":"15","/Users/gregdorward/Development/football-predictions/src/components/TextSection.js":"16","/Users/gregdorward/Development/football-predictions/src/logic/getStats.js":"17","/Users/gregdorward/Development/football-predictions/src/components/Div.js":"18","/Users/gregdorward/Development/football-predictions/src/components/CollapsableDiv.js":"19","/Users/gregdorward/Development/football-predictions/src/components/Increment.js":"20","/Users/gregdorward/Development/football-predictions/src/logic/getBTTSPotential.js":"21","/Users/gregdorward/Development/football-predictions/src/components/OddsRadio.js":"22","/Users/gregdorward/Development/football-predictions/src/logic/getTeamStats.js":"23","/Users/gregdorward/Development/football-predictions/src/components/HeadToHead.js":"24","/Users/gregdorward/Development/football-predictions/src/components/BulletList.js":"25","/Users/gregdorward/Development/football-predictions/src/components/Table.js":"26","/Users/gregdorward/Development/football-predictions/src/components/LeagueTable.js":"27","/Users/gregdorward/Development/football-predictions/src/components/Fixture.js":"28","/Users/gregdorward/Development/football-predictions/src/components/KofiButton.js":"29","/Users/gregdorward/Development/football-predictions/src/components/Chart.js":"30","/Users/gregdorward/Development/football-predictions/src/logic/compareFormTrend.js":"31","/Users/gregdorward/Development/football-predictions/src/components/Toggle.js":"32","/Users/gregdorward/Development/football-predictions/src/components/Carousel.js":"33","/Users/gregdorward/Development/football-predictions/src/components/DayPicker.js":"34","/Users/gregdorward/Development/football-predictions/src/components/DateForm.js":"35","/Users/gregdorward/Development/football-predictions/src/logic/dataSlice.js":"36","/Users/gregdorward/Development/football-predictions/src/logic/store.js":"37","/Users/gregdorward/Development/football-predictions/src/components/Team.js":"38","/Users/gregdorward/Development/football-predictions/src/components/Checkbox.js":"39","/Users/gregdorward/Development/football-predictions/src/components/Slider.js":"40","/Users/gregdorward/Development/football-predictions/src/components/SliderDiff.js":"41","/Users/gregdorward/Development/football-predictions/src/components/Switch.js":"42","/Users/gregdorward/Development/football-predictions/src/components/SofaScore.js":"43"},{"size":1066,"mtime":1707515914069,"results":"44","hashOfConfig":"45"},{"size":23167,"mtime":1716224781563,"results":"46","hashOfConfig":"45"},{"size":362,"mtime":1642008106594,"results":"47","hashOfConfig":"45"},{"size":297,"mtime":1611654841360,"results":"48","hashOfConfig":"49"},{"size":0,"mtime":1611654832610,"results":"50","hashOfConfig":"49"},{"size":373,"mtime":1715952680957,"results":"51","hashOfConfig":"45"},{"size":0,"mtime":1611654828618,"results":"52","hashOfConfig":"49"},{"size":967,"mtime":1707394671993,"results":"53","hashOfConfig":"45"},{"size":144,"mtime":1642008106581,"results":"54","hashOfConfig":"45"},{"size":63578,"mtime":1716220009387,"results":"55","hashOfConfig":"45"},{"size":12081,"mtime":1713442138533,"results":"56","hashOfConfig":"45"},{"size":476,"mtime":1701970028062,"results":"57","hashOfConfig":"45"},{"size":293,"mtime":1664526263212,"results":"58","hashOfConfig":"45"},{"size":150270,"mtime":1715958118564,"results":"59","hashOfConfig":"45"},{"size":729,"mtime":1707491551023,"results":"60","hashOfConfig":"45"},{"size":180,"mtime":1642008106585,"results":"61","hashOfConfig":"62"},{"size":70972,"mtime":1716219909561,"results":"63","hashOfConfig":"45"},{"size":203,"mtime":1642008106578,"results":"64","hashOfConfig":"45"},{"size":595,"mtime":1660119665169,"results":"65","hashOfConfig":"45"},{"size":1347,"mtime":1660318811896,"results":"66","hashOfConfig":"45"},{"size":991,"mtime":1713539539871,"results":"67","hashOfConfig":"45"},{"size":930,"mtime":1674565851630,"results":"68","hashOfConfig":"45"},{"size":8044,"mtime":1683908486579,"results":"69","hashOfConfig":"45"},{"size":2973,"mtime":1683902453834,"results":"70","hashOfConfig":"45"},{"size":440,"mtime":1642008106576,"results":"71","hashOfConfig":"62"},{"size":4650,"mtime":1707491660879,"results":"72","hashOfConfig":"45"},{"size":17734,"mtime":1707491604507,"results":"73","hashOfConfig":"45"},{"size":11920,"mtime":1707491579223,"results":"74","hashOfConfig":"45"},{"size":202,"mtime":1667313223726,"results":"75","hashOfConfig":"45"},{"size":6560,"mtime":1712326703609,"results":"76","hashOfConfig":"45"},{"size":10650,"mtime":1707491740999,"results":"77","hashOfConfig":"45"},{"size":386,"mtime":1664378350858,"results":"78","hashOfConfig":"45"},{"size":981,"mtime":1707491534037,"results":"79","hashOfConfig":"45"},{"size":556,"mtime":1669391554973,"results":"80","hashOfConfig":"45"},{"size":225,"mtime":1669809056859,"results":"81","hashOfConfig":"45"},{"size":848,"mtime":1693584106618,"results":"82","hashOfConfig":"45"},{"size":283,"mtime":1693400578489,"results":"83","hashOfConfig":"45"},{"size":18955,"mtime":1709910446888,"results":"84","hashOfConfig":"45"},{"size":707,"mtime":1697730848306,"results":"85","hashOfConfig":"45"},{"size":1598,"mtime":1707430551117,"results":"86","hashOfConfig":"45"},{"size":1098,"mtime":1707470685059,"results":"87","hashOfConfig":"45"},{"size":772,"mtime":1709224525316,"results":"88","hashOfConfig":"45"},{"size":2049,"mtime":1716220958146,"results":"89","hashOfConfig":"45"},{"filePath":"90","messages":"91","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"92","usedDeprecatedRules":"93"},"z32ji8",{"filePath":"94","messages":"95","errorCount":0,"fatalErrorCount":0,"warningCount":12,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"96","messages":"97","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"98","messages":"99","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1f0e5p2",{"filePath":"100","messages":"101","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"102","messages":"103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"104","messages":"105","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"106","messages":"107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"108"},{"filePath":"109","messages":"110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"111","messages":"112","errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"113","messages":"114","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"115","usedDeprecatedRules":"93"},{"filePath":"116","messages":"117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"118","messages":"119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"120","messages":"121","errorCount":0,"fatalErrorCount":0,"warningCount":8,"fixableErrorCount":0,"fixableWarningCount":0,"source":"122","usedDeprecatedRules":"93"},{"filePath":"123","messages":"124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"125","messages":"126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"127"},"1eaajj",{"filePath":"128","messages":"129","errorCount":0,"fatalErrorCount":0,"warningCount":9,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"130","messages":"131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"132","messages":"133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"134","messages":"135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"136","messages":"137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"138","messages":"139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"140","messages":"141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"142","messages":"143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"144","messages":"145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"146"},{"filePath":"147","messages":"148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"149","messages":"150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"151","messages":"152","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"153","usedDeprecatedRules":"93"},{"filePath":"154","messages":"155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"156","messages":"157","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"158","usedDeprecatedRules":"93"},{"filePath":"159","messages":"160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"161","messages":"162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"163"},{"filePath":"164","messages":"165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"166","messages":"167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"168"},{"filePath":"169","messages":"170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"108"},{"filePath":"171","messages":"172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"173","messages":"174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"175","messages":"176","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"177","usedDeprecatedRules":"93"},{"filePath":"178","messages":"179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"108"},{"filePath":"180","messages":"181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"182","messages":"183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"93"},{"filePath":"184","messages":"185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"186","messages":"187","errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},"/Users/gregdorward/Development/football-predictions/src/index.js",["188","189"],"import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport { BrowserRouter as Router, Route, Routes, HashRouter } from \"react-router-dom\";\nimport TeamPage from \"./components/Team\";\nimport { Provider } from \"react-redux\";\nimport store from \"./logic/store\"; // Import your Redux store\nimport {Fixture} from \"./components/Fixture\"\n\nReactDOM.render(\n // <React.StrictMode>\n <Provider store={store}>\n <HashRouter>\n <Routes>\n <Route path=\"/fixture\" element={<TeamPage />} />\n <Route path=\"/\" exact element={<App />} />\n {/* <Route path=\"/\" element={<Fixture />} /> */}\n </Routes>\n </HashRouter>\n </Provider>\n ,\n // </React.StrictMode>,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n",["190","191"],"/Users/gregdorward/Development/football-predictions/src/App.js",["192","193","194","195","196","197","198","199","200","201","202","203"],"/Users/gregdorward/Development/football-predictions/src/reportWebVitals.js",[],"/Users/gregdorward/Development/football-predictions/src/components/spinner.js",[],"/Users/gregdorward/Development/football-predictions/src/components/showCardPotential.js",[],"/Users/gregdorward/Development/football-predictions/src/components/createBadge.js",[],"/Users/gregdorward/Development/football-predictions/src/components/showBttsData.js",[],"/Users/gregdorward/Development/football-predictions/src/components/radio.js",[],["204","205"],"/Users/gregdorward/Development/football-predictions/src/components/Header.js",[],"/Users/gregdorward/Development/football-predictions/src/logic/getFixtures.js",["206","207"],"/Users/gregdorward/Development/football-predictions/src/components/createStatsDiv.js",["208"],"import React, { Fragment } from \"react\";\n\nfunction Stats(props) {\n let shouldOpen = props.clicked\n function styleForm(formIndicator) {\n let className;\n if (formIndicator === \"W\") {\n className = \"win\";\n } else if (formIndicator === \"D\") {\n className = \"draw\";\n } else if (formIndicator === \"L\") {\n className = \"loss\";\n }\n return className;\n }\n\n function styleBTTS(BTTSBoolean) {\n let className;\n if (BTTSBoolean === \"\\u2714\") {\n className = \"BTTSTrue\";\n } else if (BTTSBoolean === \"\\u2718\") {\n className = \"BTTSFalse\";\n }\n return className;\n }\n\n if (props.formRun) {\n console.log(props.formRun)\n return (\n <Fragment>\n <ul className={props.className} style={props.style}>\n <li className=\"FormSummaryHome\">{props.FormTextString}</li>\n <li className=\"FavouriteSummaryHome\">{props.FavouriteRecord}</li>\n <li className=\"FormHeader\">\n League results (most recent on right)\n </li>\n <li key={`last5League`} className=\"last5League\">\n <span className={styleForm(props.Results[0])}>\n {props.Results[0]}\n </span>\n <span className={styleForm(props.Results[1])}>\n {props.Results[1]}\n </span>\n <span className={styleForm(props.Results[2])}>\n {props.Results[2]}\n </span>\n <span className={styleForm(props.Results[3])}>\n {props.Results[3]}\n </span>\n <span className={styleForm(props.Results[4])}>\n {props.Results[4]}\n </span>\n <span className={styleForm(props.Results[5])}>\n {props.Results[5]}\n </span>\n </li>\n <li className=\"FormHeader\">\n {props.homeOrAway} form (most recent on right)\n </li>\n <li key={`last5${props.homeOrAwayResults}`} className=\"FormHomeOrAway\">\n <span className={styleForm(props.ResultsHorA[0])}>\n {props.ResultsHorA[0]}\n </span>\n <span className={styleForm(props.ResultsHorA[1])}>\n {props.ResultsHorA[1]}\n </span>\n <span className={styleForm(props.ResultsHorA[2])}>\n {props.ResultsHorA[2]}\n </span>\n <span className={styleForm(props.ResultsHorA[3])}>\n {props.ResultsHorA[3]}\n </span>\n <span className={styleForm(props.ResultsHorA[4])}>\n {props.ResultsHorA[4]}\n </span>\n <span className={styleForm(props.ResultsHorA[5])}>\n {props.ResultsHorA[5]}\n </span>\n </li>\n <li\n key=\"BTTSArrayHomeOrAway\"\n className=\"BTTSArrayHomeOrAway\"\n data-cy={props.name + \"BTTSArrayHomeOrAway\"}\n >\n <div className=\"BTTSResults\">BTTS</div>\n <span className={styleBTTS(props.BTTSArray[5])}>{props.BTTSArray[5]}</span>\n <span className={styleBTTS(props.BTTSArray[4])}>{props.BTTSArray[4]}</span>\n <span className={styleBTTS(props.BTTSArray[3])}>{props.BTTSArray[3]}</span>\n <span className={styleBTTS(props.BTTSArray[2])}>{props.BTTSArray[2]}</span>\n <span className={styleBTTS(props.BTTSArray[1])}>{props.BTTSArray[1]}</span>\n <span className={styleBTTS(props.BTTSArray[0])}>{props.BTTSArray[0]}</span>\n </li>\n <li\n key=\"TeamScored\"\n className=\"TeamScored\"\n data-cy={props.name + \"teamScored\"}\n >\n {`Avg goals scored - ${props.goals}`}\n </li>\n <li\n key=\"TeamConceeded\"\n className=\"TeamConceeded\"\n data-cy={props.name + \"teamConceded\"}\n >\n {`Avg goals conceeded - ${props.conceeded}`}\n </li>\n <li\n key=\"TeamPossession\"\n className=\"TeamPossession\"\n data-cy={props.name + \"teamPossession\"}\n >\n {`Avg possession - ${props.possession}%`}\n </li>\n <li key=\"TeamXG\" className=\"TeamXG\" data-cy={props.name + \"teamXG\"}>\n {`Avg XG - ${props.XG}`}\n </li>\n <li\n key=\"TeamXGConceded\"\n className=\"TeamXGConceded\"\n data-cy={props.name + \"teamXGConceded\"}\n >\n {`Avg XG conceded - ${props.XGConceded}`}\n </li>\n <li\n key=\"goalDifference\"\n className=\"goalDifference\"\n data-cy={props.name + \"goalDifference\"}\n >\n {`Goal difference : `}\n <span>{props.goalDifference}</span>\n </li>\n <li\n key=\"goalDifferenceHorA\"\n className=\"goalDifferenceHorA\"\n data-cy={props.name + \"goalDifference\"}\n >\n {`Goal difference ${props.homeOrAway} : ${props.goalDifferenceHomeOrAway}`}\n </li>\n <li\n key=\"AverageSOT\"\n className=\"AverageSOT\"\n data-cy={props.name + \"averageSOT\"}\n >\n {`Avg shots on target - ${props.sot}`}\n </li>\n <li\n key=\"DangerousAttacks\"\n className=\"DangerousAttacks\"\n data-cy={props.name + \"dangerousAttacks\"}\n >\n {`Avg dangerous attacks - ${props.dangerousAttacks}`}\n </li>\n <li\n key=\"LeaguePosition\"\n className=\"LeaguePosition\"\n data-cy={props.name + \"leaguePosition\"}\n >\n {`League position - ${props.leaguePosition}`}\n </li>\n\n <li\n key=\"LeaguePositionHomeOrAway\"\n className=\"LeaguePositionHomeOrAway\"\n data-cy={props.name + \"LeaguePositionHomeOrAway\"}\n >\n {`Position (${props.homeOrAway} only) - ${props.homeOrAwayLeaguePosition}`}\n </li>\n <li\n key=\"WinPercentage\"\n className=\"WinPercentage\"\n data-cy={props.name + \"WinPercentage\"}\n >\n {`${props.homeOrAway} wins - ${props.winPercentage.toFixed(1)}%`}\n </li>\n <li\n key=\"DrawPercentage\"\n className=\"DrawPercentage\"\n data-cy={props.name + \"DrawPercentage\"}\n >\n {`${props.homeOrAway} draws - ${props.drawPercentage.toFixed(1)}%`}\n </li>\n <li\n key=\"LossPercentage\"\n className=\"LossPercentage\"\n data-cy={props.name + \"LossPercentage\"}\n >\n {`${props.homeOrAway} losses - ${props.lossPercentage.toFixed(1)}%`}\n </li>\n <li key=\"PPG\" className=\"PPG\" data-cy={props.name + \"PPG\"}>\n {`Season PPG - ${props.ppg}`}\n </li>\n <li\n key=\"FormTrend10a\"\n className=\"FormTrend\"\n data-cy={props.name + \"FormTrend10\"}\n >\n {`Last 10 PPG: ${props.formTrend[0]}`}\n </li>\n <li\n key=\"FormTrend10b\"\n className=\"FormTrend\"\n data-cy={props.name + \"FormTrend10\"}\n >\n {`Last 6 PPG: ${props.formTrend[1]}`}\n </li>\n <li\n key=\"FormTrend10c\"\n className=\"FormTrend\"\n data-cy={props.name + \"FormTrend10\"}\n >\n {`Last 5 PPG: ${props.formTrend[2]}.`}\n </li>\n <li\n key=\"CardsTotal\"\n className=\"CardsTotal\"\n data-cy={props.name + \"CardsTotal\"}\n >\n {`Cards total: ${props.CardsTotal}`}\n </li>\n <li\n key=\"CornersAverage\"\n className=\"CornersAverage\"\n data-cy={props.name + \"CornersAverage\"}\n >\n {`Corners average: ${props.CornersAverage}`}\n </li>\n </ul>\n <div id=\"h2hStats\"></div>\n </Fragment>\n );\n } else {\n return (\n <Fragment>\n <ul className={props.className} style={props.style}>\n <li className=\"FormSummaryHome\">{props.FormTextString}</li>\n <li className=\"FavouriteSummaryAway\">{props.FavouriteRecord}</li>\n <li\n key=\"TeamScored\"\n className=\"TeamScored\"\n data-cy={props.name + \"teamScored\"}\n >\n {`Avg goals scored - ${props.goals}`}\n </li>\n <li\n key=\"TeamConceeded\"\n className=\"TeamConceeded\"\n data-cy={props.name + \"teamConceded\"}\n >\n {`Avg goals conceeded - ${props.conceeded}`}\n </li>\n <li\n key=\"TeamPossession\"\n className=\"TeamPossession\"\n data-cy={props.name + \"teamPossession\"}\n >\n {`Avg possession - ${props.possession}%`}\n </li>\n <li key=\"TeamXG\" className=\"TeamXG\" data-cy={props.name + \"teamXG\"}>\n {`Avg XG - ${props.XG}`}\n </li>\n <li\n key=\"TeamXGConceded\"\n className=\"TeamXGConceded\"\n data-cy={props.name + \"teamXGConceded\"}\n >\n {`Avg XG conceded - ${props.XGConceded}`}\n </li>\n <li\n key=\"AverageSOT\"\n className=\"AverageSOT\"\n data-cy={props.name + \"averageSOT\"}\n >\n {`Avg shots on target - ${props.sot}`}\n </li>\n <li\n key=\"DangerousAttacks\"\n className=\"DangerousAttacks\"\n data-cy={props.name + \"dangerousAttacks\"}\n >\n {`Avg dangerous attacks - ${props.dangerousAttacks}`}\n </li>\n <li\n key=\"LeaguePosition\"\n className=\"LeaguePosition\"\n data-cy={props.name + \"leaguePosition\"}\n >\n {`League position - ${props.leaguePosition}`}\n </li>\n\n <li\n key=\"LeaguePositionHomeOrAway\"\n className=\"LeaguePositionHomeOrAway\"\n data-cy={props.name + \"LeaguePositionHomeOrAway\"}\n >\n {`Position (${props.homeOrAway} only) - ${props.homeOrAwayLeaguePosition}`}\n </li>\n <li\n key=\"WinPercentage\"\n className=\"WinPercentage\"\n data-cy={props.name + \"WinPercentage\"}\n >\n {`${props.homeOrAway} wins - ${props.winPercentage.toFixed(1)}%`}\n </li>\n <li\n key=\"DrawPercentage\"\n className=\"DrawPercentage\"\n data-cy={props.name + \"DrawPercentage\"}\n >\n {`${props.homeOrAway} draws - ${props.drawPercentage.toFixed(1)}%`}\n </li>\n <li\n key=\"LossPercentage\"\n className=\"LossPercentage\"\n data-cy={props.name + \"LossPercentage\"}\n >\n {`${props.homeOrAway} losses - ${props.lossPercentage.toFixed(1)}%`}\n </li>\n <li key=\"PPG\" className=\"PPG\" data-cy={props.name + \"PPG\"}>\n {`Season PPG - ${props.ppg}`}\n </li>\n <li\n key=\"FormTrend10a\"\n className=\"FormTrend\"\n data-cy={props.name + \"FormTrend10\"}\n >\n {`Last 10 PPG: ${props.formTrend[0]}`}\n </li>\n <li\n key=\"FormTrend10b\"\n className=\"FormTrend\"\n data-cy={props.name + \"FormTrend10\"}\n >\n {`Last 6 PPG: ${props.formTrend[1]}`}\n </li>\n <li\n key=\"FormTrend10c\"\n className=\"FormTrend\"\n data-cy={props.name + \"FormTrend10\"}\n >\n {`Last 5 PPG: ${props.formTrend[2]}.`}\n </li>\n <li\n key=\"CardsTotal\"\n className=\"CardsTotal\"\n data-cy={props.name + \"CardsTotal\"}\n >\n {`Cards total: ${props.CardsTotal}`}\n </li>\n <li\n key=\"CornersAverage\"\n className=\"CornersAverage\"\n data-cy={props.name + \"CornersAverage\"}\n >\n {`Corners average: ${props.CornersAverage}`}\n </li>\n </ul>\n <div id=\"h2hStats\"></div>\n </Fragment>\n );\n }\n}\n\nexport default Stats;\n","/Users/gregdorward/Development/football-predictions/src/logic/getForm.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Button.js",[],"/Users/gregdorward/Development/football-predictions/src/logic/getScorePredictions.js",["209","210","211","212","213","214","215","216"],"import React, { Fragment } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { matches, diff } from \"./getFixtures\";\nimport { RenderAllFixtures } from \"../logic/getFixtures\";\nimport Div from \"../components/Div\";\nimport Collapsable from \"../components/CollapsableElement\";\nimport { allForm } from \"../logic/getFixtures\";\nimport Increment from \"../components/Increment\";\nimport { incrementValue } from \"../components/Increment\";\nimport { getBTTSPotential } from \"../logic/getBTTSPotential\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport { Slider } from \"../components/Carousel\";\nimport { StyledKofiButton } from \"../components/KofiButton\";\nimport {\n calculateAttackingStrength,\n calculateDefensiveStrength,\n calculateMetricStrength,\n getXGtoActualDifferentialStrength,\n} from \"./getStats\";\nimport { rangeValue } from \"../components/Slider\";\nimport {\n minimumGD,\n minimumXG,\n minimumLast10,\n minimumGDHorA,\n} from \"../components/SliderDiff\";\n\nvar myHeaders = new Headers();\nmyHeaders.append(\"Origin\", \"https://gregdorward.github.io\");\n\nlet finalHomeGoals;\nlet finalAwayGoals;\nlet rawFinalHomeGoals;\nlet rawFinalAwayGoals;\nlet homeOdds;\nlet awayOdds;\nlet totalGoals = 0;\nlet totalGoals2 = 0;\nlet numberOfGames = 0;\nlet drawPredictions = 0;\nlet homePredictions = 0;\nlet awayPredictions = 0;\nlet allOutcomes = 0;\nlet homeOutcomes = 0;\nlet awayOutcomes = 0;\nlet winAmount = 0;\nlet lossAmount = 0;\nlet sumStatDAWin = 0;\nlet sumStatDALoss = 0;\nlet sumStatPossessionWin = 0;\nlet sumStatPossessionLoss = 0;\nlet sumStatSOTWin = 0;\nlet sumStatSOTLoss = 0;\nlet sumStatPPGLast10Win = 0;\nlet sumStatPPGLast10Loss = 0;\nlet sumOddsWin = 0;\nlet sumOddsLoss = 0;\nlet sumXGForWin = 0;\nlet sumXGForLoss = 0;\nlet sumXGAgainstWin = 0;\nlet sumXGAgainstLoss = 0;\nlet allWinOutcomes = 0;\nlet allLossOutcomes = 0;\nlet allDrawOutcomes = 0;\nlet totalROI = 0;\nlet totalInvestment = 0;\nlet totalProfit = 0;\nexport let formObjectHome;\nexport let formObjectAway;\nexport let clicked = false;\n\nexport var renderPredictions;\n\nasync function convertTimestamp(timestamp) {\n let newDate = new Date(timestamp * 1000);\n let [day, month, year] = newDate.toLocaleDateString(\"en-US\").split(\"/\");\n\n let converted = `${year}-${day}-${month}`;\n\n return converted;\n}\n\nexport function getPointsFromLastX(lastX) {\n let points = 0;\n let pointsAddition;\n\n try {\n lastX.forEach((game) => {\n switch (true) {\n case game === \"W\":\n pointsAddition = 3;\n break;\n case game === \"D\":\n pointsAddition = 1;\n break;\n case game === \"L\":\n pointsAddition = 0;\n break;\n default:\n break;\n }\n\n points = points + pointsAddition;\n });\n return points;\n } catch (error) {\n console.log(error);\n return \"N/A\";\n }\n}\n\nasync function getPastLeagueResults(team, game, hOrA, form) {\n let date = game.date;\n if (allLeagueResultsArrayOfObjects[game.leagueIndex].fixtures.length > 10) {\n let teamsHomeResults = allLeagueResultsArrayOfObjects[\n game.leagueIndex\n ].fixtures.filter((fixture) => fixture.home_name === team);\n\n teamsHomeResults = teamsHomeResults\n .filter(function (item) {\n return item.date_unix < date;\n })\n .sort((a, b) => a.date_unix - b.date_unix);\n\n let teamsAwayResults = allLeagueResultsArrayOfObjects[\n game.leagueIndex\n ].fixtures.filter((fixture) => fixture.away_name === team);\n\n teamsAwayResults = teamsAwayResults\n .filter(function (item) {\n return item.date_unix < date;\n })\n .sort((a, b) => a.date_unix - b.date_unix);\n\n let homeResults = [];\n let awayResults = [];\n let oddsSumHome = 0;\n let oddsSumAway = 0;\n let favouriteCount = 0;\n let underdogCount = 0;\n let winningFavouriteCount = 0;\n let drawingFavouriteCount = 0;\n let beatenFavouriteCount = 0;\n let winningUnderdogCount = 0;\n let drawingUnderdogCount = 0;\n let beatenUnderdogCount = 0;\n for (let index = 0; index < teamsHomeResults.length; index++) {\n const resultedGame = teamsHomeResults[index];\n\n homeResults.push({\n homeTeam: resultedGame.home_name,\n homeGoals: resultedGame.homeGoalCount,\n XG: resultedGame.team_a_xg,\n awayTeam: resultedGame.away_name,\n awayGoals: resultedGame.awayGoalCount,\n XGAgainst: resultedGame.team_b_xg,\n possession: resultedGame.team_a_possession,\n scored: resultedGame.homeGoalCount,\n conceeded: resultedGame.awayGoalCount,\n shots: resultedGame.team_a_shots,\n sot: resultedGame.team_a_shotsOnTarget,\n sotAgainst: resultedGame.team_b_shotsOnTarget,\n dangerousAttacks: resultedGame.team_a_dangerous_attacks,\n corners: resultedGame.team_a_corners,\n date: await convertTimestamp(resultedGame.date_unix),\n dateRaw: resultedGame.date_unix,\n oddsHome: resultedGame.odds_ft_1,\n oddsAway: resultedGame.odds_ft_2,\n btts:\n resultedGame.homeGoalCount > 0 && resultedGame.awayGoalCount > 0\n ? true\n : false,\n points:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? 3\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? 0\n : 1,\n result:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? \"W\"\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? \"L\"\n : \"D\",\n });\n oddsSumHome = oddsSumHome + resultedGame.odds_ft_1;\n favouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2\n ? favouriteCount + 1\n : favouriteCount + 0;\n winningFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? winningFavouriteCount + 1\n : winningFavouriteCount + 0;\n drawingFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingFavouriteCount + 1\n : drawingFavouriteCount + 0;\n beatenFavouriteCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? beatenFavouriteCount + 1\n : beatenFavouriteCount + 0;\n\n underdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2\n ? underdogCount + 1\n : underdogCount + 0;\n winningUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? winningUnderdogCount + 1\n : winningUnderdogCount + 0;\n drawingUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingUnderdogCount + 1\n : drawingUnderdogCount + 0;\n beatenUnderdogCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? beatenUnderdogCount + 1\n : beatenUnderdogCount + 0;\n }\n for (let index = 0; index < teamsAwayResults.length; index++) {\n const resultedGame = teamsAwayResults[index];\n awayResults.push({\n homeTeam: resultedGame.home_name,\n homeGoals: resultedGame.homeGoalCount,\n XG: resultedGame.team_b_xg,\n awayTeam: resultedGame.away_name,\n awayGoals: resultedGame.awayGoalCount,\n XGAgainst: resultedGame.team_a_xg,\n possession: resultedGame.team_b_possession,\n scored: resultedGame.awayGoalCount,\n conceeded: resultedGame.homeGoalCount,\n shots: resultedGame.team_b_shots,\n sot: resultedGame.team_b_shotsOnTarget,\n sotAgainst: resultedGame.team_a_shotsOnTarget,\n dangerousAttacks: resultedGame.team_b_dangerous_attacks,\n corners: resultedGame.team_b_corners,\n date: await convertTimestamp(resultedGame.date_unix),\n dateRaw: resultedGame.date_unix,\n oddsHome: resultedGame.odds_ft_1,\n oddsAway: resultedGame.odds_ft_2,\n btts:\n resultedGame.homeGoalCount > 0 && resultedGame.awayGoalCount > 0\n ? true\n : false,\n points:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? 0\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? 3\n : 1,\n result:\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? \"L\"\n : resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? \"W\"\n : \"D\",\n });\n oddsSumAway = oddsSumAway + resultedGame.odds_ft_2;\n favouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2\n ? favouriteCount + 1\n : favouriteCount + 0;\n winningFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? winningFavouriteCount + 1\n : winningFavouriteCount + 0;\n drawingFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingFavouriteCount + 1\n : drawingFavouriteCount + 0;\n beatenFavouriteCount =\n resultedGame.odds_ft_1 > resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? beatenFavouriteCount + 1\n : beatenFavouriteCount + 0;\n\n underdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2\n ? underdogCount + 1\n : underdogCount + 0;\n winningUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount < resultedGame.awayGoalCount\n ? winningUnderdogCount + 1\n : winningUnderdogCount + 0;\n drawingUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount === resultedGame.awayGoalCount\n ? drawingUnderdogCount + 1\n : drawingUnderdogCount + 0;\n beatenUnderdogCount =\n resultedGame.odds_ft_1 < resultedGame.odds_ft_2 &&\n resultedGame.homeGoalCount > resultedGame.awayGoalCount\n ? beatenUnderdogCount + 1\n : beatenUnderdogCount + 0;\n }\n\n let reversedResultsHome = homeResults;\n let reversedResultsAway = awayResults;\n\n console.log(game.homeTeam)\n console.log(team)\n\n if (game.homeTeam === team) {\n let y = game.homeOdds;\n //Clear fav\n if (y <= 1.5) {\n const allClearFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 1.45\n );\n const allClearFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 1.45\n );\n\n form.simlarGameResultsHome = allClearFavouriteResultsHome\n .concat(allClearFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //fav\n else if (y <= 2.1) {\n const allSlightFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.1 && fixture.oddsHome > 1.45\n );\n const allSlightFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.1 && fixture.oddsAway > 1.45\n );\n game.simlarGameResultsHome = allSlightFavouriteResultsHome\n .concat(allSlightFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Tossup\n else if (y <= 2.75) {\n const allTossupResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.75 && fixture.oddsHome > 2.1\n );\n const allTossupResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.75 && fixture.oddsAway > 2.1\n );\n game.simlarGameResultsHome = allTossupResultsHome\n .concat(allTossupResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Underdog\n else if (y <= 4) {\n const allUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 4 && fixture.oddsHome > 2.75\n );\n const allUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 4 && fixture.oddsAway > 2.75\n );\n game.simlarGameResultsHome = allUnderdogResultsHome\n .concat(allUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //MassiveUnderdog\n else if (y > 4) {\n const allMassiveUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome > 4\n );\n const allMassiveUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway > 4\n );\n game.simlarGameResultsHome = allMassiveUnderdogResultsHome\n .concat(allMassiveUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n } else if (game.awayTeam === team) {\n let z = game.awayOdds;\n //Clear fav\n if (z <= 1.5) {\n const allClearFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 1.45\n );\n const allClearFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 1.45\n );\n\n game.simlarGameResultsAway = allClearFavouriteResultsHome\n .concat(allClearFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //fav\n else if (z <= 2.1) {\n const allSlightFavouriteResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.1 && fixture.oddsHome > 1.45\n );\n const allSlightFavouriteResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.1 && fixture.oddsAway > 1.45\n );\n game.simlarGameResultsAway = allSlightFavouriteResultsHome\n .concat(allSlightFavouriteResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Tossup\n else if (z <= 2.75) {\n const allTossupResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 2.75 && fixture.oddsHome > 2.1\n );\n const allTossupResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 2.75 && fixture.oddsAway > 2.1\n );\n game.simlarGameResultsAway = allTossupResultsHome\n .concat(allTossupResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //Underdog\n else if (z <= 4) {\n const allUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome <= 4 && fixture.oddsHome > 2.75\n );\n const allUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway <= 4 && fixture.oddsAway > 2.75\n );\n game.simlarGameResultsAway = allUnderdogResultsHome\n .concat(allUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n //MassiveUnderdog\n else if (z > 4) {\n const allMassiveUnderdogResultsHome = reversedResultsHome.filter(\n (fixture) => fixture.oddsHome > 4.5\n );\n const allMassiveUnderdogResultsAway = reversedResultsAway.filter(\n (fixture) => fixture.oddsAway > 4.5\n );\n game.simlarGameResultsAway = allMassiveUnderdogResultsHome\n .concat(allMassiveUnderdogResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n }\n }\n\n const allTeamResults = reversedResultsHome\n .concat(reversedResultsAway)\n .sort((a, b) => a.dateRaw - b.dateRaw);\n\n const allTeamResultsHome = reversedResultsHome.sort(\n (a, b) => b.dateRaw - a.dateRaw\n );\n const allTeamResultsAway = reversedResultsAway.sort(\n (a, b) => b.dateRaw - a.dateRaw\n );\n\n console.log(game.game);\n console.log(allTeamResults);\n console.log(allTeamResultsHome);\n\n form.allTeamResults = allTeamResults.sort((b, a) => a.dateRaw - b.dateRaw);\n\n const points6 = allTeamResults.map((res) => res.points).slice(0, 6);\n const pointsSum6 = points6.reduce((a, b) => a + b, 0);\n form.avPoints6 = pointsSum6 / points6.length;\n\n const points5 = allTeamResults.map((res) => res.points).slice(0, 5);\n const pointsSum5 = points5.reduce((a, b) => a + b, 0);\n form.avPoints5 = pointsSum5 / points5.length;\n\n const pointsAll = allTeamResults.map((res) => res.points);\n const pointsSumAll = pointsAll.reduce((a, b) => a + b, 0);\n form.avPointsAll = pointsSumAll / pointsAll.length;\n\n const resultsAll = allTeamResults.map((res) => res.result);\n const resultsHome = allTeamResultsHome.map((res) => res.result);\n const resultsAway = allTeamResultsAway.map((res) => res.result);\n\n form.resultsAll = resultsAll.slice(0, 6);\n form.resultsHome = resultsHome.slice(0, 6);\n form.resultsAway = resultsAway.slice(0, 6);\n\n const avScoredLast5 = allTeamResults.map((res) => res.scored).slice(0, 5);\n const avScoredLast5Sum = avScoredLast5.reduce((a, b) => a + b, 0);\n form.avScoredLast5 = avScoredLast5Sum / avScoredLast5.length;\n const avConceededLast5 = allTeamResults\n .map((res) => res.conceeded)\n .slice(0, 5);\n const avConceededLast5Sum = avConceededLast5.reduce((a, b) => a + b, 0);\n form.avConceededLast5 = avConceededLast5Sum / avConceededLast5.length;\n const avDALast5 = allTeamResults\n .map((res) => res.dangerousAttacks)\n .slice(0, 5);\n const avDALast5Sum = avDALast5.reduce((a, b) => a + b, 0);\n form.avDALast5 = avDALast5Sum / avDALast5.length;\n const avSOTLast5 = allTeamResults.map((res) => res.sot).slice(0, 5);\n const avSOTLast5Sum = avSOTLast5.reduce((a, b) => a + b, 0);\n form.avSOTLast5 = avSOTLast5Sum / avSOTLast5.length;\n const avSOTAgainstLast5 = allTeamResults\n .map((res) => res.sotAgainst)\n .slice(0, 5);\n const avSOTAgainstLast5Sum = avSOTAgainstLast5.reduce((a, b) => a + b, 0);\n form.avSOTAgainstLast5 = avSOTAgainstLast5Sum / avSOTAgainstLast5.length;\n const avShotsLast5 = allTeamResults.map((res) => res.shots).slice(0, 5);\n const avShotsLast5Sum = avShotsLast5.reduce((a, b) => a + b, 0);\n form.avShotsLast5 = avShotsLast5Sum / avShotsLast5.length;\n const avCornersLast5 = allTeamResults.map((res) => res.corners).slice(0, 5);\n const avCornersLast5Sum = avCornersLast5.reduce((a, b) => a + b, 0);\n form.avCornersLast5 = avCornersLast5Sum / avCornersLast5.length;\n const avPosessionLast5 = allTeamResults\n .map((res) => res.possession)\n .slice(0, 6);\n const avPosessionLast5Sum = avPosessionLast5.reduce((a, b) => a + b, 0);\n form.avPosessionLast5 = avPosessionLast5Sum / avPosessionLast5.length;\n const avXGLast5 = allTeamResults.map((res) => res.XG).slice(0, 5);\n const avXGLast5Sum = avXGLast5.reduce((a, b) => a + b, 0);\n form.avXGLast5 = avXGLast5Sum / avXGLast5.length;\n const avXGAgainstLast5 = allTeamResults\n .map((res) => res.XGAgainst)\n .slice(0, 5);\n\n // console.log(form.teamName);\n\n // console.log(\"avConceededLast5\")\n // console.log(avConceededLast5)\n // console.log(\"avSOTLast5\")\n // console.log(avSOTLast5)\n\n // console.log(\"avSOTAgainstLast5\")\n // console.log(avSOTAgainstLast5)\n\n // console.log(\"avShotsLast5\")\n // console.log(avShotsLast5)\n\n // console.log(\"avCornersLast5\")\n // console.log(avCornersLast5)\n\n // console.log(\"avPosessionLast5\")\n // console.log(avPosessionLast5)\n\n // console.log(\"avXGLast5\")\n // console.log(avXGLast5)\n\n // console.log(\"avXGAgainstLast5\")\n // console.log(avXGAgainstLast5)\n\n const avXGAgainstLast5Sum = avXGAgainstLast5.reduce((a, b) => a + b, 0);\n form.avXGAgainstLast5 = avXGAgainstLast5Sum / avXGAgainstLast5.length;\n\n const averageOddsHome = oddsSumHome / teamsHomeResults.length;\n const averageOddsAway = oddsSumAway / teamsAwayResults.length;\n form.favouriteCount = favouriteCount;\n form.winningFavouriteCount = winningFavouriteCount;\n form.drawingFavouriteCount = drawingFavouriteCount;\n form.beatenFavouriteCount = beatenFavouriteCount;\n\n form.underdogCount = underdogCount;\n form.winningUnderdogCount = winningUnderdogCount;\n form.drawingUnderdogCount = drawingUnderdogCount;\n form.beatenUnderdogCount = beatenUnderdogCount;\n\n form.oddsReliabilityWin =\n favouriteCount > 0\n ? (form.winningFavouriteCount / form.favouriteCount) * 100\n : 0;\n form.oddsReliabilityDraw =\n favouriteCount > 0\n ? (form.drawingFavouriteCount / form.favouriteCount) * 100\n : 0;\n form.oddsReliabilityLose =\n favouriteCount > 0\n ? (form.beatenFavouriteCount / form.favouriteCount) * 100\n : 0;\n\n form.oddsReliabilityWinAsUnderdog =\n underdogCount > 0\n ? (form.winningUnderdogCount / form.underdogCount) * 100\n : 0;\n form.oddsReliabilityDrawAsUnderdog =\n underdogCount > 0\n ? (form.drawingUnderdogCount / form.underdogCount) * 100\n : 0;\n form.oddsReliabilityLoseAsUnderdog =\n underdogCount > 0\n ? (form.beatenUnderdogCount / form.underdogCount) * 100\n : 0;\n\n form.reliableIndicator =\n form.winningFavouriteCount + form.beatenUnderdogCount;\n form.unreliableIndicator =\n form.beatenFavouriteCount +\n form.drawingFavouriteCount +\n form.winningUnderdogCount +\n form.drawingUnderdogCount;\n\n form.predictabilityScore =\n form.reliableIndicator / form.unreliableIndicator;\n\n let reliabilityString;\n\n switch (true) {\n case form.predictabilityScore < 0.3:\n reliabilityString =\n \"Odds have been an extremely unreliable indicator of actual performance so far this season. Maybe best avoided?\";\n break;\n case form.predictabilityScore >= 0.3 && form.predictabilityScore < 0.8:\n reliabilityString =\n \"Odds have been an unreliable indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 0.8 && form.predictabilityScore < 1.2:\n reliabilityString =\n \"Odds have been a decent indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 1.2 && form.predictabilityScore < 1.7:\n reliabilityString =\n \"Odds have been a good indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 1.7 && form.predictabilityScore < 2.2:\n reliabilityString =\n \"Odds have been a very good indicator of actual performance so far this season\";\n break;\n case form.predictabilityScore >= 2.2:\n reliabilityString =\n \"Odds have been an excellent indicator of actual performance so far this season. One for the multi?\";\n break;\n default:\n break;\n }\n\n form.reliabilityString = reliabilityString;\n\n const teamGoalsHome = reversedResultsHome.map((res) => res.scored);\n\n const teamGoalsAway = awayResults.map((res) => res.scored);\n const teamGoalsAll = allTeamResults.map((res) => res.scored);\n const teamGoalsAllRecentAtStart = teamGoalsAll.reverse();\n const teamConceededHome = homeResults.map((res) => res.conceeded);\n const teamConceededAway = awayResults.map((res) => res.conceeded);\n const teamConceededAll = allTeamResults.map((res) => res.conceeded);\n const teamConceededAllRecentAtStart = teamConceededAll.reverse();\n\n const teamXGForAll = allTeamResults.map((res) => res.XG);\n const teamXGAgainstAll = allTeamResults.map((res) => res.XGAgainst);\n const teamXGForAllRecentAtStart = teamXGForAll.reverse();\n const teamXGAgainstAllRecentAtStart = teamXGAgainstAll.reverse();\n\n const teamXGForHome = homeResults.map((res) => res.XG);\n const teamXGAgainstHome = homeResults.map((res) => res.XGAgainst);\n const teamXGForAway = awayResults.map((res) => res.XG);\n const teamXGAgainstAway = awayResults.map((res) => res.XGAgainst);\n\n const XGSum = teamXGForAll.reduce((a, b) => a + b, 0);\n const avgXGScored = XGSum / teamXGForAll.length || 0;\n const XGAgainstSum = teamXGAgainstAll.reduce((a, b) => a + b, 0);\n const avgXGConceeded = XGAgainstSum / teamXGAgainstAll.length || 0;\n\n const possession = allTeamResults.map((res) => res.possession);\n const possessionSum = possession.reduce((a, b) => a + b, 0);\n const avgPossession = possessionSum / possession.length || 0;\n\n const possessionHome = homeResults.map((res) => res.possession);\n const possessionSumHome = possessionHome.reduce((a, b) => a + b, 0);\n form.avgPossessionHome = possessionSumHome / possessionHome.length || 0;\n\n const possessionAway = awayResults.map((res) => res.possession);\n const possessionSumAway = possessionAway.reduce((a, b) => a + b, 0);\n form.avgPossessionAway = possessionSumAway / possessionAway.length || 0;\n\n const dangerousAttacks = allTeamResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSum = dangerousAttacks.reduce((a, b) => a + b, 0);\n const avgDangerousAttacks =\n dangerousAttacksSum / dangerousAttacks.length || 0;\n\n const dangerousAttacksHome = homeResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSumHome = dangerousAttacksHome.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgDangerousAttacksHome =\n dangerousAttacksSumHome / dangerousAttacksHome.length || 0;\n\n const dangerousAttacksAway = awayResults.map((res) => res.dangerousAttacks);\n const dangerousAttacksSumAway = dangerousAttacksAway.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgDangerousAttacksAway =\n dangerousAttacksSumAway / dangerousAttacksAway.length || 0;\n\n const shots = allTeamResults.map((res) => res.shots);\n const shotsSum = shots.reduce((a, b) => a + b, 0);\n const avgShots = shotsSum / shots.length || 0;\n form.avgShots = avgShots;\n\n const shotsHome = homeResults.map((res) => res.shots);\n const shotsSumHome = shotsHome.reduce((a, b) => a + b, 0);\n form.avgShotsHome = shotsSumHome / shotsHome.length || 0;\n\n const shotsAway = awayResults.map((res) => res.shots);\n const shotsSumAway = shotsAway.reduce((a, b) => a + b, 0);\n form.avgShotsAway = shotsSumAway / shotsAway.length || 0;\n\n const shotsOnTarget = allTeamResults.map((res) => res.sot);\n const shotsOnTargetSum = shotsOnTarget.reduce((a, b) => a + b, 0);\n const avgShotsOnTarget = shotsOnTargetSum / shotsOnTarget.length || 0;\n\n const shotsOnTargetHome = homeResults.map((res) => res.sot);\n const shotsOnTargetSumHome = shotsOnTargetHome.reduce((a, b) => a + b, 0);\n form.avgShotsOnTargetHome =\n shotsOnTargetSumHome / shotsOnTargetHome.length || 0;\n\n const shotsOnTargetAway = awayResults.map((res) => res.sot);\n const shotsOnTargetSumAway = shotsOnTargetAway.reduce((a, b) => a + b, 0);\n form.avgShotsOnTargetAway =\n shotsOnTargetSumAway / shotsOnTargetAway.length || 0;\n\n const shotsOnTargetAgainst = allTeamResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainst = shotsOnTargetAgainst.reduce(\n (a, b) => a + b,\n 0\n );\n const avgShotsOnTargetAgainst =\n shotsOnTargetSumAgainst / shotsOnTargetAgainst.length || 0;\n\n const shotsOnTargetAgainstHome = homeResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainstHome = shotsOnTargetAgainstHome.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgShotsOnTargetAgainstHome =\n shotsOnTargetSumAgainstHome / shotsOnTargetAgainstHome.length || 0;\n\n const shotsOnTargetAgainstAway = awayResults.map((res) => res.sotAgainst);\n const shotsOnTargetSumAgainstAway = shotsOnTargetAgainstAway.reduce(\n (a, b) => a + b,\n 0\n );\n form.avgShotsOnTargetAgainstAway =\n shotsOnTargetSumAgainstAway / shotsOnTargetAgainstAway.length || 0;\n\n const corners = allTeamResults.map((res) => res.corners);\n const cornersSum = corners.reduce((a, b) => a + b, 0);\n const cornersAv = cornersSum / corners.length || 0;\n\n const cornersHome = homeResults.map((res) => res.corners);\n const cornersSumHome = cornersHome.reduce((a, b) => a + b, 0);\n form.cornersAvHome = cornersSumHome / cornersHome.length || 0;\n\n const cornersAway = awayResults.map((res) => res.corners);\n const cornersSumAway = cornersAway.reduce((a, b) => a + b, 0);\n form.cornersAvAway = cornersSumAway / cornersAway.length || 0;\n\n const last5XG = teamXGForAllRecentAtStart.slice(0, 5);\n const last5XGSum = last5XG.reduce((a, b) => a + b, 0);\n const last5XGAvgFor = last5XGSum / last5XG.length || 0;\n\n const last5XGHome = teamXGForHome.slice(0, 5);\n const last5XGSumHome = last5XGHome.reduce((a, b) => a + b, 0);\n form.last5XGAvgForHome = last5XGSumHome / last5XGHome.length || 0;\n\n const last5XGAway = teamXGForAway.slice(0, 5);\n const last5XGSumAway = last5XGAway.reduce((a, b) => a + b, 0);\n form.last5XGAvgForAway = last5XGSumAway / last5XGAway.length || 0;\n\n const XGSumHome = teamXGForHome.reduce((a, b) => a + b, 0);\n form.avgXGScoredHome = XGSumHome / teamXGForHome.length || 0;\n\n const XGSumAway = teamXGForAway.reduce((a, b) => a + b, 0);\n form.avgXGScoredAway = XGSumAway / teamXGForAway.length || 0;\n\n const XGAgainstSumHome = teamXGAgainstHome.reduce((a, b) => a + b, 0);\n form.avgXGConceededHome = XGAgainstSumHome / teamXGAgainstHome.length || 0;\n\n const XGAgainstSumAway = teamXGAgainstAway.reduce((a, b) => a + b, 0);\n form.avgXGConceededAway = XGAgainstSumAway / teamXGAgainstAway.length || 0;\n\n const last5XGAgainst = teamXGAgainstAllRecentAtStart.slice(0, 5);\n const last5XGAgainstSum = last5XGAgainst.reduce((a, b) => a + b, 0);\n const last5XGAvgAgainst = last5XGAgainstSum / last5XGAgainst.length || 0;\n\n const last5XGAgainstHome = teamXGForHome.slice(0, 5);\n const last5XGAgainstSumHome = last5XGAgainstHome.reduce((a, b) => a + b, 0);\n form.last5XGAvgAgainstHome =\n last5XGAgainstSumHome / last5XGAgainstHome.length || 0;\n\n const last5XGAgainstAway = teamXGForAway.slice(0, 5);\n const last5XGAgainstSumAway = last5XGAgainstAway.reduce((a, b) => a + b, 0);\n form.last5XGAvgAgainstAway =\n last5XGAgainstSumAway / last5XGAgainstAway.length || 0;\n\n form.XGDiffNonAverage = XGSum - XGAgainstSum;\n form.XGDiffNonAverageLast5 = last5XGSum - last5XGAgainstSum;\n\n form.XGOverall = parseFloat(avgXGScored.toFixed(2));\n form.XGlast5 = parseFloat(last5XGAvgFor.toFixed(2));\n\n form.XGAgainstAvgOverall = parseFloat(avgXGConceeded.toFixed(2));\n form.XGAgainstlast5 = parseFloat(last5XGAvgAgainst.toFixed(2));\n\n form.AveragePossessionOverall = parseFloat(avgPossession.toFixed(1));\n form.AverageDangerousAttacksOverall = parseFloat(\n avgDangerousAttacks.toFixed(1)\n );\n form[\"Average Shots\"] = parseFloat(avgShots.toFixed(1));\n form.AverageCorners = parseFloat(cornersAv.toFixed(1));\n form.AverageShotsOnTargetOverall = parseFloat(avgShotsOnTarget.toFixed(1));\n form.AverageShotsOnTargetAgainstOverall = parseFloat(\n avgShotsOnTargetAgainst.toFixed(1)\n );\n const alpha = 0.75;\n const beta = 0.75;\n\n let forAndAgainstRollingAv;\n let forAndAgainstRollingAvHomeOrAway;\n if (hOrA === \"home\") {\n form.allGoalsArrayHomeRecent = teamGoalsAllRecentAtStart.slice(0, 20);\n form.allConceededArrayHomeRecent = teamConceededAllRecentAtStart.slice(\n 0,\n 20\n );\n form.allGoalsArrayHome = teamGoalsAllRecentAtStart;\n form.allConceededArrayHome = teamConceededAllRecentAtStart;\n form.allGoalsArrayHomeOnly = teamGoalsHome;\n form.allConceededArrayHomeOnly = teamConceededHome;\n const sum = teamGoalsHome.reduce((a, b) => a + b, 0);\n const sumTwo = teamConceededHome.reduce((a, b) => a + b, 0);\n form.goalDifferenceHomeOrAway = sum - sumTwo;\n\n forAndAgainstRollingAv = await predictGoalsWithExponentialSmoothing(\n teamGoalsAll.reverse(),\n teamConceededAll.reverse(),\n alpha\n );\n forAndAgainstRollingAvHomeOrAway =\n await predictGoalsWithExponentialSmoothing(\n teamGoalsHome,\n teamConceededHome,\n beta\n );\n } else if (hOrA === \"away\") {\n form.allGoalsArrayAwayRecent = teamGoalsAllRecentAtStart.slice(0, 20);\n form.allConceededArrayAwayRecent = teamConceededAllRecentAtStart.slice(\n 0,\n 20\n );\n form.allGoalsArrayAway = teamGoalsAllRecentAtStart;\n form.allConceededArrayAway = teamConceededAllRecentAtStart;\n form.allGoalsArrayAwayOnly = teamGoalsAway;\n form.allConceededArrayAwayOnly = teamConceededAway;\n const sum = teamGoalsAway.reduce((a, b) => a + b, 0);\n const sumTwo = teamConceededAway.reduce((a, b) => a + b, 0);\n form.goalDifferenceHomeOrAway = sum - sumTwo;\n forAndAgainstRollingAv = await predictGoalsWithExponentialSmoothing(\n teamGoalsAll.reverse(),\n teamConceededAll.reverse(),\n alpha\n );\n forAndAgainstRollingAvHomeOrAway =\n await predictGoalsWithExponentialSmoothing(\n teamGoalsAway,\n teamConceededAway,\n beta\n );\n }\n\n let bttsHome = homeResults.map((res) => res.btts);\n if (bttsHome.length > 10) {\n bttsHome = bttsHome.slice(-10);\n }\n\n let bttsAway = awayResults.map((res) => res.btts);\n if (bttsAway.length > 10) {\n bttsAway = bttsAway.slice(-10);\n }\n\n let bttsAll = allTeamResults.map((res) => res.btts);\n if (bttsAll.length > 10) {\n bttsAll = bttsAll.slice(-10);\n }\n\n const bttsHomeCount = bttsHome.filter((btts) => btts === true);\n const bttsHomeString = `${bttsHomeCount.length}/${bttsHome.length}`;\n const bttsHomePercentage = (\n (bttsHomeCount.length / bttsHome.length) *\n 100\n ).toFixed(0);\n\n const bttsAwayCount = bttsAway.filter((btts) => btts === true);\n const bttsAwayString = `${bttsAwayCount.length}/${bttsAway.length}`;\n const bttsAwayPercentage = (\n (bttsAwayCount.length / bttsAway.length) *\n 100\n ).toFixed(0);\n const bttsAllCount = bttsAll.filter((btts) => btts === true);\n const bttsAllString = `${bttsAllCount.length}/${bttsAll.length}`;\n const bttsAllPercentage = (\n (bttsAllCount.length / bttsAll.length) *\n 100\n ).toFixed(0);\n form.bttsAllPercentage = bttsAllPercentage;\n form.bttsHomePercentage = bttsHomePercentage;\n form.bttsAwayPercentage = bttsAwayPercentage;\n\n let r = 10;\n let x = 10;\n\n const teamGoalsHomeRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsHome,\n teamGoalsHome.length < x ? teamGoalsHome.length : x\n );\n\n const teamGoalsAwayRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsAway,\n teamGoalsAway.length < x ? teamGoalsAway.length : x\n );\n\n const RoundedXGFor = teamXGForAll.map((xg) => xg);\n const RoundedXGAgainst = teamXGAgainstAll.map((xg) => xg);\n const RoundedXGForHome = teamXGForHome.map((xg) => xg);\n const RoundedXGAgainstHome = teamXGAgainstHome.map((xg) => xg);\n const RoundedXGForAway = teamXGForAway.map((xg) => xg);\n const RoundedXGAgainstAway = teamXGAgainstAway.map((xg) => xg);\n\n form.XGPrediction = await predictGoalsWithExponentialSmoothing(\n RoundedXGFor,\n RoundedXGAgainst,\n alpha\n );\n\n form.XGPredictionHome = await predictGoalsWithExponentialSmoothing(\n RoundedXGForHome,\n RoundedXGAgainstHome,\n beta\n );\n\n form.XGPredictionAway = await predictGoalsWithExponentialSmoothing(\n RoundedXGForAway,\n RoundedXGAgainstAway,\n beta\n );\n\n const teamConceededHomeRollingAverage =\n await predictNextWeightedMovingAverage(\n teamConceededHome,\n teamConceededHome.length < x ? teamConceededHome.length : x\n );\n\n const teamConceededAwayRollingAverage =\n await predictNextWeightedMovingAverage(\n teamConceededAway,\n teamConceededAway.length < x ? teamConceededAway.length : x\n );\n\n const sum = teamGoalsAll.reduce((a, b) => a + b, 0);\n const avgScored = sum / teamGoalsAll.length || 0;\n form.avgScored = avgScored.toFixed(2);\n\n const sumHome = teamGoalsHome.reduce((a, b) => a + b, 0);\n const avgScoredHome = sumHome / teamGoalsAll.length || 0;\n form.avgScoredHome = avgScoredHome.toFixed(2);\n\n const sumAway = teamGoalsAway.reduce((a, b) => a + b, 0);\n const avgScoredAway = sumAway / teamGoalsAway.length || 0;\n form.avgScoredAway = avgScoredAway.toFixed(2);\n\n const last5 = teamGoalsAllRecentAtStart.slice(0, 5);\n const last5Sum = last5.reduce((a, b) => a + b, 0);\n const last5AvgScored = last5Sum / last5.length || 0;\n\n const last5Home = teamGoalsHome.slice(0, 5);\n const last5SumHome = last5Home.reduce((a, b) => a + b, 0);\n form.last5AvgScoredHome = last5SumHome / last5Home.length || 0;\n\n const last5Away = teamGoalsAway.slice(0, 5);\n const last5SumAway = last5Away.reduce((a, b) => a + b, 0);\n form.last5AvgScoredAway = last5SumAway / last5Away.length || 0;\n\n const last5Conceeded = teamConceededAllRecentAtStart.slice(0, 5);\n const last5ConceededSum = last5Conceeded.reduce((a, b) => a + b, 0);\n const last5AvgConceeded = last5ConceededSum / last5Conceeded.length || 0;\n\n const last5ConceededHome = teamConceededHome.slice(0, 5);\n const last5ConceededSumHome = last5ConceededHome.reduce((a, b) => a + b, 0);\n form.last5AvgConceededHome =\n last5ConceededSumHome / last5ConceededHome.length || 0;\n\n const last5ConceededAway = teamConceededAway.slice(0, 5);\n const last5ConceededSumAway = last5ConceededAway.reduce((a, b) => a + b, 0);\n form.last5AvgConceededAway =\n last5ConceededSumAway / last5ConceededAway.length || 0;\n\n const last10 = teamGoalsAllRecentAtStart.slice(0, 10);\n const last10Sum = last10.reduce((a, b) => a + b, 0);\n const last10AvgScored = last10Sum / last10.length || 0;\n\n const last10Conceeded = teamConceededAllRecentAtStart.slice(0, 10);\n const last10ConceededSum = last10Conceeded.reduce((a, b) => a + b, 0);\n const last10AvgConceeded = last10ConceededSum / last10Conceeded.length || 0;\n\n form.last5Goals = parseFloat(last5AvgScored.toFixed(2));\n form.last5GoalsConceeded = parseFloat(last5AvgConceeded.toFixed(2));\n form.last5GoalDiff = form.last5Goals - form.last5GoalsConceeded;\n form.last10Goals = parseFloat(last10AvgScored.toFixed(2));\n form.last10GoalsConceeded = parseFloat(last10AvgConceeded.toFixed(2));\n form.last10GoalDiff = form.last10Goals - form.last10GoalsConceeded;\n\n const teamGoalsAllRollingAverage = await predictNextWeightedMovingAverage(\n teamGoalsAll,\n teamGoalsAll.length < r ? teamGoalsAll.length : r\n );\n\n const teamGoalsConceededAllRollingAverage =\n await predictNextWeightedMovingAverage(\n last10Conceeded,\n last10Conceeded.length < r ? last10Conceeded.length : r\n );\n\n const sumTwo = teamConceededAll.reduce((a, b) => a + b, 0);\n const avgConceeded = sumTwo / teamConceededAll.length || 0;\n form.avgConceeded = avgConceeded.toFixed(2);\n\n const teamConceededHomeOnlySum = teamConceededHome.reduce(\n (a, b) => a + b,\n 0\n );\n const teamConceededAvgHomeOnly =\n teamConceededHomeOnlySum / teamConceededHome.length || 0;\n form.teamConceededAvgHomeOnly = teamConceededAvgHomeOnly;\n\n const teamConceededAwayOnlySum = teamConceededAway.reduce(\n (a, b) => a + b,\n 0\n );\n const teamConceededAvgAwayOnly =\n teamConceededAwayOnlySum / teamConceededAway.length || 0;\n form.teamConceededAvgAwayOnly = teamConceededAvgAwayOnly;\n\n form.goalDifference = sum - sumTwo;\n\n // console.log(teamGoalsHomeRollingAverage)\n // console.log(teamGoalsAwayRollingAverage)\n // console.log(teamGoalsAllRollingAverage)\n // console.log(teamConceededHomeRollingAverage)\n // console.log(teamConceededAwayRollingAverage)\n // console.log(teamGoalsConceededAllRollingAverage)\n // console.log(averageOddsHome)\n // console.log(averageOddsAway)\n // console.log(avgScored)\n // console.log(avgConceeded)\n // console.log(form.XGPrediction)\n // console.log(forAndAgainstRollingAvHomeOrAway)\n // console.log(forAndAgainstRollingAv)\n\n return [\n teamGoalsHomeRollingAverage,\n teamGoalsAwayRollingAverage,\n teamGoalsAllRollingAverage,\n teamConceededHomeRollingAverage,\n teamConceededAwayRollingAverage,\n teamGoalsConceededAllRollingAverage,\n averageOddsHome,\n averageOddsAway,\n avgScored,\n avgConceeded,\n bttsAllString,\n bttsHomeString,\n bttsAwayString,\n bttsAllPercentage,\n bttsHomePercentage,\n bttsAwayPercentage,\n forAndAgainstRollingAvHomeOrAway,\n forAndAgainstRollingAv,\n ];\n } else {\n return null;\n }\n}\n\nasync function predictNextWeightedMovingAverage(numbers, windowSize) {\n const startIndex = numbers.length - windowSize;\n const window = numbers.slice(startIndex);\n const weights = Array.from(\n { length: windowSize },\n (_, i) => (i + 1) / ((windowSize * (windowSize + 1)) / 2)\n );\n const sum = window.reduce((acc, num, i) => acc + num * weights[i], 0);\n const movingAverage = sum / weights.reduce((acc, w) => acc + w, 0);\n return parseFloat(movingAverage.toFixed(2));\n}\n\n// Function to calculate the weighted average using exponential smoothing\nasync function calculateWeightedAverage(arr, alpha) {\n let weightedSum = 0;\n let totalWeight = 0;\n\n for (let i = arr.length - 1; i >= 0; i--) {\n const weight = Math.pow(1 - alpha, arr.length - 1 - i);\n weightedSum += arr[i] * weight;\n totalWeight += weight;\n }\n\n return weightedSum / totalWeight;\n}\n\n// Function to predict goals scored and conceded for a team with exponential smoothing\nasync function predictGoalsWithExponentialSmoothing(\n teamGoalsFor,\n teamGoalsAgainst,\n alpha\n) {\n const lambdaFor = await calculateWeightedAverage(teamGoalsFor, alpha);\n const lambdaAgainst = await calculateWeightedAverage(teamGoalsAgainst, alpha);\n\n // You can fine-tune these values based on your model and data\n const predictedGoalsFor = lambdaFor;\n const predictedGoalsAgainst = lambdaAgainst;\n\n return {\n goalsFor: predictedGoalsFor,\n goalsAgainst: predictedGoalsAgainst,\n };\n}\n\nasync function calculateDifference(num1, num2) {\n return num1 >= num2 ? num1 - num2 : -(num2 - num1);\n}\n\nexport async function comparison(metricOne, metricTwo) {\n let stat1 = parseFloat(metricOne);\n let stat2 = parseFloat(metricTwo);\n let statDiff;\n\n statDiff = await calculateDifference(stat1, stat2);\n\n return parseFloat(statDiff);\n}\n\nexport async function compareStat(statOne, statTwo) {\n let stat1 = parseFloat(statOne);\n let stat2 = parseFloat(statTwo);\n let statDiff;\n // console.log( await normalizeValues(12, 2, 0, 1))\n // console.log(await diff(1.8571428571428571, 1.14285714285714285))\n\n if (stat1 === 0) {\n stat1 = stat1 + 1;\n stat2 = stat2 + 1;\n }\n if (stat2 === 0) {\n stat2 = stat2 + 1;\n stat2 = stat2 + 1;\n }\n\n const { normalizedValue1, normalizedValue2 } = await normalizeValues(\n stat1,\n stat2,\n 0,\n 1\n );\n\n const finalValue1 = normalizedValue1;\n const finalValue2 = normalizedValue2;\n\n statDiff = await diff(finalValue1, finalValue2);\n\n // if (statDiff > 0.3 || statDiff < -0.3) {\n // // console.log(statDiff)\n // } else {\n // statDiff = 0;\n // }\n return statDiff;\n}\n\nexport async function getClinicalRating(form) {\n let rating;\n let score;\n switch (true) {\n case form.dangerousAttackConversion <= 15:\n rating = \"excellent\";\n score = 0.8;\n break;\n\n case form.dangerousAttackConversion > 15 &&\n form.dangerousAttackConversion <= 20:\n rating = \"great\";\n score = 0.9;\n break;\n\n case form.dangerousAttackConversion > 20 &&\n form.dangerousAttackConversion <= 25:\n rating = \"very good\";\n score = 0.95;\n break;\n\n case form.dangerousAttackConversion > 25 &&\n form.dangerousAttackConversion <= 32.5:\n rating = \"good\";\n score = 0.98;\n break;\n\n case form.dangerousAttackConversion > 30 &&\n form.dangerousAttackConversion <= 35:\n rating = \"above average\";\n score = 0.99;\n break;\n\n case form.dangerousAttackConversion > 35 &&\n form.dangerousAttackConversion <= 40:\n rating = \"average\";\n score = 1;\n break;\n\n case form.dangerousAttackConversion > 40 &&\n form.dangerousAttackConversion <= 45:\n rating = \"below average\";\n score = 1.01;\n break;\n\n case form.dangerousAttackConversion > 45 &&\n form.dangerousAttackConversion <= 50:\n rating = \"poor\";\n score = 1.05;\n break;\n\n case form.dangerousAttackConversion > 50 &&\n form.dangerousAttackConversion <= 55:\n rating = \"very poor\";\n score = 1.1;\n break;\n\n case form.dangerousAttackConversion > 55 &&\n form.dangerousAttackConversion <= 60:\n rating = \"terrible\";\n score = 1.2;\n break;\n\n case form.dangerousAttackConversion > 60:\n rating = \"awful\";\n score = 1.3;\n break;\n\n default:\n break;\n }\n\n return [rating, score];\n}\n\nexport async function getPointsDifferential(pointsHomeAvg, pointsAwayAvg) {\n const differential = await diff(pointsHomeAvg, pointsAwayAvg);\n return parseFloat(differential);\n}\n\nexport async function getPointWeighting(pointsDiff) {\n let pointsDiffWeightingHome;\n let pointsDiffWeightingAway;\n\n switch (true) {\n case pointsDiff >= 2.5:\n pointsDiffWeightingHome = 0.3;\n pointsDiffWeightingAway = -0.3;\n break;\n case pointsDiff >= 2 && pointsDiff < 2.5:\n pointsDiffWeightingHome = 0.2;\n pointsDiffWeightingAway = -0.2;\n break;\n case pointsDiff >= 1.5 && pointsDiff < 2:\n pointsDiffWeightingHome = 0.15;\n pointsDiffWeightingAway = -0.15;\n break;\n case pointsDiff >= 1 && pointsDiff < 1.5:\n pointsDiffWeightingHome = 0.1;\n pointsDiffWeightingAway = -0.1;\n break;\n case pointsDiff >= 0.5 && pointsDiff < 1:\n pointsDiffWeightingHome = 0.05;\n pointsDiffWeightingAway = -0.05;\n break;\n case pointsDiff > -0.5 && pointsDiff < 0.5:\n pointsDiffWeightingHome = 0;\n pointsDiffWeightingAway = 0;\n break;\n case pointsDiff <= -0.5 && pointsDiff > -1:\n pointsDiffWeightingHome = -0.05;\n pointsDiffWeightingAway = 0.05;\n break;\n case pointsDiff <= -1 && pointsDiff > -1.5:\n pointsDiffWeightingHome = -0.1;\n pointsDiffWeightingAway = 0.1;\n break;\n case pointsDiff <= -1.5 && pointsDiff > -2:\n pointsDiffWeightingHome = -0.15;\n pointsDiffWeightingAway = 0.15;\n break;\n case pointsDiff <= -2 && pointsDiff > -2.5:\n pointsDiffWeightingHome = -0.2;\n pointsDiffWeightingAway = 0.2;\n break;\n case pointsDiff <= -2.5:\n pointsDiffWeightingHome = -0.3;\n pointsDiffWeightingAway = 0.3;\n break;\n default:\n pointsDiffWeightingHome = 0;\n pointsDiffWeightingAway = 0;\n }\n return [pointsDiffWeightingHome, pointsDiffWeightingAway];\n}\n\nexport async function compareFormTrend(recentForm, distantForm) {\n let score;\n let scoreTotal = 0;\n\n for (let index = 0; index < recentForm.length; index++) {\n const recent = recentForm[index];\n const distant = distantForm[index];\n\n if (recent > distant) {\n score = 1.05;\n } else if (recent === distant) {\n score = 1;\n } else if (recent < distant) {\n score = 0.95;\n }\n scoreTotal = scoreTotal + score / recentForm.length;\n }\n\n return scoreTotal;\n}\n\nexport async function getPointAverage(pointTotal, games) {\n return pointTotal / games;\n}\n\nasync function poissonDistribution(lambda, k) {\n const numerator = Math.exp(-lambda) * Math.pow(lambda, k);\n const denominator = factorial(k);\n return numerator / denominator;\n}\n\nfunction factorial(n) {\n if (n === 0 || n === 1) {\n return 1;\n }\n let result = 1;\n for (let i = 2; i <= n; i++) {\n result *= i;\n }\n return result;\n}\n\nasync function calculateAverageGoals(goalsFor) {\n const totalGoals = goalsFor.reduce((sum, goals) => sum + goals, 0);\n return totalGoals / goalsFor.length;\n}\n\nasync function adjustGoalsAvg(goalsAvg, strengthRatio) {\n return goalsAvg * strengthRatio;\n}\n\nasync function predictScore(\n goalsForTeam1,\n goalsAgainstTeam1,\n goalsForTeam2,\n goalsAgainstTeam2,\n team1Metrics,\n team2Metrics,\n game\n) {\n let team1AverageGoalsFor = await calculateAverageGoals(goalsForTeam1);\n let team1AverageGoalsAgainst = await calculateAverageGoals(goalsAgainstTeam1);\n let team2AverageGoalsFor = await calculateAverageGoals(goalsForTeam2);\n let team2AverageGoalsAgainst = await calculateAverageGoals(goalsAgainstTeam2);\n\n let team1StrengthRatio = 1;\n let team2StrengthRatio = 1;\n\n let adjustedTeam1AverageGoals = await adjustGoalsAvg(\n team1AverageGoalsFor,\n team1StrengthRatio\n );\n let adjustedTeam2AverageGoals = await adjustGoalsAvg(\n team2AverageGoalsFor,\n team2StrengthRatio\n );\n\n let adjustedTeam1AverageGoalsAgainst = await adjustGoalsAvg(\n team1AverageGoalsAgainst,\n team2StrengthRatio\n );\n let adjustedTeam2AverageGoalsAgainst = await adjustGoalsAvg(\n team2AverageGoalsAgainst,\n team1StrengthRatio\n );\n\n let maxGoals = 5; // Set the maximum number of goals to predict\n\n const scores = [];\n\n for (let i = 0; i <= maxGoals; i++) {\n for (let j = 0; j <= maxGoals; j++) {\n let team1GoalExpectation =\n (adjustedTeam1AverageGoals + adjustedTeam2AverageGoalsAgainst) / 2;\n // (adjustedTeam2AverageGoalsAgainst / adjustedTeam1AverageGoalsAgainst);\n let team2GoalExpectation =\n (adjustedTeam2AverageGoals + adjustedTeam1AverageGoalsAgainst) / 2;\n // (adjustedTeam1AverageGoalsAgainst / adjustedTeam2AverageGoalsAgainst);\n\n if (!isFinite(team1GoalExpectation)) {\n team1GoalExpectation = 0;\n }\n\n if (!isFinite(team2GoalExpectation)) {\n team2GoalExpectation = 0;\n }\n\n const probability =\n (await poissonDistribution(team1GoalExpectation, i)) *\n (await poissonDistribution(team2GoalExpectation, j));\n scores.push({\n team1Score: i,\n team2Score: j,\n probability,\n });\n }\n }\n\n scores.sort((a, b) => b.probability - a.probability); // Sort scores in descending order by probability\n const top5Scores = scores.slice(0, 5); // Get the top 5 scores\n\n // for (const score of top5Scores) {\n // console.log(\n // `Team 1: ${score.team1Score} - Team 2: ${score.team2Score} (${(\n // score.probability * 100\n // ).toFixed(2)}%)`\n // );\n // }\n return top5Scores;\n}\n\nasync function normalizeValues(value1, value2, minRange, maxRange) {\n if (\n typeof value1 !== \"number\" ||\n typeof value2 !== \"number\" ||\n typeof minRange !== \"number\" ||\n typeof maxRange !== \"number\"\n ) {\n throw new Error(\"All arguments must be numbers.\");\n }\n\n // Calculate the absolute values of the inputs\n\n const absValue1 = Math.abs(value1);\n const absValue2 = Math.abs(value2);\n\n // Calculate the total sum of the absolute values\n const totalAbs = absValue1 + absValue2;\n\n // Calculate the normalized values based on the ratio of absolute values\n const normalizedAbsValue1 =\n (absValue1 / totalAbs) * (maxRange - minRange) + minRange;\n const normalizedAbsValue2 =\n (absValue2 / totalAbs) * (maxRange - minRange) + minRange;\n\n // Adjust the signs of the normalized values based on the original values\n const normalizedValue1 =\n value1 >= 0 ? normalizedAbsValue1 : -normalizedAbsValue1;\n const normalizedValue2 =\n value2 >= 0 ? normalizedAbsValue2 : -normalizedAbsValue2;\n\n return { normalizedValue1, normalizedValue2 };\n}\n\nexport async function generateGoals(homeForm, awayForm, match) {\n let homeGoals = 0;\n let awayGoals = 0;\n\n const homeAttackVsAwayDefenceComparison = await comparison(\n homeForm.attackingStrength,\n awayForm.defensiveStrengthScoreGeneration\n );\n const awayAttackVsHomeDefenceComparison = await comparison(\n awayForm.attackingStrength,\n homeForm.defensiveStrengthScoreGeneration\n );\n\n const homeOverallVsAwayOverallComparison = await comparison(\n homeForm.attackingStrength + homeForm.defensiveStrength,\n awayForm.attackingStrength + awayForm.defensiveStrength\n );\n\n const awayOverallVsHomeOverallComparison = await comparison(\n awayForm.attackingStrength + awayForm.defensiveStrength,\n homeForm.attackingStrength + homeForm.defensiveStrength\n );\n\n const homeAttackVsAwayDefenceComparisonLast5 = await comparison(\n homeForm.attackingStrengthLast5,\n awayForm.defensiveStrengthScoreGenerationLast5\n );\n const awayAttackVsHomeDefenceComparisonLast5 = await comparison(\n awayForm.attackingStrengthLast5,\n homeForm.defensiveStrengthScoreGenerationLast5\n );\n\n const homeAttackVsAwayDefenceComparisonHomeOnly = await comparison(\n homeForm.attackingStrengthHomeOnly,\n awayForm.defensiveStrengthScoreGenerationAwayOnly\n );\n const awayAttackVsHomeDefenceComparisonAwayOnly = await comparison(\n awayForm.attackingStrengthAwayOnly,\n homeForm.defensiveStrengthScoreGenerationHomeOnly\n );\n\n const pointsComparisonHome = await comparison(\n homeForm.avPoints6,\n awayForm.avPoints6\n );\n\n const pointsComparisonAway = await comparison(\n awayForm.avPoints6,\n homeForm.avPoints6\n );\n\n homeGoals =\n 1 +\n homeAttackVsAwayDefenceComparison * 1.75 +\n // (homeGoals + homeOverallVsAwayOverallComparison) * 0.25 +\n homeAttackVsAwayDefenceComparisonLast5 * 1.75 +\n homeAttackVsAwayDefenceComparisonHomeOnly * 1;\n // pointsComparisonHome * 0.1;\n awayGoals =\n 1 +\n awayAttackVsHomeDefenceComparison * 1.75 +\n // (awayGoals + awayOverallVsHomeOverallComparison) * 0.25 +\n awayAttackVsHomeDefenceComparisonLast5 * 1.75 +\n awayAttackVsHomeDefenceComparisonAwayOnly * 1;\n // pointsComparisonAway * 0.1;\n\n // if (homeForm.actualToXGDifference > 25) {\n // homeGoals = homeGoals + homeForm.actualToXGDifference / 50;\n // } else if (homeForm.actualToXGDifference < -25) {\n // homeGoals = homeGoals + homeForm.actualToXGDifference / 50;\n // }\n\n // if (awayForm.actualToXGDifference > 25) {\n // awayGoals = awayGoals + awayForm.actualToXGDifference / 50;\n // } else if (awayForm.actualToXGDifference < -25) {\n // awayGoals = awayGoals + awayForm.actualToXGDifference / 50;\n // }\n\n if (\n homeForm.lastGame === \"L\" ||\n homeForm.last2Points < 2 ||\n awayForm.last2Points >= 5 ||\n match.XGdifferentialValueRaw < 0\n ) {\n awayGoals = awayGoals + 0.3;\n } else if (\n awayForm.lastGame === \"L\" ||\n awayForm.last2Points < 2 ||\n homeForm.last2Points >= 5 ||\n match.XGdifferentialValueRaw > 0\n ) {\n homeGoals = homeGoals + 0.3;\n }\n\n // if(homeForm.last5Points > homeForm.last10Points){\n // homeGoals = homeGoals + 0.1;\n // awayGoals = awayGoals - 0.1;\n\n // } else if (awayForm.last5Points > awayForm.last10Points){\n // awayGoals = awayGoals + 0.1;\n // homeGoals = homeGoals - 0.1;\n // }\n\n // Cumalative ROI for all 2193 match outcomes: + 4.18%\n\n if (homeGoals < 0 && awayGoals < 0) {\n if (homeGoals < awayGoals) {\n homeGoals = homeGoals + awayGoals / 5;\n awayGoals = awayGoals - homeGoals / 5;\n } else if (homeGoals > awayGoals) {\n homeGoals = homeGoals - awayGoals / 5;\n awayGoals = awayGoals + homeGoals / 5;\n }\n }\n\n return [homeGoals, awayGoals];\n}\n\nexport async function compareTeams(homeForm, awayForm, match) {\n // let homeAttackStrength = homeForm.attackingStrength;\n // let homeDefenceStrength = homeForm.defensiveStrength;\n // let homePossessionStrength = homeForm.possessionStrength;\n // let awayAttackStrength = awayForm.attackingStrength;\n // let awayDefenceStrength = awayForm.defensiveStrength;\n // let awayPossessionStrength = awayForm.possessionStrength;\n // let homeAttackStrengthLast5 = homeForm.attackingStrengthLast5;\n // let homeDefenceStrengthLast5 = homeForm.defensiveStrengthLast5;\n // let homePossessionStrengthLast5 = homeForm.possessionStrengthLast5;\n // let awayAttackStrengthLast5 = awayForm.attackingStrengthLast5;\n // let awayDefenceStrengthLast5 = awayForm.defensiveStrengthLast5;\n // let awayPossessionStrengthLast5 = awayForm.possessionStrengthLast5;\n // let homeAttackStrengthHome = homeForm.attackingStrengthHomeOnly;\n // let homeDefenceStrengthHome = homeForm.defensiveStrengthHomeOnly;\n // let homePossessionStrengthHome = homeForm.possessionStrengthHomeOnly;\n // let awayAttackStrengthAway = awayForm.attackingStrengthAwayOnly;\n // let awayDefenceStrengthAway = awayForm.defensiveStrengthAwayOnly;\n // let awayPossessionStrengthAway = awayForm.possessionStrengthAwayOnly;\n // const attackStrengthComparison = await compareStat(\n // homeAttackStrength,\n // awayAttackStrength\n // );\n // const attackStrengthHAComparison = await compareStat(\n // homeAttackStrengthHome,\n // awayAttackStrengthAway\n // );\n // const defenceStrengthComparison = await compareStat(\n // homeDefenceStrength,\n // awayDefenceStrength\n // );\n // const defenceStrengthHAComparison = await compareStat(\n // homeDefenceStrengthHome,\n // awayDefenceStrengthAway\n // );\n // const attackStrengthComparisonLast5 = await compareStat(\n // homeAttackStrengthLast5,\n // awayAttackStrengthLast5\n // );\n // const defenceStrengthComparisonLast5 = await compareStat(\n // homeDefenceStrengthLast5,\n // awayDefenceStrengthLast5\n // );\n // const possessiontrengthComparison = await compareStat(\n // homePossessionStrength,\n // awayPossessionStrength\n // );\n // const possessiontrengthComparisonLast5 = await compareStat(\n // homePossessionStrengthLast5,\n // awayPossessionStrengthLast5\n // );\n // const possessionHAStrengthComparison = await compareStat(\n // homePossessionStrengthHome,\n // awayPossessionStrengthAway\n // );\n // // const xgActualComparison = await compareStat(\n // // homeForm.actualToXGDifference,\n // // awayForm.actualToXGDifference\n // // );\n // // const XGComparison = await compareStat(\n // // homeForm.XGDiffNonAverage,\n // // awayForm.XGDiffNonAverage\n // // );\n // // const XGComparisonLast5 = await compareStat(\n // // homeForm.XGDiffNonAverageLast5,\n // // awayForm.XGDiffNonAverageLast5\n // // )\n // const homeAwayPointAverageComparison = await compareStat(\n // homeForm.homeOrAwayAverage,\n // awayForm.homeOrAwayAverage\n // );\n // // const fiveGameComparison = await compareStat(\n // // homeForm.last5Points,\n // // awayForm.last5Points\n // // );\n // // const last5GDComparison = await compareStat(\n // // homeForm.last5GoalDiff,\n // // awayForm.last5GoalDiff\n // // )\n // let oddsComparison = await compareStat(match.awayOdds, match.homeOdds);\n // // const homeAdvantage = await compareStat(\n // // parseFloat(homeForm.homeAttackAdvantage) / 2,\n // // 1\n // // );\n // // const dangerousAttacksWithConverstionComparison = await compareStat(\n // // homeForm.AverageDangerousAttacksOverall *\n // // homeForm.dangerousAttackConversion,\n // // awayForm.AverageDangerousAttacksOverall * awayForm.dangerousAttackConversion\n // // );\n // match.goalDiffHomeOrAwayComparison =\n // parseFloat(homeForm.goalDifferenceHomeOrAway) -\n // parseFloat(awayForm.goalDifferenceHomeOrAway);\n // match.goalDifferenceComparison =\n // parseFloat(homeForm.goalDifference) - parseFloat(awayForm.goalDifference);\n // const goalDiffHomeOrAwayComparison = await compareStat(\n // homeForm.goalDifferenceHomeOrAway,\n // awayForm.goalDifferenceHomeOrAway\n // );\n // const overallDirectnessComparison = await compareStat(\n // homeForm.directnessOverallStrength,\n // awayForm.directnessOverallStrength\n // );\n // // const hOrADirectnessComparison = await compareStat(\n // // homeForm.directnessHomeOnly,\n // // awayForm.directnessAwayOnly\n // // );\n // const accuracyComparison = await compareStat(\n // homeForm.accuracyOverallStrength,\n // awayForm.accuracyOverallStrength\n // );\n // const accuracyComparisonLast5 = await compareStat(\n // homeForm.accuracyOverallStrengthLast5,\n // awayForm.accuracyOverallStrengthLast5\n // );\n // // console.log(match.game)\n // // console.log(attackStrengthComparison);\n // // console.log(defenceStrengthComparison);\n // // console.log(possessiontrengthComparison);\n // // console.log(attackStrengthComparisonLast5);\n // // console.log(defenceStrengthComparisonLast5);\n // // console.log(attackStrengthHAComparison);\n // // console.log(defenceStrengthHAComparison);\n // // console.log(homeAwayPointAverageComparison);\n // // console.log(goalDiffHomeOrAwayComparison);\n // // // console.log(oddsComparison);\n // // console.log(overallDirectnessComparison);\n // // console.log(accuracyComparisonLast5);\n // // console.log(accuracyComparison);\n // // let calculation =\n // // attackStrengthComparison * 0 +\n // // attackStrengthComparisonLast5 * 0 +\n // // attackStrengthHAComparison * 1 +\n // // defenceStrengthComparison * 0 +\n // // defenceStrengthComparisonLast5 * 0 +\n // // defenceStrengthHAComparison * 1 +\n // // possessiontrengthComparison * 0 +\n // // possessionHAStrengthComparison * 0 +\n // // possessiontrengthComparisonLast5 * 1 +\n // // // xgToActualDiffComparison * 1 +\n // // // xgForStrengthRecentComparison * 1 +\n // // // xgAgainstStrengthRecentComparison * 1 +\n // // homeAwayPointAverageComparison * 5 +\n // // goalDiffHomeOrAwayComparison * 0 +\n // // // xgActualComparison * 0 +\n // // // xgForComparison * 1 +\n // // // xgAgainstComparison * 1 +\n // // // XGComparison * 0 +\n // // oddsComparison * 2 +\n // // // dangerousAttacksWithConverstionComparison * 0.05 +\n // // overallDirectnessComparison * 0 +\n // // // hOrADirectnessComparison * 0 +\n // // accuracyComparisonLast5 * 0 +\n // // accuracyComparison * 0;\n // // // console.log(match.game)\n // // // console.log(calculation)\n // let calculation =\n // attackStrengthComparisonLast5 * 2 +\n // attackStrengthHAComparison * 1 +\n // defenceStrengthComparisonLast5 * 2 +\n // defenceStrengthHAComparison * 1 +\n // possessionHAStrengthComparison * 1 +\n // possessiontrengthComparisonLast5 * 1 +\n // possessiontrengthComparison * 1 +\n // // xgToActualDiffComparison * 1 +\n // // xgForStrengthRecentComparison * 1 +\n // // xgAgainstStrengthRecentComparison * 1 +\n // homeAwayPointAverageComparison * 2 +\n // goalDiffHomeOrAwayComparison * 0 +\n // // xgActualComparison * 1 +\n // // xgForComparison * 1 +\n // // xgAgainstComparison * 1 +\n // oddsComparison * 0 +\n // // dangerousAttacksWithConverstionComparison * 0.05 +\n // overallDirectnessComparison * 0 +\n // accuracyComparison * 1;\n // let homeWinOutcomeProbability =\n // match.homeTeamWinPercentage + match.awayTeamLossPercentage;\n // let awayWinOutcomeProbability =\n // match.homeTeamLossPercentage + match.awayTeamWinPercentage;\n // let drawOutcomeProbability =\n // match.homeTeamDrawPercentage + match.awayTeamDrawPercentage;\n // if (\n // drawOutcomeProbability > homeWinOutcomeProbability &&\n // drawOutcomeProbability > awayWinOutcomeProbability\n // ) {\n // switch (true) {\n // case drawOutcomeProbability > 100:\n // calculation = calculation / 3;\n // break;\n // default:\n // calculation = calculation * 1;\n // break;\n // }\n // } else {\n // calculation = calculation * 1;\n // }\n // if (calculation > 0) {\n // if (\n // homeForm.lastGame === \"L\" ||\n // homeForm.last2Points < 2 ||\n // awayForm.last2Points >= 5 ||\n // match.XGdifferentialValueRaw < 0\n // ) {\n // calculation = calculation / 2;\n // }\n // } else if (calculation < 0) {\n // if (\n // awayForm.lastGame === \"L\" ||\n // awayForm.last2Points < 2 ||\n // homeForm.last2Points >= 5 ||\n // match.XGdifferentialValueRaw > 0\n // ) {\n // calculation = calculation / 2;\n // }\n // }\n // // if (homeForm.averageOddsHome !== null || awayForm.averageOddsAway !== null) {\n // // if (\n // // calculation > 0 &&\n // // homeForm.averageOddsHome < match.homeOdds &&\n // // awayForm.averageOddsAway > match.awayOdds\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // calculation > 0 &&\n // // homeForm.averageOddsHome > match.homeOdds &&\n // // awayForm.averageOddsAway < match.awayOdds\n // // ) {\n // // calculation = calculation * 1.25;\n // // } else {\n // // calculation = calculation * 1;\n // // }\n // // if (\n // // calculation < 0 &&\n // // awayForm.averageOddsAway < match.awayOdds &&\n // // homeForm.averageOddsHome > match.homeOdds\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // calculation < 0 &&\n // // awayForm.averageOddsAway > match.awayOdds &&\n // // homeForm.averageOddsHome < match.homeOdds\n // // ) {\n // // calculation = calculation * 1.25;\n // // } else {\n // // calculation = calculation * 1;\n // // }\n // // }\n // if (\n // calculation > 0 &&\n // homeForm.improving === true &&\n // awayForm.improving === false\n // ) {\n // console.log(homeForm);\n // calculation = calculation * 1.5;\n // } else if (\n // calculation < 0 &&\n // awayForm.improving === true &&\n // awayForm.improving === false\n // ) {\n // calculation = calculation * 1.5;\n // } else if (\n // calculation > 0 &&\n // homeForm.improving === false &&\n // awayForm.improving === true\n // ) {\n // calculation = calculation / 2;\n // } else if (\n // calculation < 0 &&\n // awayForm.improving === false &&\n // homeForm.improving === true\n // ) {\n // calculation = calculation / 2;\n // }\n // // if (\n // // (calculation < 0 && homeForm.oddsReliabilityWin < 50) ||\n // // (calculation < 0 && awayForm.oddsReliabilityWinAsUnderdog > 45)\n // // ) {\n // // calculation = calculation / 2;\n // // } else if (\n // // (calculation > 0 && awayForm.oddsReliabilityWin < 50) ||\n // // (calculation > 0 && homeForm.oddsReliabilityWinAsUnderdog > 45)\n // // ) {\n // // calculation = calculation / 2;\n // // }\n // // if (calculation < 0 && homeForm.predictabilityScore < 0.3) {\n // // calculation = calculation / 2;\n // // } else if (calculation > 0 && awayForm.predictabilityScore < 0.3) {\n // // calculation = calculation / 2;\n // // }\n // return calculation;\n}\n\nexport async function roundCustom(num, form, otherForm) {\n let wholeNumber = Math.floor(num);\n let remainder = num - wholeNumber;\n let goals;\n\n switch (true) {\n case remainder >= 0.9:\n switch (true) {\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.8 && remainder < 0.9:\n switch (true) {\n case form.actualToXGDifference >= 0:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 0:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.6 && remainder < 0.8:\n switch (true) {\n case form.actualToXGDifference >= 10:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 10:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n case remainder >= 0.5 && remainder < 0.6:\n switch (true) {\n case form.actualToXGDifference >= 20:\n goals = Math.ceil(num);\n break;\n case form.actualToXGDifference < 20:\n goals = Math.floor(num);\n break;\n default:\n goals = Math.round(num);\n break;\n }\n break;\n default:\n goals = Math.floor(num);\n break;\n }\n\n return goals;\n\n // if (remainder > 0.5) {\n // return Math.ceil(num);\n // } else {\n // return Math.floor(num);\n // }\n}\n\n//Calculates scores based on prior XG figures, weighted by odds\nlet i = 0;\n\nexport async function calculateScore(match, index, divider, calculate) {\n i++;\n\n let teams;\n\n if (\n calculate === true &&\n allForm.find(\n (game) =>\n game.home.teamName === match.homeTeam &&\n game.away.teamName === match.awayTeam\n )\n ) {\n teams = [\n allForm.find((game) => game.home.teamName === match.homeTeam).home,\n allForm.find((game) => game.away.teamName === match.awayTeam).away,\n ];\n } else {\n calculate = false;\n }\n\n let formHome;\n let formAway;\n\n if (calculate) {\n for (let i = 0; i < teams.length; i++) {\n if (teams[0][index].PlayedHome <= 1 || teams[1][index].PlayedAway <= 1) {\n index = 2;\n divider = 10;\n }\n\n teams[i][index].lastGame = teams[i][index].LastFiveForm[4];\n teams[i][index].previousToLastGame = teams[i][index].LastFiveForm[3];\n\n let last2 = [\n teams[i][index].lastGame,\n teams[i][index].previousToLastGame,\n ];\n\n teams[i][index].last2Points = getPointsFromLastX(last2);\n\n teams[i][index].twoGameAverage = await getPointAverage(\n teams[i][index].last2Points,\n 2\n );\n teams[i][index].threeGameAverage = await getPointAverage(\n teams[i][index].last3Points,\n 3\n );\n teams[i][index].fiveGameAverage = await getPointAverage(\n teams[i][index].last5Points,\n 5\n );\n teams[i][index].sixGameAverage = await getPointAverage(\n teams[i][index].last6Points,\n 6\n );\n teams[i][index].tenGameAverage = await getPointAverage(\n teams[i][index].last10Points,\n 10\n );\n\n if (teams[i][index].formRun) {\n teams[i][index].lastHomeOrAwayPoints = getPointsFromLastX(\n teams[i][index].formRun\n );\n\n teams[i][index].homeOrAwayAverage = await getPointAverage(\n teams[i][index].lastHomeOrAwayPoints,\n teams[i][index].formRun.length\n );\n }\n\n teams[i][0].ScoredAverage = teams[i][0].ScoredOverall / 5;\n teams[i][1].ScoredAverage = teams[i][1].ScoredOverall / 6;\n teams[i][2].ScoredAverage = teams[i][2].ScoredOverall / 10;\n\n teams[i][0].ConcededAverage = teams[i][0].ConcededOverall / 5;\n teams[i][1].ConcededAverage = teams[i][1].ConcededOverall / 6;\n teams[i][2].ConcededAverage = teams[i][2].ConcededOverall / 10;\n\n if (teams[i][1].ScoredAverage === 0) {\n teams[i][1].ScoredAverage = teams[i][index].ScoredOverall / 10;\n teams[i][1].ScoredOverall = teams[i][2].ScoredOverall / 2;\n }\n\n if (teams[i][1].ConcededAverage === 0) {\n teams[i][1].ConcededAverage = teams[i][index].ConcededOverall / 10;\n teams[i][1].ConcededOverall = teams[i][2].ConcededOverall / 2;\n }\n\n teams[i][index].ScoredAverageShortTerm = teams[i][0].ScoredOverall / 5;\n teams[i][index].ConcededAverageShortTerm =\n teams[i][0].ConcededOverall / 5;\n\n teams[i][index].longTermAverageGoals = teams[i][2].ScoredOverall / 10;\n teams[i][index].longTermAverageConceeded =\n teams[i][2].ConcededOverall / 10;\n\n let recentGoalDiff =\n teams[i][index].ScoredAverageShortTerm -\n teams[i][index].ConcededAverageShortTerm;\n let distantGoalDiff =\n teams[i][index].longTermAverageGoals -\n teams[i][index].longTermAverageConceeded;\n\n let recentDA = teams[i][0].AverageDangerousAttacksOverall;\n let distantDA = teams[i][2].AverageDangerousAttacksOverall;\n\n let recentPosession = teams[i][0].AveragePossessionOverall;\n let distantPosession = teams[i][2].AveragePossessionOverall;\n\n let recentCleanSheet = teams[i][0].CleanSheetPercentage;\n let distantCleanSheet = teams[i][2].CleanSheetPercentage;\n\n let recentFormArray = [\n recentGoalDiff,\n recentDA,\n recentPosession,\n recentCleanSheet,\n ];\n let distantFormArray = [\n distantGoalDiff,\n distantDA,\n distantPosession,\n distantCleanSheet,\n ];\n\n teams[i][index].formTrendScore = await compareFormTrend(\n recentFormArray,\n distantFormArray\n );\n\n teams[i][index].expectedGoals = parseFloat(teams[i][index].XG);\n\n teams[i][index].ScoredAverageShortAndLongTerm =\n (teams[i][index].ScoredOverall / 10 +\n teams[i][index].ScoredAverageShortTerm) /\n 2;\n\n teams[i][index].conceededAverageShortAndLongTerm =\n (teams[i][index].ConcededOverall / 10 +\n teams[i][index].ConcededAverageShortTerm) /\n 2;\n\n teams[i][index].longTermGoalDifference =\n teams[i][2].ScoredAverage - teams[i][2].ConcededAverage;\n\n teams[i][index].shortTermGoalDifference =\n teams[i][0].ScoredAverage - teams[i][0].ConcededAverage;\n\n teams[i][index].XGdifferential = await diff(\n teams[i][index].XGOverall,\n teams[i][index].XGAgainstAvgOverall\n );\n\n teams[i][index].XGdifferentialRecent = await diff(\n teams[i][0].XGOverall,\n teams[i][0].XGAgainstAvgOverall\n );\n\n teams[i][index].actualToXGDifferenceRecent = await diff(\n teams[i][index].shortTermGoalDifference,\n teams[i][index].XGdifferentialRecent\n );\n }\n\n homeOdds = match.homeOdds;\n awayOdds = match.awayOdds;\n\n formHome = teams[0][index];\n formAway = teams[1][index];\n\n // if (\n // (formHome.XGOverall - formHome.XGAgainstAvgOverall) < (formHome.last5XG - formHome.XGAgainstlast5)\n // ) {\n // formHome.improving = true;\n // } else {\n // formHome.improving = false;\n // }\n\n // if (\n // (formAway.XGOverall - formAway.XGAgainstAvgOverall) < (formAway.last5XG - formAway.XGAgainstlast5)\n // ) {\n // formAway.improving = true;\n // } else {\n // formAway.improving = false;\n // }\n\n let homeTenGameAvg = formHome.last10Points / 10;\n let awayTenGameAvg = formAway.last10Points / 10;\n\n let homeTwoGameAvg = formHome.last2Points / 2;\n let awayTwoGameAvg = formAway.last2Points / 2;\n\n let pointsDiff10 = await getPointsDifferential(\n homeTenGameAvg,\n awayTenGameAvg\n );\n\n let pointsDiff2 = await getPointsDifferential(\n homeTwoGameAvg,\n awayTwoGameAvg\n );\n\n let [last10WeightingHome, last10WeightingAway] = await getPointWeighting(\n pointsDiff10\n );\n\n let [last2WeightingHome, last2WeightingAway] = await getPointWeighting(\n pointsDiff2\n );\n\n formHome.dangerousAttackConversion =\n (formHome.ScoredAverageShortAndLongTerm /\n formHome.AverageDangerousAttacksOverall) *\n 100;\n formAway.dangerousAttackConversion =\n (formAway.ScoredAverageShortAndLongTerm /\n formAway.AverageDangerousAttacksOverall) *\n 100;\n\n [formHome.clinicalRating, formHome.clinicalScore] = await getClinicalRating(\n formHome\n );\n [formAway.clinicalRating, formAway.clinicalScore] = await getClinicalRating(\n formAway\n );\n\n let XGdifferential = await diff(\n formHome.XGdifferential,\n formAway.XGdifferential\n );\n\n formHome.teamName = match.homeTeam;\n formAway.teamName = match.awayTeam;\n\n match.XGdifferentialValue = Math.abs(XGdifferential);\n match.XGdifferentialValueRaw = parseFloat(XGdifferential);\n if (\n allLeagueResultsArrayOfObjects[match.leagueIndex].fixtures.length > 10 &&\n match.leagueID !== 7956\n ) {\n [\n formHome.predictedGoalsBasedOnHomeAv,\n formHome.predictedGoalsBasedOnAwayAv,\n formHome.allTeamGoalsBasedOnAverages,\n formHome.predictedGoalsConceededBasedOnHomeAv,\n formHome.predictedGoalsConceededBasedOnAwayAv,\n formHome.allTeamGoalsConceededBasedOnAverages,\n formHome.averageOddsHome,\n formHome.averageOddsAway,\n formHome.averageScoredLeague,\n formHome.averageConceededLeague,\n formHome.last10btts,\n formHome.last10bttsHome,\n formHome.last10bttsAway,\n match.bttsAllPercentageHome,\n match.bttsPercentageHomeHome,\n match.bttsPercentageHomeAway,\n formHome.forAndAgainstRollingAvHomeOrAway,\n formHome.forAndAgainstRollingAv,\n ] = await getPastLeagueResults(match.homeTeam, match, \"home\", formHome);\n\n [\n formAway.predictedGoalsBasedOnHomeAv,\n formAway.predictedGoalsBasedOnAwayAv,\n formAway.allTeamGoalsBasedOnAverages,\n formAway.predictedGoalsConceededBasedOnHomeAv,\n formAway.predictedGoalsConceededBasedOnAwayAv,\n formAway.allTeamGoalsConceededBasedOnAverages,\n formAway.averageOddsHome,\n formAway.averageOddsAway,\n formAway.averageScoredLeague,\n formAway.averageConceededLeague,\n formAway.last10btts,\n formAway.last10bttsHome,\n formAway.last10bttsAway,\n match.bttsAllPercentageAway,\n match.bttsPercentageAwayHome,\n match.bttsPercentageAwayAway,\n formAway.forAndAgainstRollingAvHomeOrAway,\n formAway.forAndAgainstRollingAv,\n ] = await getPastLeagueResults(match.awayTeam, match, \"away\", formAway);\n } else {\n formHome.predictedGoalsBasedOnHomeAv = formHome.ScoredAverage;\n formHome.predictedGoalsBasedOnAwayAv = formHome.ConcededAverage;\n formHome.allTeamGoalsBasedOnAverages = formHome.ScoredAverage;\n formHome.forAndAgainstRollingAv = {\n goalsFor: formHome.ScoredAverage,\n goalsAgainst: formHome.ConcededAverage,\n };\n formHome.forAndAgainstRollingAvHomeOrAway = {\n goalsFor: formHome.ScoredAverage,\n goalsAgainst: formHome.ConcededAverage,\n };\n formHome.predictedGoalsConceededBasedOnHomeAv = formHome.ConcededAverage;\n formHome.predictedGoalsConceededBasedOnAwayAv = formHome.ConcededAverage;\n formHome.allTeamGoalsConceededBasedOnAverages = formHome.ConcededAverage;\n formHome.averageOddsHome = null;\n formHome.averageOddsAway = null;\n formHome.averageScoredLeague = null;\n formHome.averageConceededLeague = null;\n formHome.goalDifference =\n formHome.ScoredOverall - formHome.ConcededOverall;\n formHome.goalDifferenceHomeOrAway =\n formHome.ScoredOverall - formHome.ConcededOverall;\n formHome.last10btts = null;\n formHome.last10bttsHome = null;\n formHome.last10bttsAway = null;\n formHome.allTeamResults = [];\n match.bttsAllPercentageHome = \"\";\n match.bttsPercentageHomeHome = \"\";\n match.bttsPercentageHomeAway = \"\";\n formAway.predictedGoalsBasedOnHomeAv = formAway.ScoredAverage;\n formAway.predictedGoalsBasedOnAwayAv = formAway.ConcededAverage;\n formAway.allTeamGoalsBasedOnAverages = formAway.ScoredAverage;\n formAway.forAndAgainstRollingAv = {\n goalsFor: formAway.ScoredAverage,\n goalsAgainst: formAway.ConcededAverage,\n };\n formAway.forAndAgainstRollingAvHomeOrAway = {\n goalsFor: formAway.ScoredAverage,\n goalsAgainst: formAway.ConcededAverage,\n };\n formAway.predictedGoalsConceededBasedOnHomeAv = formAway.ConcededAverage;\n formAway.predictedGoalsConceededBasedOnAwayAv = formAway.ConcededAverage;\n formAway.allTeamGoalsConceededBasedOnAverages = formAway.ConcededAverage;\n formAway.averageOddsHome = null;\n formAway.averageOddsAway = null;\n formAway.averageScoredLeague = null;\n formAway.averageConceededLeague = null;\n formAway.goalDifference =\n formAway.ScoredOverall - formAway.ConcededOverall;\n formAway.goalDifferenceHomeOrAway =\n formAway.ScoredOverall - formAway.ConcededOverall;\n\n formAway.last10btts = null;\n formAway.last10bttsHome = null;\n formAway.last10bttsAway = null;\n formAway.allTeamResults = [];\n match.bttsAllPercentageAway = \"\";\n match.bttsPercentageAwayHome = \"\";\n match.bttsPercentageAwayAway = \"\";\n }\n\n if (\n typeof formHome.homeTeamHomePositionRaw === \"number\" &&\n typeof formAway.awayTeamAwayPositionRaw === \"number\"\n ) {\n formHome.homePositionHomeOnly = parseFloat(\n formHome.homeTeamHomePositionRaw\n );\n formAway.awayPositionAwayOnly = parseFloat(\n formAway.awayTeamAwayPositionRaw\n );\n formHome.homePosition = parseFloat(formHome.homeRawPosition);\n formAway.awayPosition = parseFloat(formAway.awayRawPosition);\n } else {\n formHome.homePositionHomeOnly = \"N/A\";\n formAway.awayPositionAwayOnly = \"N/A\";\n formHome.homePosition = \"N/A\";\n formAway.awayPosition = \"N/A\";\n }\n\n if (formHome.last10Goals && formAway.last10Goals !== 0) {\n if (\n formHome.last5Goals - formHome.last5GoalsConceeded >\n formHome.last10Goals - formHome.last10GoalsConceeded\n ) {\n formHome.improving = true;\n } else {\n formHome.improving = false;\n }\n\n if (\n formAway.last5Goals - formAway.last5GoalsConceeded >\n formAway.last10Goals - formAway.last10GoalsConceeded\n ) {\n formAway.improving = true;\n } else {\n formAway.improving = false;\n }\n }\n\n formHome.AttackingPotency = (formHome.XG / formHome.AttacksHome) * 100;\n formAway.AttackingPotency = (formAway.XG / formAway.AttacksAverage) * 100;\n\n let teamComparisonScore;\n\n const attackingMetricsHome = {\n \"Average Dangerous Attacks\": formHome.AverageDangerousAttacksOverall,\n \"Average Shots\": formHome.AverageShots,\n \"Average Shots On Target\": formHome.AverageShotsOnTargetOverall,\n \"Average Expected Goals\": formHome.XGOverall,\n \"Recent XG\": formHome.XGlast5 ? formHome.XGlast5 : formHome.XGOverall,\n \"Average Goals\": formHome.avgScored,\n Corners: formHome.AverageCorners,\n };\n\n const attackingMetricsHomeLast5 = {\n \"Average Dangerous Attacks\": formHome.avDALast5,\n \"Average Shots\": formHome.avShotsLast5,\n \"Average Shots On Target\": formHome.avSOTLast5,\n \"Average Expected Goals\": formHome.XGlast5,\n \"Recent XG\": formHome.XGlast5,\n \"Average Goals\": formHome.avScoredLast5,\n Corners: formHome.avCornersLast5,\n };\n\n const attackingMetricsHomeOnly = {\n \"Average Dangerous Attacks\": formHome.avgDangerousAttacksHome,\n \"Average Shots\": formHome.avgShotsHome,\n \"Average Shots On Target\": formHome.avgShotsOnTargetHome,\n \"Average Expected Goals\": formHome.avgXGScoredHome,\n \"Recent XG\": formHome.last5XGAvgForHome,\n \"Average Goals\": formHome.avgScoredHome,\n Corners: formHome.cornersAvHome,\n };\n\n const attackingMetricsAwayOnly = {\n \"Average Dangerous Attacks\": formAway.avgDangerousAttacksAway,\n \"Average Shots\": formAway.avgShotsAway,\n \"Average Shots On Target\": formAway.avgShotsOnTargetAway,\n \"Average Expected Goals\": formAway.avgXGScoredAway,\n \"Recent XG\": formAway.last5XGAvgForAway,\n \"Average Goals\": formAway.avgScoredAway,\n Corners: formAway.cornersAvAway,\n };\n\n const attackingMetricsAway = {\n \"Average Dangerous Attacks\": formAway.AverageDangerousAttacksOverall,\n \"Average Shots\": formAway.AverageShots,\n \"Average Shots On Target\": formAway.AverageShotsOnTargetOverall,\n \"Average Expected Goals\": formAway.XGOverall,\n \"Recent XG\": formAway.XGlast5,\n \"Average Goals\": formAway.avgScored,\n Corners: formAway.AverageCorners,\n };\n\n const attackingMetricsAwayLast5 = {\n \"Average Dangerous Attacks\": formAway.avDALast5,\n \"Average Shots\": formAway.avShotsLast5,\n \"Average Shots On Target\": formAway.avSOTLast5,\n \"Average Expected Goals\": formAway.XGlast5,\n \"Recent XG\": formAway.XGlast5,\n \"Average Goals\": formAway.avScoredLast5,\n Corners: formAway.avCornersLast5,\n };\n\n const defensiveMetricsHome = {\n \"Average XG Against\": formHome.XGAgainstAvgOverall,\n \"Recent XG Against\": formHome.XGAgainstlast5\n ? formHome.XGAgainstlast5\n : formHome.XGAgainstAvgOverall,\n \"Average Goals Against\": formHome.avgConceeded,\n \"Average SOT Against\": formHome.AverageShotsOnTargetAgainstOverall,\n };\n\n const defensiveMetricsHomeLast5 = {\n \"Average XG Against\": formHome.XGAgainstlast5,\n \"Recent XG Against\": formHome.avXGAgainstLast5,\n \"Average Goals Against\": formHome.avConceededLast5,\n \"Average SOT Against\": formHome.avSOTAgainstLast5,\n };\n\n const defensiveMetricsAway = {\n \"Average XG Against\": formAway.XGAgainstAvgOverall,\n \"Recent XG Against\": formAway.XGAgainstlast5\n ? formAway.XGAgainstlast5\n : formAway.XGAgainstAvgOverall,\n \"Average Goals Against\": formAway.avgConceeded,\n \"Average SOT Against\": formAway.AverageShotsOnTargetAgainstOverall,\n };\n\n const defensiveMetricsAwayLast5 = {\n \"Average XG Against\": formAway.avXGAgainstLast5,\n \"Recent XG Against\": formAway.XGAgainstlast5,\n \"Average Goals Against\": formAway.avConceededLast5,\n \"Average SOT Against\": formAway.avSOTAgainstLast5,\n };\n\n const defensiveMetricsHomeOnly = {\n \"Average XG Against\": formHome.avgXGConceededHome,\n \"Recent XG Against\": formHome.last5XGAvgAgainstHome,\n \"Average Goals Against\": formHome.teamConceededAvgHomeOnly,\n \"Average SOT Against\": formHome.avgShotsOnTargetAgainstHome,\n };\n\n const defensiveMetricsAwayOnly = {\n \"Average XG Against\": formAway.avgXGConceededAway,\n \"Recent XG Against\": formAway.last5XGAvgAgainstAway,\n \"Average Goals Against\": formAway.teamConceededAvgAwayOnly,\n \"Average SOT Against\": formAway.avgShotsOnTargetAgainstAway,\n };\n\n formHome.attackingMetrics = attackingMetricsHome;\n formHome.defensiveMetrics = defensiveMetricsHome;\n formAway.attackingMetrics = attackingMetricsAway;\n formAway.defensiveMetrics = defensiveMetricsAway;\n\n formHome.attackingStrength = await calculateAttackingStrength(\n attackingMetricsHome\n );\n\n formHome.attackingStrengthScoreGeneration =\n await calculateAttackingStrength(attackingMetricsHome);\n\n formHome.attackingStrengthLast5 = await calculateAttackingStrength(\n attackingMetricsHomeLast5\n );\n\n formHome.attackingStrengthHomeOnly = await calculateAttackingStrength(\n attackingMetricsHomeOnly\n );\n\n formAway.attackingStrength = await calculateAttackingStrength(\n attackingMetricsAway\n );\n\n formAway.attackingStrengthLast5 = await calculateAttackingStrength(\n attackingMetricsAwayLast5\n );\n\n formAway.attackingStrengthAwayOnly = await calculateAttackingStrength(\n attackingMetricsAwayOnly\n );\n\n formHome.defensiveStrength = await calculateDefensiveStrength(\n defensiveMetricsHome\n );\n\n formHome.defensiveStrengthScoreGeneration =\n await calculateDefensiveStrength(defensiveMetricsHome, 1);\n\n formHome.defensiveStrengthLast5 = await calculateDefensiveStrength(\n defensiveMetricsHomeLast5\n );\n\n formHome.defensiveStrengthScoreGenerationLast5 =\n await calculateDefensiveStrength(defensiveMetricsHomeLast5, 1);\n\n formHome.defensiveStrengthHomeOnly = await calculateDefensiveStrength(\n defensiveMetricsHomeOnly\n );\n\n formHome.defensiveStrengthScoreGenerationHomeOnly =\n await calculateDefensiveStrength(defensiveMetricsHomeOnly, 1);\n\n formAway.defensiveStrength = await calculateDefensiveStrength(\n defensiveMetricsAway\n );\n\n formAway.defensiveStrengthScoreGeneration =\n await calculateDefensiveStrength(defensiveMetricsAway, 1);\n\n formAway.defensiveStrengthLast5 = await calculateDefensiveStrength(\n defensiveMetricsAwayLast5\n );\n\n formAway.defensiveStrengthScoreGenerationLast5 =\n await calculateDefensiveStrength(defensiveMetricsAwayLast5, 1);\n\n formAway.defensiveStrengthAwayOnly = await calculateDefensiveStrength(\n defensiveMetricsAwayOnly\n );\n\n formAway.defensiveStrengthScoreGenerationAwayOnly =\n await calculateDefensiveStrength(defensiveMetricsAwayOnly, 1);\n\n formHome.possessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n formHome.AveragePossessionOverall\n );\n\n formHome.possessionStrengthLast5 = await calculateMetricStrength(\n \"averagePossession\",\n formHome.avPosessionLast5\n );\n\n formAway.possessionStrengthLast5 = await calculateMetricStrength(\n \"averagePossession\",\n formAway.avPosessionLast5\n );\n\n formHome.possessionStrengthHomeOnly = await calculateMetricStrength(\n \"averagePossession\",\n formHome.avgPossessionHome\n );\n\n formHome.directnessOverall =\n (formHome.AverageShots / formHome.AveragePossessionOverall) * 10;\n\n formHome.directnessOverallLast5 =\n (formHome.avShotsLast5 / formHome.avPosessionLast5) * 10;\n\n formAway.directnessOverallLast5 =\n (formAway.avShotsLast5 / formAway.avPosessionLast5) * 10;\n\n formHome.directnessHomeOnly =\n (formHome.avgShotsHome / formHome.avgPossessionHome) * 10;\n\n formAway.directnessOverall =\n (formAway.AverageShots / formAway.AveragePossessionOverall) * 10;\n\n formAway.directnessAwayOnly =\n (formAway.avgShotsAway / formAway.avgPossessionAway) * 10;\n\n formHome.directnessOverallStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessOverall\n );\n\n formHome.directnessOverallStrengthLast5 = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessOverallLast5\n );\n\n formHome.directnessHomeStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formHome.directnessHomeOnly\n );\n\n formAway.directnessOverallStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessOverall\n );\n\n formAway.directnessOverallStrengthLast5 = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessOverallLast5\n );\n\n formAway.directnessAwayStrength = await calculateMetricStrength(\n \"directnessOverall\",\n formAway.directnessAwayOnly\n );\n\n formHome.shootingAccuracy =\n (formHome.AverageShotsOnTargetOverall / formHome.avgShots) *\n formHome.AverageShotsOnTargetOverall;\n\n formHome.shootingAccuracyLast5 =\n (formHome.avSOTLast5 / formHome.avShotsLast5) * formHome.avSOTLast5;\n\n formAway.shootingAccuracyLast5 =\n (formAway.avSOTLast5 / formAway.avShotsLast5) * formAway.avSOTLast5;\n\n formHome.shootingAccuracyHomeOnly =\n (formHome.avgShotsOnTargetHome / formHome.avgShotsHome) *\n formHome.avgShotsOnTargetHome;\n\n formAway.shootingAccuracy =\n (formAway.AverageShotsOnTargetOverall / formAway.avgShots) *\n formAway.AverageShotsOnTargetOverall;\n\n formAway.shootingAccuracyAwayOnly =\n (formAway.avgShotsOnTargetAway / formAway.avgShotsAway) *\n formAway.avgShotsOnTargetAway;\n\n formHome.accuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracy\n );\n\n formHome.accuracyOverallStrengthLast5 = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracyLast5\n );\n\n formHome.accuracyHomeStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formHome.shootingAccuracyHomeOnly\n );\n\n formAway.accuracyOverallStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracy\n );\n\n formAway.accuracyOverallStrengthLast5 = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracyLast5\n );\n\n formAway.accuracyAwayStrength = await calculateMetricStrength(\n \"accuracyOverall\",\n formAway.shootingAccuracyAwayOnly\n );\n\n formHome.xgForStrength = await calculateMetricStrength(\n \"xgFor\",\n formHome.XGOverall\n );\n\n formHome.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formHome.XGlast5\n );\n\n formHome.xgForStrengthHomeOnly = await calculateMetricStrength(\n \"xgFor\",\n formHome.avgXGScoredHome\n );\n\n formHome.xgAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.XGAgainstAvgOverall\n );\n\n formHome.xgAgainstStrengthLast5 = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.XGAgainstlast5\n );\n\n formHome.xgAgainstStrengthHomeOnly = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formHome.avgXGConceededHome\n );\n\n formAway.possessionStrength = await calculateMetricStrength(\n \"averagePossession\",\n formAway.AveragePossessionOverall\n );\n\n formAway.possessionStrengthAwayOnly = await calculateMetricStrength(\n \"averagePossession\",\n formAway.avgPossessionAway\n );\n\n formAway.xgForStrength = await calculateMetricStrength(\n \"xgFor\",\n formAway.XGOverall\n );\n\n formAway.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formAway.last5XGAvgFor\n );\n\n formAway.xgForStrengthLast5 = await calculateMetricStrength(\n \"xgFor\",\n formAway.XGlast5\n );\n\n formAway.xgForStrengthAwayOnly = await calculateMetricStrength(\n \"xgFor\",\n formAway.avgXGScoredAway\n );\n\n formAway.xgAgainstStrength = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.XGAgainstAvgOverall\n );\n\n formAway.xgAgainstStrengthLast5 = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.XGAgainstlast5\n );\n\n formAway.xgAgainstStrengthAwayOnly = await calculateMetricStrength(\n \"xgAgainst\",\n 3 - formAway.avgXGConceededAway\n );\n\n formHome.actualToXGDifference = parseInt(\n await diff(formHome.XGDiffNonAverage, formHome.goalDifference)\n );\n\n formAway.actualToXGDifference = parseInt(\n await diff(formAway.XGDiffNonAverage, formAway.goalDifference)\n );\n\n // teamComparisonScore = await compareTeams(formHome, formAway, match);\n\n [formHome.teamGoalsCalc, formAway.teamGoalsCalc] = await generateGoals(\n formHome,\n formAway,\n match\n );\n\n console.log(formHome.teamGoalsCalc);\n console.log(formAway.teamGoalsCalc);\n\n // teamComparisonScore = teamComparisonScore * 0.3;\n // LEAVE\n\n // if (teamComparisonScore > 0.45) {\n // teamComparisonScore = 0.45;\n // } else if (teamComparisonScore < -0.45) {\n // teamComparisonScore = -0.45;\n // }\n\n // if (teamComparisonScore < 0) {\n // formHome.teamStrengthWeighting = 1 + teamComparisonScore / 1;\n // formAway.teamStrengthWeighting = 1 - teamComparisonScore / 1;\n // } else if (teamComparisonScore >= 0) {\n // formHome.teamStrengthWeighting = 1 + teamComparisonScore / 1;\n // formAway.teamStrengthWeighting = 1 - teamComparisonScore / 1;\n // }\n\n // teamComparisonScore = 0;\n\n // match.teamComparisonScore = teamComparisonScore.toFixed(2);\n // match.goalWeighting = 1 + parseFloat(match.teamComparisonScore)\n\n let team1Metrics = {\n weighting: formHome.teamGoalsCalc,\n // Add other relevant metrics here\n };\n\n let team2Metrics = {\n weighting: formAway.teamGoalsCalc,\n // Add other relevant metrics here\n };\n\n // pass arrays of league goals and conceeded\n let scorePredictions;\n let scorePredictionsHA;\n let scorePredictionsRecent;\n\n if (\n formHome.allConceededArrayHome !== undefined &&\n formAway.allConceededArrayAway !== undefined\n ) {\n scorePredictionsRecent = await predictScore(\n formHome.allGoalsArrayHomeRecent,\n formHome.allConceededArrayHomeRecent,\n formAway.allGoalsArrayAwayRecent,\n formAway.allConceededArrayAwayRecent,\n team1Metrics,\n team2Metrics,\n match.game\n );\n scorePredictionsHA = await predictScore(\n formHome.allGoalsArrayHomeOnly,\n formHome.allConceededArrayHomeOnly,\n formAway.allGoalsArrayAwayOnly,\n formAway.allConceededArrayAwayOnly,\n team1Metrics,\n team2Metrics,\n match.game\n );\n scorePredictions = await predictScore(\n formHome.allGoalsArrayHome,\n formHome.allConceededArrayHome,\n formAway.allGoalsArrayAway,\n formAway.allConceededArrayAway,\n team1Metrics,\n team2Metrics,\n match.game\n );\n }\n\n let finalHomeGoals;\n let finalAwayGoals;\n\n const homeGoalDiff =\n formHome.ScoredAverageShortAndLongTerm -\n formHome.conceededAverageShortAndLongTerm;\n const awayGoalDiff =\n formAway.ScoredAverageShortAndLongTerm -\n formAway.conceededAverageShortAndLongTerm;\n\n formHome.goalsDifferential =\n parseFloat(await diff(homeGoalDiff, awayGoalDiff)) / 1;\n formAway.goalsDifferential =\n parseFloat(await diff(awayGoalDiff, homeGoalDiff)) / 1;\n\n formHome.rollingAverageGoalsDifferential = parseFloat(\n formHome.allTeamGoalsBasedOnAverages -\n formHome.allTeamGoalsConceededBasedOnAverages\n );\n formAway.rollingAverageGoalsDifferential = parseFloat(\n formAway.allTeamGoalsBasedOnAverages -\n formAway.allTeamGoalsConceededBasedOnAverages\n );\n\n match.GoalsInGamesAverageHome =\n formHome.avScoredLast5 + formHome.avConceededLast5;\n\n match.GoalsInGamesAverageAway =\n formAway.avScoredLast5 + formAway.avConceededLast5;\n\n let factorOneHome;\n let factorOneAway;\n\n factorOneHome =\n // homeLeagueOrAllFormAverageGoals * 1 +\n // formHome.last5Goals * 0.5 +\n // formAway.last5GoalsConceeded * 0.5 +\n (formHome.forAndAgainstRollingAvHomeOrAway.goalsFor * 1 +\n formAway.forAndAgainstRollingAvHomeOrAway.goalsAgainst * 1 +\n formHome.forAndAgainstRollingAv.goalsFor * 1 +\n formAway.forAndAgainstRollingAv.goalsAgainst * 1 +\n formHome.allTeamGoalsBasedOnAverages * 0 +\n formAway.allTeamGoalsConceededBasedOnAverages * 0 +\n formHome.XGOverall * 1 +\n formAway.XGAgainstAvgOverall * 1 +\n last10WeightingHome * 0 +\n last2WeightingHome * 0) /\n 6;\n\n factorOneAway =\n // awayLeagueOrAllFormAverageGoals * 1 +\n // formAway.last5Goals * 0.5 +\n // formHome.last5GoalsConceeded * 0.5 +\n (formAway.forAndAgainstRollingAvHomeOrAway.goalsFor * 1 +\n formHome.forAndAgainstRollingAvHomeOrAway.goalsAgainst * 1 +\n formAway.forAndAgainstRollingAv.goalsFor * 1 +\n formHome.forAndAgainstRollingAv.goalsAgainst * 1 +\n formAway.allTeamGoalsBasedOnAverages * 0 +\n formHome.allTeamGoalsConceededBasedOnAverages * 0 +\n formAway.XGOverall * 1 +\n formHome.XGAgainstAvgOverall * 1 +\n last10WeightingAway * 0 +\n last2WeightingAway * 0) /\n 6;\n\n let factorTwoHome;\n let factorTwoAway;\n\n if (\n scorePredictions !== undefined &&\n scorePredictions[0].probability !== 1\n ) {\n factorTwoHome =\n (scorePredictions[0].team1Score +\n scorePredictionsRecent[0].team1Score +\n scorePredictionsHA[0].team1Score * 0.5) /\n 2.5;\n factorTwoAway =\n (scorePredictions[0].team2Score +\n scorePredictionsRecent[0].team2Score +\n scorePredictionsHA[0].team2Score * 0.5) /\n 2.5;\n } else {\n factorTwoHome = factorOneHome;\n factorTwoAway = factorOneAway;\n }\n\n let homeComparisonWeighting;\n let awayComparisonWeighting;\n match.scoreDiff = await diff(factorOneHome, factorOneAway);\n\n if (teamComparisonScore > 0) {\n homeComparisonWeighting = 1 + Math.abs(teamComparisonScore);\n awayComparisonWeighting = 1 + -Math.abs(teamComparisonScore);\n } else if (teamComparisonScore < 0) {\n homeComparisonWeighting = 1 + -Math.abs(teamComparisonScore);\n awayComparisonWeighting = 1 + Math.abs(teamComparisonScore);\n } else {\n homeComparisonWeighting = 1;\n awayComparisonWeighting = 1;\n }\n\n console.log(match.game);\n console.log(match.simlarGameResultsHome);\n console.log(match.simlarGameResultsAway);\n\n // let experimentalHomeGoals = factorOneHome + formHome.teamGoalsCalc;\n let experimentalHomeGoals = factorTwoHome + formHome.teamGoalsCalc;\n\n // (factorOneHome * homeComparisonWeighting +\n // (formHome.teamGoalsCalc * 2) +\n // factorTwoHome) /\n // 4;\n // (formHome.forAndAgainstRollingAvHomeOrAway.goalsFor + formAway.forAndAgainstRollingAvHomeOrAway.goalsAgainst) / 2\n\n // let experimentalAwayGoals = factorOneAway + formAway.teamGoalsCalc;\n let experimentalAwayGoals = factorTwoAway + formAway.teamGoalsCalc;\n\n // (factorOneAway * awayComparisonWeighting +\n // (formAway.teamGoalsCalc * 2) +\n // factorTwoAway) /\n // 4;\n // (formAway.forAndAgainstRollingAvHomeOrAway.goalsFor + formHome.forAndAgainstRollingAvHomeOrAway.goalsAgainst) / 2\n\n let rawFinalHomeGoals = experimentalHomeGoals;\n let rawFinalAwayGoals = experimentalAwayGoals;\n\n // if(rawFinalHomeGoals < 0){\n // rawFinalHomeGoals = 0\n // }\n\n // if(rawFinalAwayGoals < 0){\n // rawFinalAwayGoals = 0\n // }\n\n match.rawFinalHomeGoals = rawFinalHomeGoals;\n match.rawFinalAwayGoals = rawFinalAwayGoals;\n\n // if (rawFinalHomeGoals < 1 && rawFinalHomeGoals > 0 && rawFinalAwayGoals < 1 && rawFinalAwayGoals > 0) {\n // if (\n // formHome.CleanSheetPercentage < 45 &&\n // formAway.CleanSheetPercentage < 45\n // ) {\n // finalHomeGoals = Math.ceil(rawFinalHomeGoals);\n // finalAwayGoals = Math.ceil(rawFinalAwayGoals);\n // } else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n // }\n // else if (rawFinalHomeGoals < 0 && rawFinalAwayGoals < 0) {\n // if (\n // formHome.CleanSheetPercentage < 45 &&\n // formAway.CleanSheetPercentage < 45\n // ) {\n // finalHomeGoals = 1;\n // finalAwayGoals = 1;\n // } else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n // }\n // else {\n // finalHomeGoals = Math.floor(rawFinalHomeGoals);\n // finalAwayGoals = Math.floor(rawFinalAwayGoals);\n // }\n\n if (rawFinalHomeGoals < 0) {\n rawFinalHomeGoals = 0;\n }\n\n if (rawFinalAwayGoals < 0) {\n rawFinalAwayGoals = 0;\n }\n\n finalHomeGoals = Math.floor(rawFinalHomeGoals);\n finalAwayGoals = Math.floor(rawFinalAwayGoals);\n\n // if (finalHomeGoals > formHome.avgScored + 2) {\n // finalHomeGoals = Math.round((finalHomeGoals + formHome.avgScored) / 2);\n // }\n\n // if (finalAwayGoals > formAway.avgScored + 2) {\n // finalAwayGoals = Math.round((finalAwayGoals + formAway.avgScored) / 2);\n // }\n\n // if (finalAwayGoals < 0) {\n // let difference = Math.abs(\n // parseFloat((await diff(0, finalAwayGoals)) / 2)\n // );\n // rawFinalHomeGoals = rawFinalHomeGoals + difference;\n // finalAwayGoals = 0;\n // }\n\n // if (finalHomeGoals < 0) {\n // let difference = Math.abs(\n // parseFloat((await diff(0, finalHomeGoals)) / 2)\n // );\n // rawFinalAwayGoals = rawFinalAwayGoals + difference;\n // finalHomeGoals = 0;\n // }\n\n console.log(match.omit);\n\n if (match.status !== \"suspended\") {\n if (finalHomeGoals > finalAwayGoals) {\n match.prediction = \"homeWin\";\n homePredictions = homePredictions + 1;\n if (\n formHome.lastGame === \"L\" ||\n formHome.last2Points < 3 ||\n formAway.last2Points > 4 ||\n formHome.oddsReliabilityWin < 50\n ) {\n match.includeInMultis = false;\n } else {\n match.includeInMultis = true;\n }\n } else if (finalAwayGoals > finalHomeGoals) {\n match.prediction = \"awayWin\";\n awayPredictions = awayPredictions + 1;\n if (\n formAway.lastGame === \"L\" ||\n formAway.last2Points < 3 ||\n formHome.last2Points > 4 ||\n formAway.oddsReliabilityWin < 50\n ) {\n match.includeInMultis = false;\n } else {\n match.includeInMultis = true;\n }\n } else if (finalHomeGoals === finalAwayGoals) {\n match.prediction = \"draw\";\n drawPredictions = drawPredictions + 1;\n }\n }\n\n console.log(match.game);\n console.log(finalHomeGoals);\n console.log(finalAwayGoals);\n console.log(match.prediction);\n console.log(match.outcome);\n\n console.log(`drawPredictions: ${drawPredictions}`);\n\n if (\n (XGdifferential > 1 && match.prediction === \"homeWin\") ||\n (XGdifferential < -1.6 && match.prediction === \"awayWin\")\n ) {\n match.XGdifferential = true;\n } else {\n match.XGdifferential = false;\n }\n\n if (\n (pointsDiff10 > 1.2 && match.prediction === \"homeWin\") ||\n (pointsDiff10 < -1.2 && match.prediction === \"awayWin\")\n ) {\n match.pointsDifferential = true;\n match.pointsDifferentialValue = Math.abs(pointsDiff10);\n match.pointsDifferentialValueRaw = parseFloat(pointsDiff10);\n } else {\n match.pointsDiff10 = false;\n match.pointsDifferentialValue = Math.abs(pointsDiff10);\n match.pointsDifferentialValueRaw = parseFloat(pointsDiff10);\n }\n\n let rollingGoalDiffDifferential = await diff(\n formHome.rollingAverageGoalsDifferential,\n formAway.rollingAverageGoalsDifferential\n );\n\n if (\n (rollingGoalDiffDifferential > 1.5 && match.prediction === \"homeWin\") ||\n (rollingGoalDiffDifferential < -1.5 && match.prediction === \"awayWin\")\n ) {\n match.rollingGoalDiff = true;\n match.rollingGoalDiffValue = rollingGoalDiffDifferential;\n } else {\n match.rollingGoalDiff = false;\n match.rollingGoalDiffValue = rollingGoalDiffDifferential;\n }\n\n let dangerousAttacksDifferential = await diff(\n formHome.AverageDangerousAttacksOverall,\n formAway.AverageDangerousAttacksOverall\n );\n\n if (\n (dangerousAttacksDifferential > 20 && match.prediction === \"homeWin\") ||\n (dangerousAttacksDifferential < -20 && match.prediction === \"awayWin\")\n ) {\n match.dangerousAttacksDiff = true;\n match.dangerousAttacksDiffValue = dangerousAttacksDifferential;\n } else {\n match.dangerousAttacksDiff = false;\n match.dangerousAttacksDiffValue = dangerousAttacksDifferential;\n }\n\n switch (true) {\n case match.status !== \"complete\":\n break;\n case match.homeGoals > match.awayGoals:\n match.winner = match.homeTeam;\n match.outcome = \"homeWin\";\n homeOutcomes = homeOutcomes + 1;\n allWinOutcomes = allWinOutcomes + 1;\n allLossOutcomes = allLossOutcomes + 1;\n sumStatDAWin = sumStatDAWin += formHome.AverageDangerousAttacksOverall;\n sumStatDALoss = sumStatDALoss +=\n formAway.AverageDangerousAttacksOverall;\n sumStatPossessionWin = sumStatPossessionWin +=\n formHome.AveragePossessionOverall;\n sumStatPossessionLoss = sumStatPossessionLoss +=\n formAway.AveragePossessionOverall;\n sumStatPPGLast10Win = sumStatPPGLast10Win += formHome.last10Points / 10;\n sumStatPPGLast10Loss = sumStatPPGLast10Loss +=\n formAway.last10Points / 10;\n sumStatSOTWin = sumStatSOTWin += formHome.AverageShotsOnTargetOverall;\n sumStatSOTLoss = sumStatSOTLoss += formAway.AverageShotsOnTargetOverall;\n sumOddsWin = sumOddsWin += homeOdds;\n sumOddsLoss = sumOddsLoss += awayOdds;\n sumXGForWin = sumXGForWin += formHome.XGOverall;\n sumXGForLoss = sumXGForLoss += formAway.XGOverall;\n sumXGAgainstWin = sumXGAgainstWin += formHome.XGAgainstAvgOverall;\n sumXGAgainstLoss = sumXGAgainstLoss += formAway.XGAgainstAvgOverall;\n break;\n case match.homeGoals === match.awayGoals:\n match.winner = \"draw\";\n match.outcome = \"draw\";\n allOutcomes = allOutcomes + 1;\n allDrawOutcomes = allDrawOutcomes + 1;\n break;\n case match.homeGoals < match.awayGoals:\n match.winner = match.awayTeam;\n match.outcome = \"awayWin\";\n allOutcomes = allOutcomes + 1;\n awayOutcomes = awayOutcomes + 1;\n allWinOutcomes = allWinOutcomes + 1;\n allLossOutcomes = allLossOutcomes + 1;\n sumStatDAWin = sumStatDAWin += formAway.AverageDangerousAttacksOverall;\n sumStatDALoss = sumStatDALoss +=\n formHome.AverageDangerousAttacksOverall;\n sumStatPossessionWin = sumStatPossessionWin +=\n formAway.AveragePossessionOverall;\n sumStatPossessionLoss = sumStatPossessionLoss +=\n formHome.AveragePossessionOverall;\n sumStatPPGLast10Win = sumStatPPGLast10Win += formAway.last10Points / 10;\n sumStatPPGLast10Loss = sumStatPPGLast10Loss +=\n formHome.last10Points / 10;\n sumStatSOTWin = sumStatSOTWin += formAway.AverageShotsOnTargetOverall;\n sumStatSOTLoss = sumStatSOTLoss += formHome.AverageShotsOnTargetOverall;\n sumOddsWin = sumOddsWin += awayOdds;\n sumOddsLoss = sumOddsLoss += homeOdds;\n sumXGForWin = sumXGForWin += formAway.XGOverall;\n sumXGForLoss = sumXGForLoss += formHome.XGOverall;\n sumXGAgainstWin = sumXGAgainstWin += formAway.XGAgainstAvgOverall;\n sumXGAgainstLoss = sumXGAgainstLoss += formHome.XGAgainstAvgOverall;\n break;\n default:\n break;\n }\n\n console.log(`allDrawOutcomes: ${allDrawOutcomes}`);\n\n if (match.status === \"complete\") {\n if (match.prediction === match.outcome) {\n match.predictionOutcome = \"Won\";\n winAmount = winAmount + 1;\n if (match.outcome === \"draw\") {\n }\n } else if (match.prediction !== match.outcome) {\n match.predictionOutcome = \"Lost\";\n lossAmount = lossAmount + 1;\n if (match.outcome === \"draw\") {\n }\n }\n }\n\n if (match.status === \"complete\") {\n if (match.homeGoals + match.awayGoals > 2) {\n match.over25PredictionOutcome = \"Won\";\n } else {\n match.over25PredictionOutcome = \"Lost\";\n }\n }\n\n if (\n match.status === \"complete\" &&\n match.homeGoals > 0 &&\n match.awayGoals > 0\n ) {\n match.bttsOutcome = \"bttsWon\";\n } else {\n match.bttsOutcome = \"bttsLost\";\n }\n\n match.formHome = formHome;\n match.formAway = formAway;\n\n // formObjectHome = formHome;\n // formObjectAway = formAway;\n\n // console.log(formObjectHome)\n // console.log(formObjectAway)\n\n let total = parseInt(finalHomeGoals + finalAwayGoals);\n totalGoals = totalGoals + total;\n\n let total2 = parseInt(match.homeGoals + match.awayGoals);\n totalGoals2 = totalGoals2 + total2;\n\n numberOfGames = numberOfGames + 1;\n\n if (finalHomeGoals < 0) {\n finalHomeGoals = 0;\n }\n\n if (finalAwayGoals < 0) {\n finalAwayGoals = 0;\n }\n\n if (match.status === \"suspended\") {\n finalHomeGoals = \"P\";\n finalAwayGoals = \"P\";\n }\n\n if (\n finalHomeGoals > finalAwayGoals &&\n (match.homeOdds < rangeValue[0] || match.homeOdds > rangeValue[1])\n ) {\n match.omit = true;\n } else if (\n finalAwayGoals > finalHomeGoals &&\n (match.awayOdds < rangeValue[0] || match.awayOdds > rangeValue[1])\n ) {\n match.omit = true;\n } else if (\n finalHomeGoals === finalAwayGoals &&\n (match.drawOdds < rangeValue[0] || match.drawOdds > rangeValue[1])\n ) {\n match.omit = true;\n }\n\n const last10PointDiffHomePerspective = Math.abs(\n formHome.last10Points - formAway.last10Points\n );\n\n const last10PointDiffAwayPerspective = Math.abs(\n formAway.last10Points - formHome.last10Points\n );\n\n const XGDiffBetweenTeamsHomePerspective = Math.abs(\n formHome.XGDiffNonAverage - formAway.XGDiffNonAverage\n );\n const XGDiffBetweenTeamsAwayPerspective = Math.abs(\n formAway.XGDiffNonAverage - formHome.XGDiffNonAverage\n );\n\n match.goalDiffHomeOrAwayComparison =\n parseFloat(formHome.goalDifferenceHomeOrAway) -\n parseFloat(formAway.goalDifferenceHomeOrAway);\n\n match.goalDifferenceComparison =\n parseFloat(formHome.goalDifference) - parseFloat(formAway.goalDifference);\n\n switch (true) {\n case finalHomeGoals > finalAwayGoals:\n if (minimumXG !== 0 && XGDiffBetweenTeamsHomePerspective < minimumXG) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffHomePerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n match.goalDiffHomeOrAwayComparison < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (minimumGD !== 0 && match.goalDifferenceComparison < minimumGD) {\n match.omit = true;\n }\n break;\n case finalHomeGoals < finalAwayGoals:\n if (minimumXG !== 0 && XGDiffBetweenTeamsAwayPerspective < minimumXG) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffAwayPerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n Math.abs(match.goalDiffHomeOrAwayComparison) < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (\n minimumGD !== 0 &&\n Math.abs(match.goalDifferenceComparison) < minimumGD\n ) {\n match.omit = true;\n }\n break;\n case finalHomeGoals === finalAwayGoals:\n if (\n minimumXG !== 0 &&\n Math.abs(XGDiffBetweenTeamsHomePerspective) < minimumXG\n ) {\n match.omit = true;\n }\n if (\n minimumLast10 !== 0 &&\n last10PointDiffHomePerspective < minimumLast10\n ) {\n match.omit = true;\n }\n if (\n minimumGDHorA !== 0 &&\n Math.abs(match.goalDiffHomeOrAwayComparison) < minimumGDHorA\n ) {\n match.omit = true;\n }\n if (\n minimumGD !== 0 &&\n Math.abs(match.goalDifferenceComparison) < minimumGD\n ) {\n match.omit = true;\n }\n break;\n default:\n break;\n }\n\n if (\n match.game_week < 5\n // match.omit === true\n // match.game_week < 3 &&\n ) {\n finalHomeGoals = \"-\";\n finalAwayGoals = \"-\";\n match.status = \"notEnoughData\";\n }\n\n return [\n finalHomeGoals,\n finalAwayGoals,\n rawFinalHomeGoals,\n rawFinalAwayGoals,\n ];\n } else {\n finalHomeGoals = \"\";\n finalAwayGoals = \"\";\n rawFinalHomeGoals = \"\";\n rawFinalAwayGoals = \"\";\n match.status = \"notEnoughData\";\n match.profit = 0;\n }\n\n return [finalHomeGoals, finalAwayGoals, rawFinalHomeGoals, rawFinalAwayGoals];\n}\n\nasync function getSuccessMeasure(fixtures) {\n let sumProfit = 0;\n let investment = 0;\n let exactScores = 0;\n let successCount = 0;\n let profit = 0;\n let netProfit = 0;\n\n // await fetch(`${process.env.REACT_APP_EXPRESS_SERVER}tips/${dateStamp}`, {\n // method: \"PUT\",\n // headers: {\n // Accept: \"application/json\",\n // \"Content-Type\": \"application/json\",\n // },\n // body: JSON.stringify(matches)\n // })\n\n for (let i = 0; i < fixtures.length; i++) {\n if (\n fixtures[i].status === \"complete\" &&\n fixtures[i].hasOwnProperty(\"prediction\") &&\n fixtures[i].omit !== true\n ) {\n sumProfit = sumProfit + fixtures[i].profit;\n investment = investment + 1;\n netProfit = (sumProfit - investment).toFixed(2);\n profit = parseFloat(netProfit);\n if (fixtures[i].exactScore === true) {\n exactScores = exactScores + 1;\n }\n if (fixtures[i].predictionOutcome === \"Won\") {\n successCount = successCount + 1;\n }\n }\n }\n\n totalInvestment = totalInvestment + investment;\n totalProfit = totalProfit + profit;\n let ROI = (profit / investment) * 100;\n totalROI = (totalProfit / totalInvestment) * 100;\n console.log(`Total Profit : ${totalProfit}`);\n console.log(`Total Investment : ${totalInvestment}`);\n console.log(`Total ROI : ${totalROI}`);\n var operand = ROI >= 0 ? \"+\" : \"\";\n var operandTwo = totalROI >= 0 ? \"+\" : \"\";\n let exactScoreHitRate = ((exactScores / investment) * 100).toFixed(1);\n let successRate = ((successCount / investment) * 100).toFixed(1);\n\n if (investment > 0) {\n ReactDOM.render(\n <Fragment>\n <Div\n className={\"SuccessMeasure\"}\n text={`ROI for \n all ${investment} W/D/W \n outcomes: ${operand} ${ROI.toFixed(2)}%`}\n />\n <p>{`Correct W/D/W predictions: ${successCount} (${successRate}%)`}</p>\n <p>{`Exact scores predicted: ${exactScores} (${exactScoreHitRate}%)`}</p>\n <Div\n className={\"SuccessMeasure\"}\n text={`Cumalative ROI for \n all ${totalInvestment} match outcomes: ${operandTwo} ${totalROI.toFixed(\n 2\n )}%`}\n />\n </Fragment>,\n document.getElementById(\"successMeasure2\")\n );\n } else {\n return;\n }\n}\n\nexport var tips = [];\nexport var allTips = [];\nlet allTipsSorted = [];\nvar newArray = [];\nvar bestBets = [];\nvar price;\nvar Over25Tips = [];\nvar XGDiffTips = [];\nvar rollingDiffTips = [];\nvar dangerousAttacksDiffTips = [];\nvar pointsDiffTips = [];\nvar combinations;\nvar exoticArray = [];\nvar gamesInExotic;\nvar minimumExotic;\nvar exoticStake;\nvar exoticString;\nvar bttsArray = [];\nvar accumulatedOdds = 1;\nlet predictions = [];\n\nexport async function getNewTips(array) {\n // allTips = [];\n newArray = [];\n accumulatedOdds = 1;\n\n if (array.length > 1 && incrementValue > 0) {\n array.forEach((tip) => {\n if (\n array.indexOf(tip) < incrementValue\n // tip.goalDifferential >= incrementValue && tip.comparisonScore > 0\n ) {\n newArray.push(tip);\n accumulatedOdds = parseFloat(accumulatedOdds) * parseFloat(tip.rawOdds);\n }\n });\n }\n await renderTips(newArray);\n}\n\nexport async function getScorePrediction(day, mocked) {\n let mock = mocked;\n clicked = true;\n tips = [];\n bestBets = [];\n // price = 0\n bttsArray = [];\n Over25Tips = [];\n XGDiffTips = [];\n pointsDiffTips = [];\n rollingDiffTips = [];\n dangerousAttacksDiffTips = [];\n allTips = [];\n\n let index = 2;\n let divider = 10;\n\n ReactDOM.render(<div></div>, document.getElementById(\"GeneratePredictions\"));\n\n await Promise.all(\n matches.map(async (match) => {\n // if there are no stored predictions, calculate them based on live data\n if (match) {\n switch (true) {\n case match.status === \"canceled\":\n match.goalsA = \"P\";\n match.goalsB = \"P\";\n await calculateScore(match, index, divider, false);\n break;\n case match.leagueID === 6935 ||\n match.leagueID === 7061 ||\n (match.game_week < 3 && match.game_week !== 0):\n match.goalsA = \"x\";\n match.goalsB = \"x\";\n await calculateScore(match, index, divider, false);\n break;\n default:\n [\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB,\n ] = await calculateScore(match, index, divider, true);\n break;\n }\n } else {\n [\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB,\n ] = await calculateScore(match, index, divider, true);\n }\n\n await getBTTSPotential(\n match,\n match.goalsA,\n match.goalsB,\n match.unroundedGoalsA,\n match.unroundedGoalsB\n );\n\n let predictionObject;\n let Over25PredictionObject;\n let XGPredictionObject;\n let pointsDiffObject;\n let rollingDiffObject;\n let dangerousAttacksDiffObject;\n\n if (match.status === \"complete\" && match.prediction) {\n match.outcomeSymbol =\n match.predictionOutcome === \"Won\" ? \"\\u2714\" : \"\\u2718\";\n match.over25PredictionOutcomeSymbol =\n match.over25PredictionOutcome === \"Won\" ? \"\\u2714\" : \"\\u2718\";\n match.bttsOutcomeSymbol =\n match.bttsOutcome === \"bttsWon\" ? \"\\u2714\" : \"\\u2718\";\n } else {\n match.outcomeSymbol = \"\";\n match.over25PredictionOutcomeSymbol = \"\";\n match.bttsOutcomeSymbol = \"\";\n }\n\n if (\n match.unroundedGoalsA - match.unroundedGoalsB > 0.65 &&\n match.homeOdds !== 0 &&\n match.fractionHome !== \"N/A\" &&\n match.includeInMultis !== false &&\n match.omit !== true\n ) {\n if (\n match.prediction !== \"draw\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\" &&\n match.homeOdds < 3\n ) {\n predictionObject = {\n team: `${match.homeTeam} to win`,\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n odds: match.fractionHome,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n experimentalCalc: (\n (match.unroundedGoalsA - match.unroundedGoalsB) *\n Math.abs(match.teamComparisonScore)\n ).toFixed(2),\n XGdifferentialValue: parseFloat(match.XGdifferentialValue),\n };\n if (\n predictionObject.rawOdds >= 1.25 &&\n match.formHome.clinicalRating !== \"awful\"\n ) {\n allTips.push(predictionObject);\n\n if (\n match.unroundedGoalsA - match.unroundedGoalsB >\n incrementValue\n ) {\n bestBets.push(predictionObject);\n }\n }\n }\n } else if (\n match.unroundedGoalsB - match.unroundedGoalsA > 1.75 &&\n match.awayOdds !== 0 &&\n match.fractionAway !== \"N/A\" &&\n match.includeInMultis !== false &&\n match.omit !== true\n ) {\n if (\n match.prediction !== \"draw\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\" &&\n match.awayOdds < 3.5\n ) {\n predictionObject = {\n team: `${match.awayTeam} to win`,\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n rawOdds: match.awayOdds,\n odds: match.fractionAway,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n goalDifferential:\n parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ) - 1,\n experimentalCalc: (\n (match.unroundedGoalsB - match.unroundedGoalsA) *\n Math.abs(match.teamComparisonScore)\n ).toFixed(2),\n XGdifferentialValue: parseFloat(match.XGdifferentialValue),\n };\n if (\n predictionObject.rawOdds >= 1.25 &&\n match.formAway.clinicalRating !== \"awful\"\n ) {\n allTips.push(predictionObject);\n if (match.unroundedGoalsB - match.unroundedGoalsA > 2) {\n bestBets.push(predictionObject);\n }\n }\n }\n }\n\n if (\n match.btts === true &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\" &&\n match.status !== \"notEnoughData\"\n ) {\n bttsArray.push(match);\n }\n if (\n match.unroundedGoalsA + match.unroundedGoalsB > 4 &&\n match.goalsA + match.goalsB > 2 &&\n match.GoalsInGamesAverageHome > 3 &&\n match.GoalsInGamesAverageAway > 3\n ) {\n Over25PredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: match.homeTeam,\n decimalOdds: match.homeDoubleChance,\n rawOdds: match.over25Odds,\n odds: match.over25Odds,\n comparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.over25PredictionOutcomeSymbol,\n doubleChanceOutcome: match.over25PredictionOutcome,\n goalTotalUnrounded: match.unroundedGoalsA + match.unroundedGoalsB,\n };\n Over25Tips.push(Over25PredictionObject);\n }\n\n if (\n match.XGdifferential === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n XGPredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n XGdifferentialValue: match.XGdifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n XGDiffTips.push(XGPredictionObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n XGPredictionObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n XGdifferentialValue: match.XGdifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n XGDiffTips.push(XGPredictionObject);\n }\n\n if (\n match.pointsDifferential === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n pointsDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n pointsDifferentialValue: match.pointsDifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n pointsDiffTips.push(pointsDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n pointsDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n pointsDifferentialValue: match.pointsDifferentialValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n pointsDiffTips.push(pointsDiffObject);\n }\n\n if (\n match.rollingGoalDiff === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n rollingDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n rollingDiffTips.push(rollingDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n rollingDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n rollingDiffTips.push(rollingDiffObject);\n }\n\n if (\n match.dangerousAttacksDiff === true &&\n match.prediction === \"homeWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n dangerousAttacksDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.homeTeam} to win`,\n rawOdds: match.homeOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.homeTeam} to win`,\n odds: match.fractionHome,\n otherTeam: match.awayTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsA, match.unroundedGoalsB)\n ),\n };\n dangerousAttacksDiffTips.push(dangerousAttacksDiffObject);\n } else if (\n match.XGdifferential === true &&\n match.prediction === \"awayWin\" &&\n match.status !== \"notEnoughData\" &&\n match.status !== \"suspended\" &&\n match.status !== \"canceled\"\n ) {\n dangerousAttacksDiffObject = {\n game:\n match.status === \"complete\"\n ? `${match.homeTeam} ${match.homeGoals} - ${match.awayGoals} ${match.awayTeam}`\n : match.game,\n team: `${match.awayTeam} to win`,\n rawOdds: match.awayOdds,\n comparisonScore: Math.abs(match.teamComparisonScore),\n rawComparisonScore: match.teamComparisonScore,\n outcome: match.predictionOutcome,\n outcomeSymbol: match.outcomeSymbol,\n prediction: `${match.awayTeam} to win`,\n odds: match.fractionAway,\n otherTeam: match.homeTeam,\n rollingGoalDiffValue: match.rollingGoalDiffValue,\n goalDifferential: parseFloat(\n await diff(match.unroundedGoalsB, match.unroundedGoalsA)\n ),\n };\n dangerousAttacksDiffTips.push(dangerousAttacksDiffObject);\n }\n\n predictions.push(match);\n })\n );\n ReactDOM.render(\n <RenderAllFixtures matches={matches} result={true} bool={mock} />,\n document.getElementById(\"FixtureContainer\")\n );\n await getSuccessMeasure(matches);\n await getMultis();\n await getNewTips(allTipsSorted);\n\n // await renderTips();\n}\n\nasync function getMultis() {\n allTipsSorted = allTips.sort(function (a, b) {\n return b.goalDifferential - a.goalDifferential;\n });\n\n bestBets.sort(function (a, b) {\n if (a.goalDifferential === b.goalDifferential) {\n return b.comparisonScore - a.comparisonScore;\n } else {\n return b.goalDifferential > a.goalDifferential ? 1 : -1;\n }\n });\n\n bttsArray.sort(function (a, b) {\n return b.combinedBTTS - a.combinedBTTS;\n });\n\n Over25Tips.sort(function (a, b) {\n return b.goalTotalUnrounded - a.goalTotalUnrounded;\n });\n\n XGDiffTips.sort(function (a, b) {\n return Math.abs(b.XGdifferentialValue) - Math.abs(a.XGdifferentialValue);\n });\n\n pointsDiffTips.sort(function (a, b) {\n return (\n Math.abs(b.pointsDifferentialValue) - Math.abs(a.pointsDifferentialValue)\n );\n });\n\n rollingDiffTips.sort(function (a, b) {\n return Math.abs(b.rollingGoalDiffValue) - Math.abs(a.rollingGoalDiffValue);\n });\n\n dangerousAttacksDiffTips.sort(function (a, b) {\n return (\n Math.abs(b.dangerousAttacksDiffValue) -\n Math.abs(a.dangerousAttacksDiffValue)\n );\n });\n\n exoticArray = [];\n gamesInExotic = 0;\n exoticStake = 0;\n exoticString = \"\";\n\n switch (true) {\n case allTips.length >= 10:\n for (let i = 0; i < 10; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 10;\n minimumExotic = 8;\n exoticStake = 0.1;\n exoticString = \"45 8-folds, 10 9-folds and 1 10-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 9:\n for (let i = 0; i < 9; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 9;\n minimumExotic = 7;\n exoticStake = 0.1;\n exoticString = \"36 7-folds, 9 8-folds and 1 9-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 8:\n for (let i = 0; i < 8; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 8;\n minimumExotic = 6;\n exoticStake = 0.1;\n exoticString = \"28 6-folds, 8 7-folds and 1 8-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 7:\n for (let i = 0; i < 7; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 7;\n minimumExotic = 6;\n exoticStake = 1;\n exoticString = \"7 6-folds and 1 7-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 6:\n for (let i = 0; i < 6; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 6;\n minimumExotic = 5;\n exoticStake = 1;\n exoticString = \"6 5-folds and 1 6-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case allTips.length >= 5:\n for (let i = 0; i < 5; i++) {\n let game = allTips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 5;\n minimumExotic = 4;\n exoticStake = 1;\n exoticString = \"5 4-folds and 1 5-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n case Over25Tips.length >= 4:\n for (let i = 0; i < 4; i++) {\n let game = Over25Tips[i];\n exoticArray.push(game);\n }\n gamesInExotic = 4;\n minimumExotic = 3;\n exoticStake = 1;\n exoticString = \"4 3-folds and 1 4-fold\";\n price = getCoverBetMaxReturns(exoticArray, minimumExotic, exoticStake);\n break;\n default:\n break;\n }\n}\n\nexport function getAccumulatorPrice(priceArray) {\n var result = 1;\n for (var i = 0; i < priceArray.length; i++)\n result = result * priceArray[i].rawOdds;\n\n return result;\n}\n\nexport function getCoverBetMaxReturns(priceArray, minAccSize, stake) {\n var total = 0;\n combinations = 0;\n\n for (var i = minAccSize; i <= priceArray.length; i++) {\n var perms = getUniquePermutations(priceArray, i);\n combinations = combinations + perms.length;\n\n for (var j = 0; j < perms.length; j++)\n total += getAccumulatorPrice(perms[j]) * stake;\n }\n return parseFloat(total.toFixed(2));\n}\n\nfunction getUniquePermutations(arr, permLength) {\n if (arr.length <= permLength) return [arr];\n\n var permutations = [];\n var newArr = [];\n\n newArr = arr.slice(0);\n\n for (var i = 0; i < arr.length; i++) {\n newArr = arr.slice(0);\n newArr.splice(i, 1);\n permutations = twoDimArrayUnion(\n permutations,\n getUniquePermutations(newArr, permLength)\n );\n }\n return permutations;\n}\n\nfunction twoDimArrayUnion(arr1, arr2) {\n for (var i = 0; i < arr2.length; i++) {\n var duplicate = false;\n\n for (var j = 0; j < arr1.length; j++)\n if (arr1[j].length === arr2[i].length)\n for (var k = 0; k < arr1[j].length; k++)\n if (arr1[j][k] !== arr2[i][k]) break;\n else if (k === arr1[j].length - 1) duplicate = true;\n\n if (!duplicate) arr1.push(arr2[i]);\n }\n\n return arr1;\n}\n\nfunction NewlineText(props) {\n const text = props.text;\n const newText = text.split(\"\\n\").map((str) => <p>{str}</p>);\n\n return newText;\n}\n\nasync function renderTips() {\n if (newArray.length > 0) {\n ReactDOM.render(\n <div className=\"PredictionContainer\">\n <Fragment>\n <Increment />\n <Collapsable\n buttonText={\"Build a multi\"}\n element={\n <ul className=\"BestPredictions\" id=\"BestPredictions\">\n <div className=\"BestPredictionsExplainer\">\n Add or remove a selection using the buttons below. Predictions\n are ordered by confidence in the outcome.\n </div>\n {newArray.map((tip) => (\n <li key={`${tip.game}acca`}>\n <div>\n {tip.team}: {tip.odds}{\" \"}\n <span className={tip.outcome}>{tip.outcomeSymbol}</span>\n </div>\n <div className=\"TipGame\">{tip.game}</div>\n </li>\n ))}\n <div className=\"AccumulatedOdds\">{`Accumulator odds ~ : ${\n Math.round(accumulatedOdds) - 1\n }/1`}</div>\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"bestPredictions\")\n );\n } else {\n ReactDOM.render(\n <div className=\"PredictionContainer\">\n <Fragment>\n <Increment />\n <Collapsable\n buttonText={\"Build a multi\"}\n element={\n <ul className=\"BestPredictions\" id=\"BestPredictions\">\n <h4 className=\"BestPredictionsExplainer\">\n No games fit the criteria\n </h4>\n <div className=\"AccumulatedOdds\">{`Accumulator odds ~ : ${\n Math.round(accumulatedOdds) - 1\n }/1`}</div>\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"bestPredictions\")\n );\n }\n\n if (exoticArray.length > 4) {\n ReactDOM.render(\n <div className=\"PredictionContainer\">\n <Fragment>\n <Collapsable\n buttonText={\"Exotic of the day\"}\n element={\n <ul className=\"BestPredictions\" id=\"BestPredictions\">\n <h4 className=\"BestPredictionsExplainer\">\n <NewlineText\n text={`${gamesInExotic} games: ${exoticString}\\nStake per multi: ${exoticStake} units - ${combinations} combinations\\nTotal stake: ${(\n exoticStake * combinations\n ).toFixed(2)} unit(s)`}\n />\n {`Potential winnings: ${price.toFixed(2)} units`}\n </h4>\n {exoticArray.map((tip) => (\n <li key={tip.team}>\n {tip.team}: {tip.odds}{\" \"}\n <span className={tip.outcome}>{tip.outcomeSymbol}</span>\n <div>{tip.game}</div>\n </li>\n ))}\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"exoticOfTheDay\")\n );\n } else {\n ReactDOM.render(\n <div className=\"PredictionContainer\">\n <Fragment>\n <Collapsable\n buttonText={\"Exotic of the day\"}\n element={\n <ul className=\"BestPredictions\" id=\"BestPredictions\">\n <h4 className=\"BestPredictionsExplainer\">\n Not enough games for this feature\n </h4>\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"exoticOfTheDay\")\n );\n }\n\n if (Over25Tips.length > 0) {\n ReactDOM.render(\n <div>\n <Fragment>\n <Collapsable\n buttonText={\"Over 2.5 goals tips\"}\n element={\n <ul className=\"LongshotPredictions\" id=\"LongshotPredictions\">\n <h4>Over 2.5 goals</h4>\n {Over25Tips.map((tip) => (\n <li key={tip.team}>\n {tip.game} - Odds: {tip.odds}{\" \"}\n <span className={`${tip.doubleChanceOutcome}`}>\n {tip.outcomeSymbol}\n </span>\n </li>\n ))}\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"longShots\")\n );\n } else {\n ReactDOM.render(\n <div>\n <Fragment>\n <Collapsable\n buttonText={\"Over 2.5 goals tips\"}\n element={\n <ul className=\"LongshotPredictions\" id=\"LongshotPredictions\">\n <h4>No games fit the criteria</h4>\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"longShots\")\n );\n }\n\n if (bttsArray.length > 0) {\n ReactDOM.render(\n <div>\n <Fragment>\n <Collapsable\n buttonText={\"BTTS games\"}\n element={\n <ul className=\"BTTSGames\" id=\"BTTSGames\">\n <h4>Games with highest chance of BTTS</h4>\n {bttsArray.map((game) => (\n <li key={game.game}>\n {`${game.game} odds: ${game.bttsFraction}`}{\" \"}\n <span className={game.bttsOutcome}>\n {game.bttsOutcomeSymbol}\n </span>\n </li>\n ))}\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"BTTS\")\n );\n } else {\n ReactDOM.render(\n <div>\n <Fragment>\n <Collapsable\n buttonText={\"BTTS games\"}\n element={\n <ul className=\"BTTSGames\" id=\"BTTSGames\">\n <h4>No games fit the criteria</h4>\n </ul>\n }\n />\n </Fragment>\n </div>,\n document.getElementById(\"BTTS\")\n );\n }\n\n ReactDOM.render(\n <div>\n <Collapsable\n buttonText={\"XG tips\"}\n element={\n <Slider\n element={\n XGDiffTips.length > 0 ? (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>Games with greatest XG Differentials</h4>\n {XGDiffTips.map((tip) => (\n <li key={tip.game}>\n {tip.game} | {tip.prediction} {tip.odds}{\" \"}\n <span className={tip.outcome}>{tip.outcomeSymbol}</span>\n </li>\n ))}\n </ul>\n ) : (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>Games with greatest XG Differentials</h4>\n <li key={\"noPPGDiff\"}>\n Sorry, no games fit this criteria today\n </li>\n </ul>\n )\n }\n element2={\n pointsDiffTips.length > 0 ? (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>\n Games with greatest points per game differentials (last 10)\n </h4>\n {pointsDiffTips.map((game) => (\n <li key={game.game}>\n {game.game} | {game.prediction} {game.odds}{\" \"}\n <span className={game.outcome}>{game.outcomeSymbol}</span>\n </li>\n ))}\n </ul>\n ) : (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>\n Games with greatest points per game differentials (last 10)\n </h4>\n <li key={\"noPPGDiff\"}>\n Sorry, no games fit this criteria today\n </li>\n </ul>\n )\n }\n element3={\n rollingDiffTips.length > 0 ? (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>\n Games with greatest rolling goal difference differentials\n </h4>\n {rollingDiffTips.map((game) => (\n <li key={game.game}>\n {game.game} | {game.prediction} {game.odds}{\" \"}\n <span className={game.outcome}>{game.outcomeSymbol}</span>\n </li>\n ))}\n </ul>\n ) : (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>\n Games with greatest rolling goal difference differentials\n </h4>\n <li key={\"noPPGDiff\"}>\n Sorry, no games fit this criteria today\n </li>\n </ul>\n )\n }\n element4={\n dangerousAttacksDiffTips.length > 0 ? (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>\n Games with greatest average dangerous attacks differentials\n </h4>\n {dangerousAttacksDiffTips.map((game) => (\n <li key={game.game}>\n {game.game} | {game.prediction} {game.odds}{\" \"}\n <span className={game.outcome}>{game.outcomeSymbol}</span>\n </li>\n ))}\n </ul>\n ) : (\n <ul className=\"XGDiffTips\" id=\"XGDiffTips\">\n <h4>\n Games with greatest average dangerous attacks differentials\n </h4>\n <li key={\"noPPGDiff\"}>\n Sorry, no games fit this criteria today\n </li>\n </ul>\n )\n }\n element5={\n <div className=\"DonationButton\">\n <h2>Help with running costs</h2>\n <h4>\n Monthly costs are rising and each donation helps keep XG\n Tipping free to use\n </h4>\n <StyledKofiButton buttonText=\"No sign up donation\" />\n </div>\n }\n ></Slider>\n }\n ></Collapsable>\n <div className=\"FiltersSelected\">\n <h4>Filters selected:</h4>\n <ul className=\"FiltersSelectedList\">\n <li>Minimum goal difference spread: {minimumGD}</li>\n <li>\n Minimum goal difference spread (home or away only): {minimumGDHorA}\n </li>\n <li>Minimum XG difference spread: {minimumXG}</li>\n <li>Minimum PPG difference spread: {minimumLast10}</li>\n <li>\n Odds range: {rangeValue[0]} - {rangeValue[1]}\n </li>\n </ul>\n </div>\n </div>,\n document.getElementById(\"insights\")\n );\n}\n","/Users/gregdorward/Development/football-predictions/src/components/CollapsableElement.js",[],"/Users/gregdorward/Development/football-predictions/src/components/TextSection.js",[],["217","218"],"/Users/gregdorward/Development/football-predictions/src/logic/getStats.js",["219","220","221","222","223","224","225","226","227"],"/Users/gregdorward/Development/football-predictions/src/components/Div.js",[],"/Users/gregdorward/Development/football-predictions/src/components/CollapsableDiv.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Increment.js",[],"/Users/gregdorward/Development/football-predictions/src/logic/getBTTSPotential.js",[],"/Users/gregdorward/Development/football-predictions/src/components/OddsRadio.js",[],"/Users/gregdorward/Development/football-predictions/src/logic/getTeamStats.js",[],"/Users/gregdorward/Development/football-predictions/src/components/HeadToHead.js",[],"/Users/gregdorward/Development/football-predictions/src/components/BulletList.js",[],["228","229"],"/Users/gregdorward/Development/football-predictions/src/components/Table.js",[],"/Users/gregdorward/Development/football-predictions/src/components/LeagueTable.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Fixture.js",["230"],"import React, { Fragment, useState } from \"react\";\nimport { CreateBadge } from \"./createBadge\";\nimport { createStatsDiv } from \"../logic/getStats\";\nimport { renderTable } from \"../logic/getFixtures\";\nimport { allLeagueResultsArrayOfObjects } from \"../logic/getFixtures\";\nimport { useDispatch } from \"react-redux\";\nimport { setData } from \"../logic/dataSlice\";\nimport { Provider } from \"react-redux\";\nimport store from \"../logic/store\"; // Import your Redux store\nimport { formObjectHome } from \"../logic/getScorePredictions\";\nimport { clicked } from \"../logic/getScorePredictions\";\n\nlet resultValue;\nvar count;\nlet mockValue;\nvar setCount;\n\nfunction toggle(bool) {\n count = !bool;\n return count;\n}\n\nfunction GetDivider(fixture, mock) {\n const matchStatus = fixture.status;\n let isPrediction = resultValue;\n\n if (fixture.fixture.omit === true && matchStatus !== \"complete\") {\n isPrediction = true;\n return (\n <Fragment>\n <div className=\"KOTime\">{`${fixture.fixture.time}`}</div>\n <div\n className=\"Omitted\"\n key={fixture.fixture.awayTeam}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n } else if (mockValue === true && matchStatus === \"complete\") {\n isPrediction = false;\n return (\n <Fragment>\n <div className=\"Result\">{`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}</div>\n <div\n className=\"CorrectScore\"\n key={fixture.fixture.homeTeam}\n data-cy={\"score-\" + fixture.fixture.id}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n } else if (mockValue === true && matchStatus !== \"complete\") {\n isPrediction = true;\n return (\n <Fragment>\n <div className=\"KOTime\">{`${fixture.fixture.time}`}</div>\n <div\n className=\"score\"\n key={fixture.fixture.awayTeam}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n } else if (isPrediction === false && matchStatus !== \"complete\") {\n return (\n <div className=\"divider\" data-cy={\"divider-\" + fixture.fixture.id}>\n {\"V\"}\n </div>\n );\n } else if (isPrediction === false && matchStatus === \"complete\") {\n return (\n <div\n className=\"Result\"\n data-cy={\"result-\" + fixture.fixture.id}\n >{`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}</div>\n );\n } else if (isPrediction === true && matchStatus === \"complete\") {\n let outcome;\n let prediction;\n\n switch (true) {\n case fixture.fixture.homeGoals > fixture.fixture.awayGoals:\n outcome = 0;\n fixture.fixture.winner = fixture.fixture.homeTeam;\n fixture.fixture.outcome = \"homeWin\";\n break;\n case fixture.fixture.homeGoals === fixture.fixture.awayGoals:\n outcome = 1;\n fixture.fixture.winner = \"draw\";\n fixture.fixture.outcome = \"draw\";\n\n break;\n case fixture.fixture.homeGoals < fixture.fixture.awayGoals:\n outcome = 2;\n fixture.fixture.winner = fixture.fixture.awayTeam;\n fixture.fixture.outcome = \"awayWin\";\n\n break;\n default:\n break;\n }\n\n switch (true) {\n case fixture.fixture.goalsA > fixture.fixture.goalsB:\n prediction = 0;\n break;\n case fixture.fixture.goalsA === fixture.fixture.goalsB:\n prediction = 1;\n break;\n case fixture.fixture.goalsA < fixture.fixture.goalsB:\n prediction = 2;\n break;\n default:\n break;\n }\n\n if (fixture.fixture.omit === true) {\n return (\n <Fragment>\n <div className=\"Result\">{`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}</div>\n <div\n className=\"Omitted\"\n key={fixture.fixture.homeTeam}\n data-cy={\"score-\" + fixture.fixture.id}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n } else if (outcome === prediction) {\n if (fixture.fixture.homeOdds !== 0) {\n switch (true) {\n case outcome === 0:\n fixture.fixture.profit = fixture.fixture.homeOdds;\n break;\n case outcome === 1:\n fixture.fixture.profit = fixture.fixture.drawOdds;\n break;\n case outcome === 2:\n fixture.fixture.profit = fixture.fixture.awayOdds;\n break;\n default:\n break;\n }\n } else fixture.fixture.profit = 1;\n\n if (\n fixture.fixture.goalsA === fixture.fixture.homeGoals &&\n fixture.fixture.goalsB === fixture.fixture.awayGoals\n ) {\n fixture.fixture.exactScore = true;\n return (\n <Fragment>\n <div className=\"Result\">{`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}</div>\n <div\n className=\"ExactScore\"\n key={fixture.fixture.homeTeam}\n data-cy={\"score-\" + fixture.fixture.id}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n } else {\n fixture.fixture.exactScore = false;\n return (\n <Fragment>\n <div className=\"Result\">{`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}</div>\n <div\n className=\"CorrectScore\"\n key={fixture.fixture.homeTeam}\n data-cy={\"score-\" + fixture.fixture.id}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n }\n } else if (outcome !== prediction) {\n if (fixture.fixture.homeOdds !== 0) {\n fixture.fixture.profit = 0;\n } else {\n fixture.fixture.profit = 1;\n }\n fixture.fixture.exactScore = false;\n return (\n <Fragment>\n <div className=\"Result\">{`${fixture.fixture.homeGoals} - ${fixture.fixture.awayGoals}`}</div>\n <div\n className=\"IncorrectScore\"\n key={fixture.fixture.awayTeam}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n }\n } else {\n return (\n <Fragment>\n <div className=\"KOTime\">{`${fixture.fixture.time}`}</div>\n <div\n className=\"score\"\n key={fixture.fixture.awayTeam}\n >{`${fixture.fixture.goalsA} - ${fixture.fixture.goalsB}`}</div>\n </Fragment>\n );\n }\n}\n\nfunction renderLeagueName(fixture, mock) {\n mockValue = mock;\n\n let name = fixture.leagueName;\n let id =\n allLeagueResultsArrayOfObjects.length > 0\n ? allLeagueResultsArrayOfObjects[fixture.leagueIndex].id\n : null;\n if (name === null || mock === true) {\n return <div></div>;\n } else {\n return (\n <div>\n <div\n className=\"leagueName\"\n id={`league${id}`}\n key={`leagueName${id}div`}\n onClick={() =>\n renderTable(\n fixture.leagueIndex,\n allLeagueResultsArrayOfObjects[fixture.leagueIndex],\n id\n )\n }\n >\n {fixture.leagueName} ☰\n </div>\n <div\n className=\"LeagueTable\"\n key={`leagueName${id}`}\n id={`leagueName${id}`}\n ></div>\n </div>\n );\n }\n}\n\nconst downArrow = \"\\u{2195}\";\nconst rightArrow = \"\\u{29C9}\";\n\nexport let testing;\n\nfunction SingleFixture({ fixture, count, mock }) {\n const dispatch = useDispatch();\n function StoreData() {\n const fixtureDetails = {\n id: fixture.id,\n homeTeamName: fixture.homeTeam,\n homeId: fixture.homeId,\n homeTeamBadge: fixture.homeBadge,\n awayTeamName: fixture.awayTeam,\n awayId: fixture.awayId,\n awayTeamBadge: fixture.awayBadge,\n stadium: fixture.stadium,\n time: fixture.time,\n homeGoals: fixture.goalsA,\n awayGoals: fixture.goalsB,\n };\n\n const homeDetails = {\n \"Attacking Strength\": fixture.formHome.attackingStrength,\n \"Defensive Strength\": fixture.formHome.defensiveStrength,\n };\n\n const awayDetails = {\n \"Attacking Strength\": fixture.formAway.attackingStrength,\n \"Defensive Strength\": fixture.formAway.defensiveStrength,\n };\n\n const dataToSend = {\n key1: \"value1\",\n key2: \"value2\",\n };\n fixture.formHome.defensiveMetrics[\"Clean Sheet Percentage\"] =\n fixture.formHome.CleanSheetPercentage;\n fixture.formAway.defensiveMetrics[\"Clean Sheet Percentage\"] =\n fixture.formAway.CleanSheetPercentage;\n\n localStorage.setItem(\n \"homeForm\",\n JSON.stringify(fixture.formHome.attackingMetrics)\n );\n localStorage.setItem(\n \"homeFormDef\",\n JSON.stringify(fixture.formHome.defensiveMetrics)\n );\n localStorage.setItem(\n \"allTeamResultsHome\",\n JSON.stringify(fixture.formHome.allTeamResults)\n );\n localStorage.setItem(\"homeDetails\", JSON.stringify(homeDetails));\n\n localStorage.setItem(\n \"awayForm\",\n JSON.stringify(fixture.formAway.attackingMetrics)\n );\n localStorage.setItem(\n \"awayFormDef\",\n JSON.stringify(fixture.formAway.defensiveMetrics)\n );\n localStorage.setItem(\n \"allTeamResultsAway\",\n JSON.stringify(fixture.formAway.allTeamResults)\n );\n localStorage.setItem(\"awayDetails\", JSON.stringify(awayDetails));\n\n localStorage.setItem(\"fixtureDetails\", JSON.stringify(fixtureDetails));\n\n dispatch(setData(dataToSend));\n }\n\n async function handleButtonClick(game) {\n if (clicked === true) {\n StoreData(formObjectHome);\n window.open(\"/#/fixture\");\n } else return;\n }\n return (\n <div key={fixture.game}>\n {renderLeagueName(fixture, mock)}\n <div className={`individualFixtureContainer${fixture.omit}`}>\n <li\n className={`individualFixture${fixture.omit}`}\n key={fixture.id}\n data-cy={fixture.id}\n >\n <div className=\"HomeOdds\">{fixture.fractionHome}</div>\n <div className=\"homeTeam\">{fixture.homeTeam}</div>\n <GetDivider\n result={resultValue}\n status={fixture.status}\n fixture={fixture}\n />\n {/* <div className=\"divider\">{\"V\"}</div> */}\n <div className=\"awayTeam\">{fixture.awayTeam}</div>\n <CreateBadge\n image={fixture.homeBadge}\n ClassName=\"HomeBadge\"\n alt=\"Home team badge\"\n flexShrink={5}\n />\n <CreateBadge\n image={fixture.awayBadge}\n ClassName=\"AwayBadge\"\n alt=\"Away team badge\"\n />\n <div className=\"AwayOdds\">{fixture.fractionAway}</div>\n </li>\n <button\n className=\"GameStats\"\n onClick={() =>\n mock === false ? createStatsDiv(fixture, count) : null\n }\n onMouseDown={() => (count = toggle(count))}\n >\n Game overview {downArrow}\n </button>\n <button\n className=\"GameStatsTwo\"\n onClick={() => handleButtonClick(fixture)}\n >\n More detail {rightArrow}\n </button>\n {/* <Checkbox/> */}\n </div>\n <div id={\"stats\" + fixture.homeTeam} />\n <div className=\"MatchHistory\" id={\"history\" + fixture.homeTeam} />\n </div>\n );\n}\n\nconst List = ({ fixtures, mock }) => (\n <div>\n <div id=\"Headers\"></div>\n <ul className=\"FixtureList\" id=\"FixtureList\">\n {fixtures.map((fixture, i) => (\n <SingleFixture\n fixture={fixture}\n key={fixture.game}\n count={count}\n mock={mock}\n />\n ))}\n </ul>\n </div>\n);\n\nexport function Fixture(props) {\n [count, setCount] = useState(false);\n resultValue = props.result;\n return (\n <Provider store={store}>\n <List\n fixtures={props.fixtures}\n result={resultValue}\n count={count}\n mock={props.mock}\n />\n </Provider>\n );\n}\n","/Users/gregdorward/Development/football-predictions/src/components/KofiButton.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Chart.js",["231"],"// import { light } from \"@material-ui/core/styles/createPalette\";\n// import { toBePartiallyChecked } from \"@testing-library/jest-dom/dist/matchers\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n RadialLinearScale,\n PointElement,\n ArcElement,\n LineElement,\n Filler,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport { Line, Radar, Bar } from \"react-chartjs-2\";\n\nChartJS.register(\n CategoryScale,\n LinearScale,\n RadialLinearScale,\n PointElement,\n ArcElement,\n Filler,\n BarElement,\n LineElement,\n Title,\n Tooltip,\n Legend\n);\n\nexport function Chart(props) {\n let length;\n let depth;\n\n if (props.type === \"Points over time\") {\n length = props.data1.length * 3;\n depth = 0;\n } else if (props.type === \"Rolling average points over last 10\") {\n length = Math.abs(props.height);\n depth = 0;\n } else if (Math.abs(props.height) > Math.abs(props.depth)) {\n length = Math.abs(props.height);\n depth = -Math.abs(props.height);\n } else if (Math.abs(props.height) < Math.abs(props.depth)) {\n length = Math.abs(props.depth);\n depth = -Math.abs(props.depth);\n } else {\n length = Math.abs(props.depth);\n depth = -Math.abs(props.depth);\n }\n\n const options = {\n color: \"black\",\n responsive: true,\n aspectRatio: 1.2,\n maintainAspectRatio: true,\n layout: {\n padding: 3,\n },\n elements: {\n point: {\n radius: 0,\n },\n },\n scales: {\n y: {\n suggestedMin: depth,\n suggestedMax: length,\n // suggestedMax: Math.max(...props.data1) > 3 ? Math.max(...props.data1) : 3,\n grid: {\n borderWidth: 1,\n borderColor: \"black\",\n },\n ticks: {\n font: {\n size: 12,\n },\n },\n },\n x: {\n title: {\n display: false,\n text: \"Last X Games\",\n font: {\n size: 14,\n },\n },\n grid: {\n borderWidth: 1,\n borderColor: \"black\",\n },\n ticks: {\n display: false,\n font: {\n size: 14,\n },\n },\n },\n },\n plugins: {\n legend: {\n position: \"top\",\n\n labels: {\n boxHeight: 5,\n },\n },\n title: {\n display: true,\n text: props.type,\n font: {\n size: 14,\n color: \"black\",\n },\n },\n },\n };\n\n const labels = Array.from(props.data1.keys());\n\n let data = {\n labels,\n datasets: [\n {\n label: props.team1,\n font: {\n color: \"black\",\n },\n data: props.data1,\n borderColor: \"#030061\",\n borderWidth: 2,\n backgroundColor: \"#030061\",\n tension: props.tension,\n },\n {\n label: props.team2,\n data: props.data2,\n borderColor: \"#970d00\",\n borderWidth: 2,\n backgroundColor: \"#970d00\",\n tension: props.tension,\n },\n ],\n };\n\n return <Line options={options} data={data} />;\n}\n\nexport function RadarChart(props) {\n const options = {\n color: \"black\",\n scales: {\n r: {\n angleLines: {\n display: false,\n },\n suggestedMin: 0,\n suggestedMax: 1,\n ticks: {\n precision: 0,\n display: false,\n },\n // grid: {\n // circular: true,\n // }\n },\n },\n plugins: {\n legend: {\n position: \"top\",\n\n labels: {\n boxHeight: 10,\n },\n },\n title: {\n display: true,\n text: props.title,\n font: {\n size: 14,\n },\n },\n },\n };\n\n let data = {\n labels: [\"Attack rating\", \"Defence rating\", \"Ball retention\", \"XG For\", \"XG Against\", \"Directness\", \"Attacking precision\"],\n datasets: [\n {\n label: props.team1,\n data: props.data,\n fill: true,\n backgroundColor: \"rgba(54, 162, 235, 0.2)\",\n borderColor: \"#030061\",\n pointBackgroundColor: \"#030061\",\n pointBorderColor: \"#fff\",\n pointHoverBackgroundColor: \"#fff\",\n pointHoverBorderColor: \"rgb(255, 99, 132)\",\n borderWidth: 2,\n },\n {\n label: props.team2,\n data: props.data2,\n fill: true,\n backgroundColor: \"rgba(255, 99, 132, 0.2)\",\n borderColor: \"#970d00\",\n pointBackgroundColor: \"#970d00\",\n pointBorderColor: \"#fff\",\n pointHoverBackgroundColor: \"#fff\",\n pointHoverBorderColor: \"rgb(54, 162, 235)\",\n borderWidth: 2,\n },\n ],\n };\n\n return <Radar options={options} data={data} />;\n}\n\nexport function BarChart(props) {\n const datasetOne = props.data1;\n const datasetTwo = props.data2;\n const sum = datasetTwo.map(function (num, idx) {\n return num - datasetOne[idx];\n });\n\n const max = Math.max(...sum);\n const min = Math.min(...sum);\n\n const largest = findLargestNum(max, min);\n\n function findLargestNum(numOne, numTwo) {\n const tempArr = [];\n const firstNum = Math.abs(numOne);\n const secondNum = Math.abs(numTwo);\n tempArr.push(firstNum, secondNum);\n\n return Math.max(...tempArr);\n }\n\n const options = {\n indexAxis: \"y\",\n // Elements options apply to all of the options unless overridden in a dataset\n // In this case, we are setting the border of each horizontal bar to be 2px wide\n aspectRatio: 1.3,\n elements: {\n bar: {\n borderWidth: 2,\n },\n },\n scales: {\n x: {\n min: -4,\n max: 4,\n ticks: {\n display: false,\n },\n },\n y: {\n ticks: {\n font: {\n size: 10,\n },\n },\n },\n },\n responsive: true,\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n enabled: false,\n },\n title: {\n display: true,\n text: props.text,\n size: 14\n },\n },\n };\n\n const labels = [\n \"Highest Goals\",\n \"Fewest Conceeded\",\n \"PPG\",\n \"Highest XG\",\n \"Fewest XG Conceeded\",\n \"Shots On Target\",\n \"Dangerous Attacks\",\n \"Av. Possession\",\n \"Home/Away Goal Diff\",\n \"Corners\",\n ];\n\n const data = {\n labels,\n datasets: [\n {\n // label: 'Dataset 1',\n legend: {\n display: false,\n },\n data: sum,\n backgroundColor(context) {\n const index = context.dataIndex;\n const value = context.dataset.data[index];\n return value < 0 ? \"#030061\" : \"#970d00\";\n },\n },\n ],\n };\n\n return <Bar options={options} data={data} />;\n}\n","/Users/gregdorward/Development/football-predictions/src/logic/compareFormTrend.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Toggle.js",[],["232","233"],"/Users/gregdorward/Development/football-predictions/src/components/Carousel.js",[],"/Users/gregdorward/Development/football-predictions/src/components/DayPicker.js",[],["234","235"],"/Users/gregdorward/Development/football-predictions/src/components/DateForm.js",[],"/Users/gregdorward/Development/football-predictions/src/logic/dataSlice.js",[],"/Users/gregdorward/Development/football-predictions/src/logic/store.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Team.js",["236"],"import React, { useState, useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { CreateBadge } from \"./createBadge\";\nimport {\n Chart as ChartJS,\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend,\n} from \"chart.js\";\nimport { Bar } from \"react-chartjs-2\";\nChartJS.register(\n CategoryScale,\n LinearScale,\n BarElement,\n Title,\n Tooltip,\n Legend\n);\n\nfunction TeamPage() {\n const [dataState, setData] = useState([]);\n\n useEffect(() => {\n fetchData();\n }, []);\n\n const fetchData = async () => {\n try {\n const responseHome = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}team/${storedFixtureDetailsJson.homeId}`\n );\n const resultHome = await responseHome.json();\n\n const responseAway = await fetch(\n `${process.env.REACT_APP_EXPRESS_SERVER}team/${storedFixtureDetailsJson.awayId}`\n );\n const resultAway = await responseAway.json();\n // setData(result.data.stadium_name);\n\n let indexHome = resultHome.data.findIndex(\n (x) => x.season_format === \"Domestic League\"\n );\n let indexAway = resultAway.data.findIndex(\n (x) => x.season_format === \"Domestic League\"\n );\n\n setData((test) => ({\n ...test,\n scoredOverallHome:\n resultHome.data[indexHome].stats.seasonScoredNum_overall,\n playedHomeOnly:\n resultHome.data[indexHome].stats.seasonMatchesPlayed_home,\n scoredOverallHomeOnly:\n resultHome.data[indexHome].stats.seasonScoredNum_home,\n conceededOverallHome:\n resultHome.data[indexHome].stats.seasonConcededNum_overall,\n conceededOverallHomeOnly:\n resultHome.data[indexHome].stats.seasonConcededNum_home,\n\n PPGOverallHome: resultHome.data[indexHome].stats.seasonPPG_overall,\n PPGOverallHomeOnly: resultHome.data[indexHome].stats.seasonPPG_home,\n leaguePosition_overallHome:\n resultHome.data[indexHome].stats.leaguePosition_overall,\n leaguePosition_HomeOnly:\n resultHome.data[indexHome].stats.leaguePosition_home,\n averageAttendance:\n resultHome.data[indexHome].stats.average_attendance_home,\n BTTSPercentage_overallHome:\n resultHome.data[indexHome].stats.seasonBTTSPercentage_overall,\n BTTSAndWinPercentage_Home:\n resultHome.data[indexHome].stats.BTTS_and_win_percentage_overall,\n BTTSAndLosePercentage_Home:\n resultHome.data[indexHome].stats.BTTS_and_lose_percentage_overall,\n BTTSBothHalvesHome:\n resultHome.data[indexHome].stats.BTTS_both_halves_percentage_overall,\n GoalDifferenceHT_overall_Home:\n resultHome.data[indexHome].stats.GoalDifferenceHT_overall,\n GD_2hg_overall_Home: resultHome.data[indexHome].stats.gd_2hg_overall,\n leadingAtHTPercentage_overallHome:\n resultHome.data[indexHome].stats.leadingAtHTPercentage_overall,\n seasonOver15Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver15Percentage_overall,\n seasonOver25Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver25Percentage_overall,\n seasonOver35Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver35Percentage_overall,\n seasonOver45Percentage_overallHome:\n resultHome.data[indexHome].stats.seasonOver45Percentage_overall,\n scoredBothHalvesPercentage_overallHome:\n resultHome.data[indexHome].stats.scoredBothHalvesPercentage_overall,\n shots_on_target_per_goals_scored_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .shots_on_target_per_goals_scored_overall,\n cornersTotalAVG_overallHome:\n resultHome.data[indexHome].stats.cornersTotalAVG_overall,\n cardsAVG_overallHome: resultHome.data[indexHome].stats.cardsAVG_overall,\n foulsAVG_overallHome: resultHome.data[indexHome].stats.foulsAVG_overall,\n penalties_won_per_match_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .penalties_won_per_match_overall,\n penalty_in_a_match_percentage_overallHome:\n resultHome.data[indexHome].stats.additional_info\n .penalty_in_a_match_percentage_overall,\n\n scoredOverallAway:\n resultAway.data[indexAway].stats.seasonScoredNum_overall,\n playedAwayOnly:\n resultAway.data[indexAway].stats.seasonMatchesPlayed_away,\n scoredOverallAwayOnly:\n resultAway.data[indexAway].stats.seasonScoredNum_away,\n conceededOverallAway:\n resultAway.data[indexAway].stats.seasonConcededNum_overall,\n conceededOverallAwayOnly:\n resultAway.data[indexAway].stats.seasonConcededNum_away,\n\n PPGOverallAway: resultAway.data[indexAway].stats.seasonPPG_overall,\n PPGOverallAwayOnly: resultAway.data[indexAway].stats.seasonPPG_away,\n leaguePosition_overallAway:\n resultAway.data[indexAway].stats.leaguePosition_overall,\n leaguePosition_AwayOnly:\n resultAway.data[indexAway].stats.leaguePosition_away,\n BTTSPercentage_overallAway:\n resultAway.data[indexAway].stats.seasonBTTSPercentage_overall,\n BTTSAndWinPercentage_Away:\n resultAway.data[indexAway].stats.BTTS_and_win_percentage_overall,\n BTTSAndLosePercentage_Away:\n resultAway.data[indexAway].stats.BTTS_and_lose_percentage_overall,\n BTTSBothHalvesAway:\n resultAway.data[indexAway].stats.BTTS_both_halves_percentage_overall,\n GoalDifferenceHT_overall_Away:\n resultAway.data[indexAway].stats.GoalDifferenceHT_overall,\n GD_2hg_overall_Away: resultAway.data[indexAway].stats.gd_2hg_overall,\n leadingAtHTPercentage_overallAway:\n resultAway.data[indexAway].stats.leadingAtHTPercentage_overall,\n seasonOver15Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver15Percentage_overall,\n seasonOver25Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver25Percentage_overall,\n seasonOver35Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver35Percentage_overall,\n seasonOver45Percentage_overallAway:\n resultAway.data[indexAway].stats.seasonOver45Percentage_overall,\n scoredBothHalvesPercentage_overallAway:\n resultAway.data[indexAway].stats.scoredBothHalvesPercentage_overall,\n shots_on_target_per_goals_scored_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .shots_on_target_per_goals_scored_overall,\n\n cornersTotalAVG_overallAway:\n resultAway.data[indexAway].stats.cornersTotalAVG_overall,\n cardsAVG_overallAway: resultAway.data[indexAway].stats.cardsAVG_overall,\n foulsAVG_overallAway: resultAway.data[indexAway].stats.foulsAVG_overall,\n penalties_won_per_match_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .penalties_won_per_match_overall,\n penalty_in_a_match_percentage_overallAway:\n resultAway.data[indexAway].stats.additional_info\n .penalty_in_a_match_percentage_overall,\n }));\n } catch (error) {\n console.error(\"Error fetching data:\", error);\n }\n };\n\n const storedDataHome = useSelector((state) => state.data.dataHome);\n const jsonDataHome = JSON.parse(storedDataHome);\n const propertyNamesHome = Object.entries(jsonDataHome);\n\n const storedDataHomeDef = useSelector((state) => state.data.dataHomeDef);\n const jsonDataHomeDef = JSON.parse(storedDataHomeDef);\n const propertyNamesHomeDef = Object.entries(jsonDataHomeDef);\n\n const storedDataallTeamResultsHome = useSelector(\n (state) => state.data.allTeamResultsHome\n );\n const jsonDataallTeamResultsHome = JSON.parse(storedDataallTeamResultsHome);\n const propertyNamesallTeamResultsHome = Object.values(\n jsonDataallTeamResultsHome\n );\n\n const homeDetails = useSelector((state) => state.data.homeDetails);\n const jsonHomeDetails = JSON.parse(homeDetails);\n\n const storedDataAway = useSelector((state) => state.data.dataAway);\n const jsonDataAway = JSON.parse(storedDataAway);\n const propertyNamesAway = Object.entries(jsonDataAway);\n\n const storedDataAwayDef = useSelector((state) => state.data.dataAwayDef);\n const jsonDataAwayDef = JSON.parse(storedDataAwayDef);\n const propertyNamesAwayDef = Object.entries(jsonDataAwayDef);\n\n const storedDataallTeamResultsAway = useSelector(\n (state) => state.data.allTeamResultsAway\n );\n const jsonDataallTeamResultsAway = JSON.parse(storedDataallTeamResultsAway);\n const propertyNamesallTeamResultsAway = Object.values(\n jsonDataallTeamResultsAway\n );\n\n const awayDetails = useSelector((state) => state.data.awayDetails);\n const jsonAwayDetails = JSON.parse(awayDetails);\n\n const storedFixtureDetails = useSelector(\n (state) => state.data.fixtureDetails\n );\n const storedFixtureDetailsJson = JSON.parse(storedFixtureDetails);\n\n const options = {\n plugins: {\n title: {\n display: true,\n text: \"Team comparison\",\n },\n },\n aspectRatio: 0.5,\n maintainAspectRatio: true,\n responsive: true,\n scales: {\n x: {\n stacked: true,\n },\n y: {\n stacked: true,\n display: false,\n },\n },\n };\n const labels = [\n storedFixtureDetailsJson.homeTeamName,\n storedFixtureDetailsJson.awayTeamName,\n ];\n\n const data = {\n labels,\n datasets: [\n {\n data: [\n jsonHomeDetails[\"Attacking Strength\"],\n [jsonAwayDetails[\"Attacking Strength\"]],\n ],\n label: \"Attacking Strength\",\n backgroundColor: \"#030061\",\n },\n {\n data: [\n jsonHomeDetails[\"Defensive Strength\"],\n [jsonAwayDetails[\"Defensive Strength\"]],\n ],\n label: \"Defensive Strength\",\n backgroundColor: \"#CC3314\",\n },\n ],\n };\n\n return (\n <div className=\"TeamStatsContainer\">\n <div className=\"FixtureHeadingContiner\">\n <CreateBadge\n image={storedFixtureDetailsJson.homeTeamBadge}\n ClassName=\"HomeTeamBadge\"\n alt=\"Home team badge\"\n ></CreateBadge>\n {`${storedFixtureDetailsJson.homeTeamName} v ${storedFixtureDetailsJson.awayTeamName}`}\n <CreateBadge\n image={storedFixtureDetailsJson.awayTeamBadge}\n ClassName=\"AwayTeamBadge\"\n alt=\"Away team badge\"\n ></CreateBadge>\n </div>\n <h3>\n {storedFixtureDetailsJson.stadium} KO: {storedFixtureDetailsJson.time} |\n Average Attendance: {dataState.averageAttendance}\n </h3>\n <h3>\n XGTipping Prediction: {storedFixtureDetailsJson.homeGoals} -{\" \"}\n {storedFixtureDetailsJson.awayGoals}\n </h3>\n <div className=\"TeamStats\">\n <ul className=\"HomeTeamStats\">\n <h3>{storedFixtureDetailsJson.homeTeamName}</h3>\n {propertyNamesHome.map(([key, value], index) => (\n <li key={index}>\n <strong>{key}:</strong>{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n </li>\n ))}\n <ul className=\"HomeTeamStats\">\n {propertyNamesHomeDef.map(([key, value], index) => (\n <li key={index}>\n <strong>{key}:</strong>{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n </li>\n ))}\n </ul>\n <li>Scored overall: {dataState.scoredOverallHome}</li>\n <li>Conceeded overall: {dataState.conceededOverallHome}</li>\n <li>\n Average scored home only:{\" \"}\n {(\n dataState.scoredOverallHomeOnly / dataState.playedHomeOnly\n ).toFixed(2)}\n </li>\n <li>\n Average conceeded home only:{\" \"}\n {(\n dataState.conceededOverallHomeOnly / dataState.playedHomeOnly\n ).toFixed(2)}\n </li>\n <li>PPG overall: {dataState.PPGOverallHome}</li>\n <li>PPG home only: {dataState.PPGOverallHomeOnly}</li>\n <li>League position: {dataState.leaguePosition_overallHome}</li>\n <li>\n League position home only: {dataState.leaguePosition_HomeOnly}\n </li>\n <li>BTTS {dataState.BTTSPercentage_overallHome}%</li>\n <li>BTTS and win: {dataState.BTTSAndWinPercentage_Home}%</li>\n <li>BTTS and lose: {dataState.BTTSAndLosePercentage_Home}%</li>\n <li>BTTS both halves: {dataState.BTTSBothHalvesHome}%</li>\n <li>\n Goal diff 1st half only: {dataState.GoalDifferenceHT_overall_Home}\n </li>\n <li>Goal diff 2nd half only: {dataState.GD_2hg_overall_Home}</li>\n <li>\n Leading at half time: {dataState.leadingAtHTPercentage_overallHome}%\n </li>\n <li>\n Over 1.5 goals in games:{\" \"}\n {dataState.seasonOver15Percentage_overallHome}%\n </li>\n <li>\n Over 2.5 goals in games:{\" \"}\n {dataState.seasonOver25Percentage_overallHome}%\n </li>\n <li>\n Over 3.5 goals in games:{\" \"}\n {dataState.seasonOver35Percentage_overallHome}%\n </li>\n <li>\n Over 4.5 goals in games:{\" \"}\n {dataState.seasonOver45Percentage_overallHome}%\n </li>\n <li>\n Scored both halves:{\" \"}\n {dataState.scoredBothHalvesPercentage_overallHome}%\n </li>\n <li>\n SOTs per goal:{\" \"}\n {dataState.shots_on_target_per_goals_scored_overallHome}\n </li>\n <li>Corners in game avg: {dataState.cornersTotalAVG_overallHome}</li>\n <li>Cards avg: {dataState.cardsAVG_overallHome}</li>\n <li>Fouls against avg: {dataState.foulsAVG_overallHome}</li>\n <li>\n Penalties won avg: {dataState.penalties_won_per_match_overallHome}\n </li>\n <li>\n Penalties in match:{\" \"}\n {dataState.penalty_in_a_match_percentage_overallHome}%\n </li>\n </ul>\n <ul className=\"AwayTeamStats\">\n <h3>{storedFixtureDetailsJson.awayTeamName}</h3>\n {propertyNamesAway.map(([key, value], index) => (\n <li key={index}>\n <strong>{key}:</strong>{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n </li>\n ))}\n <ul className=\"AwayTeamStats\">\n {propertyNamesAwayDef.map(([key, value], index) => (\n <li key={index}>\n <strong>{key}:</strong>{\" \"}\n {typeof value === \"object\" ? JSON.stringify(value) : value}\n </li>\n ))}\n </ul>\n <li>Scored overall: {dataState.scoredOverallAway}</li>\n <li>Conceeded overall: {dataState.conceededOverallAway}</li>\n <li>\n Average scored away only:{\" \"}\n {(\n dataState.scoredOverallAwayOnly / dataState.playedAwayOnly\n ).toFixed(2)}\n </li>\n <li>\n Average conceeded away only:{\" \"}\n {(\n dataState.conceededOverallAwayOnly / dataState.playedAwayOnly\n ).toFixed(2)}\n </li>\n <li>PPG overall: {dataState.PPGOverallAway}</li>\n <li>PPG away only: {dataState.PPGOverallAwayOnly}</li>\n <li>League position: {dataState.leaguePosition_overallAway}</li>\n <li>\n League position away only: {dataState.leaguePosition_AwayOnly}\n </li>\n <li>BTTS: {dataState.BTTSPercentage_overallAway}%</li>\n <li>BTTS and win: {dataState.BTTSAndWinPercentage_Away}%</li>\n <li>BTTS and lose: {dataState.BTTSAndLosePercentage_Away}%</li>\n <li>BTTS both halves: {dataState.BTTSBothHalvesAway}%</li>\n <li>\n Goal diff 1st half only: {dataState.GoalDifferenceHT_overall_Away}\n </li>\n <li>Goal diff 2nd half only: {dataState.GD_2hg_overall_Away}</li>\n <li>\n Leading at half time: {dataState.leadingAtHTPercentage_overallAway}%\n </li>\n <li>\n Over 1.5 goals in games:{\" \"}\n {dataState.seasonOver15Percentage_overallAway}%\n </li>\n <li>\n Over 2.5 goals in games:{\" \"}\n {dataState.seasonOver25Percentage_overallAway}%\n </li>\n <li>\n Over 3.5 goals in games:{\" \"}\n {dataState.seasonOver35Percentage_overallAway}%\n </li>\n <li>\n Over 4.5 goals in games:{\" \"}\n {dataState.seasonOver45Percentage_overallAway}%\n </li>\n <li>\n Scored both halves:{\" \"}\n {dataState.scoredBothHalvesPercentage_overallAway}%\n </li>\n <li>\n SOTs per goal:{\" \"}\n {dataState.shots_on_target_per_goals_scored_overallAway}\n </li>\n <li>Corners in game avg: {dataState.cornersTotalAVG_overallAway}</li>\n <li>Cards avg: {dataState.cardsAVG_overallAway}</li>\n <li>Fouls against avg: {dataState.foulsAVG_overallAway}</li>\n <li>\n Penalties won avg: {dataState.penalties_won_per_match_overallAway}\n </li>\n <li>\n Penalties in match:{\" \"}\n {dataState.penalty_in_a_match_percentage_overallAway}%\n </li>\n </ul>\n <div className=\"ChartContainer\">\n <span className=\"Spacer\"></span>\n <Bar options={options} data={data} className=\"ComparisonBar\" />\n <span className=\"Spacer\"></span>\n </div>\n <ul className=\"HomeTeamResults\">\n {propertyNamesallTeamResultsHome.map((match, index) => (\n <>\n <div className=\"MatchDate\">{match.date}</div>\n <div className=\"ResultRowOverviewSmall\">\n <div className=\"columnOverviewHomeSmall\">{match.homeTeam}</div>\n <span className=\"columnOverviewScoreSmall\">\n {match.homeGoals} : {match.awayGoals}\n </span>\n <div className=\"columnOverviewAwaySmall\">{match.awayTeam}</div>\n </div>\n </>\n ))}\n </ul>\n <ul className=\"AwayTeamResults\">\n {propertyNamesallTeamResultsAway.map((match, index) => (\n <>\n <div className=\"MatchDate\">{match.date}</div>\n <div className=\"ResultRowOverviewSmall\">\n <div className=\"columnOverviewHomeSmall\">{match.homeTeam}</div>\n <span className=\"columnOverviewScoreSmall\">\n {match.homeGoals} : {match.awayGoals}\n </span>\n <div className=\"columnOverviewAwaySmall\">{match.awayTeam}</div>\n </div>\n </>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\nexport default TeamPage;\n","/Users/gregdorward/Development/football-predictions/src/components/Checkbox.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Slider.js",[],"/Users/gregdorward/Development/football-predictions/src/components/SliderDiff.js",[],"/Users/gregdorward/Development/football-predictions/src/components/Switch.js",[],"/Users/gregdorward/Development/football-predictions/src/components/SofaScore.js",["237"],{"ruleId":"238","severity":1,"message":"239","line":6,"column":27,"nodeType":"240","messageId":"241","endLine":6,"endColumn":33},{"ruleId":"238","severity":1,"message":"242","line":10,"column":9,"nodeType":"240","messageId":"241","endLine":10,"endColumn":16},{"ruleId":"243","replacedBy":"244"},{"ruleId":"245","replacedBy":"246"},{"ruleId":"238","severity":1,"message":"239","line":24,"column":27,"nodeType":"240","messageId":"241","endLine":24,"endColumn":33},{"ruleId":"238","severity":1,"message":"247","line":24,"column":35,"nodeType":"240","messageId":"241","endLine":24,"endColumn":40},{"ruleId":"238","severity":1,"message":"248","line":24,"column":42,"nodeType":"240","messageId":"241","endLine":24,"endColumn":48},{"ruleId":"238","severity":1,"message":"249","line":24,"column":50,"nodeType":"240","messageId":"241","endLine":24,"endColumn":54},{"ruleId":"238","severity":1,"message":"250","line":25,"column":8,"nodeType":"240","messageId":"241","endLine":25,"endColumn":16},{"ruleId":"238","severity":1,"message":"251","line":83,"column":5,"nodeType":"240","messageId":"241","endLine":83,"endColumn":14},{"ruleId":"238","severity":1,"message":"252","line":84,"column":5,"nodeType":"240","messageId":"241","endLine":84,"endColumn":24},{"ruleId":"238","severity":1,"message":"253","line":87,"column":5,"nodeType":"240","messageId":"241","endLine":87,"endColumn":13},{"ruleId":"238","severity":1,"message":"254","line":88,"column":5,"nodeType":"240","messageId":"241","endLine":88,"endColumn":23},{"ruleId":"238","severity":1,"message":"255","line":144,"column":18,"nodeType":"240","messageId":"241","endLine":144,"endColumn":31},{"ruleId":"238","severity":1,"message":"256","line":447,"column":16,"nodeType":"240","messageId":"241","endLine":447,"endColumn":40},{"ruleId":"238","severity":1,"message":"257","line":476,"column":16,"nodeType":"240","messageId":"241","endLine":476,"endColumn":39},{"ruleId":"243","replacedBy":"258"},{"ruleId":"245","replacedBy":"259"},{"ruleId":"260","severity":1,"message":"261","line":503,"column":47,"nodeType":"262","messageId":"263","endLine":503,"endColumn":49},{"ruleId":"260","severity":1,"message":"261","line":504,"column":47,"nodeType":"262","messageId":"263","endLine":504,"endColumn":49},{"ruleId":"238","severity":1,"message":"264","line":4,"column":7,"nodeType":"240","messageId":"241","endLine":4,"endColumn":17},{"ruleId":"238","severity":1,"message":"265","line":18,"column":3,"nodeType":"240","messageId":"241","endLine":18,"endColumn":36},{"ruleId":"238","severity":1,"message":"266","line":1482,"column":9,"nodeType":"240","messageId":"241","endLine":1482,"endColumn":43},{"ruleId":"238","severity":1,"message":"267","line":1487,"column":9,"nodeType":"240","messageId":"241","endLine":1487,"endColumn":43},{"ruleId":"238","severity":1,"message":"268","line":1510,"column":9,"nodeType":"240","messageId":"241","endLine":1510,"endColumn":29},{"ruleId":"238","severity":1,"message":"269","line":1515,"column":9,"nodeType":"240","messageId":"241","endLine":1515,"endColumn":29},{"ruleId":"238","severity":1,"message":"270","line":1946,"column":5,"nodeType":"240","messageId":"241","endLine":1946,"endColumn":6},{"ruleId":"238","severity":1,"message":"271","line":2900,"column":7,"nodeType":"240","messageId":"241","endLine":2900,"endColumn":30},{"ruleId":"238","severity":1,"message":"272","line":2901,"column":7,"nodeType":"240","messageId":"241","endLine":2901,"endColumn":30},{"ruleId":"243","replacedBy":"273"},{"ruleId":"245","replacedBy":"274"},{"ruleId":"238","severity":1,"message":"275","line":831,"column":9,"nodeType":"240","messageId":"241","endLine":831,"endColumn":27},{"ruleId":"238","severity":1,"message":"276","line":833,"column":9,"nodeType":"240","messageId":"241","endLine":833,"endColumn":27},{"ruleId":"238","severity":1,"message":"277","line":840,"column":13,"nodeType":"240","messageId":"241","endLine":840,"endColumn":29},{"ruleId":"238","severity":1,"message":"278","line":841,"column":13,"nodeType":"240","messageId":"241","endLine":841,"endColumn":29},{"ruleId":"238","severity":1,"message":"279","line":844,"column":11,"nodeType":"240","messageId":"241","endLine":844,"endColumn":19},{"ruleId":"238","severity":1,"message":"280","line":1200,"column":28,"nodeType":"240","messageId":"241","endLine":1200,"endColumn":41},{"ruleId":"238","severity":1,"message":"281","line":1203,"column":28,"nodeType":"240","messageId":"241","endLine":1203,"endColumn":41},{"ruleId":"238","severity":1,"message":"282","line":1207,"column":11,"nodeType":"240","messageId":"241","endLine":1207,"endColumn":30},{"ruleId":"238","severity":1,"message":"283","line":1216,"column":11,"nodeType":"240","messageId":"241","endLine":1216,"endColumn":30},{"ruleId":"243","replacedBy":"284"},{"ruleId":"245","replacedBy":"285"},{"ruleId":"238","severity":1,"message":"286","line":16,"column":5,"nodeType":"240","messageId":"241","endLine":16,"endColumn":13},{"ruleId":"238","severity":1,"message":"287","line":231,"column":9,"nodeType":"240","messageId":"241","endLine":231,"endColumn":16},{"ruleId":"243","replacedBy":"288"},{"ruleId":"245","replacedBy":"289"},{"ruleId":"243","replacedBy":"290"},{"ruleId":"245","replacedBy":"291"},{"ruleId":"292","severity":1,"message":"293","line":28,"column":6,"nodeType":"294","endLine":28,"endColumn":8,"suggestions":"295"},{"ruleId":"296","severity":1,"message":"297","line":28,"column":9,"nodeType":"298","endLine":34,"endColumn":10},"no-unused-vars","'Router' is defined but never used.","Identifier","unusedVar","'Fixture' is defined but never used.","no-native-reassign",["299"],"no-negated-in-lhs",["300"],"'Route' is defined but never used.","'Routes' is defined but never used.","'Link' is defined but never used.","'reactDom' is defined but never used.","'yesterday' is assigned a value but never used.","'yesterdayFootyStats' is assigned a value but never used.","'historic' is assigned a value but never used.","'historicFootyStats' is assigned a value but never used.","'incrementDate' is defined but never used.","'getHighestScoringLeagues' is defined but never used.","'getLowestScoringLeagues' is defined but never used.",["299"],["300"],"eqeqeq","Expected '!==' and instead saw '!='.","BinaryExpression","unexpected","'shouldOpen' is assigned a value but never used.","'getXGtoActualDifferentialStrength' is defined but never used.","'homeOverallVsAwayOverallComparison' is assigned a value but never used.","'awayOverallVsHomeOverallComparison' is assigned a value but never used.","'pointsComparisonHome' is assigned a value but never used.","'pointsComparisonAway' is assigned a value but never used.","'i' is assigned a value but never used.","'homeComparisonWeighting' is assigned a value but never used.","'awayComparisonWeighting' is assigned a value but never used.",["299"],["300"],"'latestHomeGoalDiff' is assigned a value but never used.","'latestAwayGoalDiff' is assigned a value but never used.","'resultsArrayHome' is assigned a value but never used.","'resultsArrayAway' is assigned a value but never used.","'awayTeam' is assigned a value but never used.","'testArrayHome' is assigned a value but never used.","'testArrayAway' is assigned a value but never used.","'rollingGoalDiffHome' is assigned a value but never used.","'rollingGoalDiffAway' is assigned a value but never used.",["299"],["300"],"'setCount' is assigned a value but never used.","'largest' is assigned a value but never used.",["299"],["300"],["299"],["300"],"react-hooks/exhaustive-deps","React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array.","ArrayExpression",["301"],"jsx-a11y/iframe-has-title","<iframe> elements must have a unique title property.","JSXOpeningElement","no-global-assign","no-unsafe-negation",{"desc":"302","fix":"303"},"Update the dependencies array to be: [fetchData]",{"range":"304","text":"305"},[510,512],"[fetchData]"]