Home » Football » Ranheim vs Asane

Ranheim vs Asane

Expert Opinion on Ranheim vs Asane

The upcoming match between Ranheim and Asane on September 13, 2025, at 14:00 promises to be a thrilling encounter. Based on historical data and current team form, several betting predictions can be made. Ranheim has shown a tendency to score in the second half, while Asane has been consistent in maintaining a strong defense. This match is expected to have a moderate number of goals with a slight edge towards an attacking game.

Ranheim

WDDLL
-

Asane

LDLDW
Date: 2025-09-13
Time: 14:00
(FT)
Venue: Extra Arena
Score: 5-2

Predictions:

MarketPredictionOddResult
Under 5.5 Cards87.00%(5-2)
Over 1.5 Goals88.20%(5-2) 1.20
Both Teams Not To Score In 1st Half82.30%(5-2) 2-1 1H 1.22
Under 4.5 Cards79.50%(5-2)
Away Team Not To Score In 1st Half77.10%(5-2)
Home Team Not To Score In 1st Half70.80%(5-2)
Last Goal 73+ Minutes74.50%(5-2) 80' min 1.83
Over 0.5 Goals HT74.80%(5-2) 2-1 1H 1.30
Away Team To Score In 2nd Half70.20%(5-2)
Both Teams To Score65.80%(5-2) 1.62
Both Teams Not To Score In 2nd Half65.10%(5-2) 3-1 2H 1.40
Goal In Last 15 Minutes65.30%(5-2)
Home Team To Score In 2nd Half61.70%(5-2)
Sum of Goals 2 or 361.10%(5-2) 2.05
Over 2.5 Goals59.80%(5-2) 1.65
First Goal 30+ Minutes56.10%(5-2)
Avg. Total Goals2.73%(5-2)
Yellow Cards2.27%(5-2)
Avg. Conceded Goals2.07%(5-2)
Avg. Goals Scored2.15%(5-2)
Red Cards0.75%(5-2)

Under 5.5 Cards

With an average of 2.27 yellow cards per match and 0.75 red cards, the likelihood of under 5.5 cards occurring is high at 87.00.

Over 1.5 Goals

Given the average total goals of 2.73 per game, betting on over 1.5 goals seems favorable with odds at 88.20.

Both Teams Not To Score In 1st Half

The defensive strategies employed by both teams suggest that both teams not scoring in the first half is plausible, with odds at 82.30.

Under 4.5 Cards

Considering the discipline shown by both teams, under 4.5 cards is likely, with odds at 79.50.

Away Team Not To Score In 1st Half

Ranheim’s home advantage and defensive capabilities make it likely that the away team will not score in the first half, with odds at 77.10.

Home Team Not To Score In 1st Half

Asane’s strong defensive record suggests they might not score in the first half, with odds at 70.80.

Last Goal After 73 Minutes

Historically, late goals are common in these fixtures, making last goal after the 73rd minute a good bet at odds of 74.50.

Over 0.5 Goals HT

With an average of over two goals per game, expecting more than half a goal by halftime is reasonable, with odds at 74.80.

Away Team To Score In Second Half

Asane often finds opportunities in the latter stages of the game, making this prediction likely with odds at 70.20.

Both Teams To Score

Given both teams’ attacking capabilities, both scoring is a strong possibility with odds at 65.80.

Both Teams Not To Score In Second Half

This scenario seems less likely given the attacking trends of both teams, with odds at 65.10.

Goal In Last 15 Minutes

The dynamic nature of this match suggests a goal in the last quarter is possible, with odds at 65.30.

Home Team To Score In Second Half

Ranheim’s home advantage and tendency to score later in games make this prediction viable at odds of 61.70.

Sum of Goals: Two or Three

The average goals scored suggest that two or three goals are likely for this match, with odds at 61.10.

Over 2.5 Goals

The attacking nature of both teams supports a higher goal tally, making over 2.5 goals probable at odds of 59.80.

zhangjiaqian/vscode-leetcode/src/leetcode/common/util.ts
import * as vscode from ‘vscode’;
import { leetcode } from ‘../extension’;
import { getLeetcode } from ‘./leetcode’;

export async function getWorkspaceDir(): Promise {
const workspaceFolder = vscode.workspace.workspaceFolders;
if (workspaceFolder) {
return workspaceFolder[0].uri.fsPath;
}
}

export async function getLeetcodeConfig(): Promise<Record> {
const workspaceDir = await getWorkspaceDir();
if (workspaceDir) {
const configPath = `${workspaceDir}/leetcode.json`;
if (fs.existsSync(configPath)) {
try {
return JSON.parse(fs.readFileSync(configPath));
} catch (e) {
vscode.window.showErrorMessage(`Invalid leetcode.json file: ${e}`);
}
}
}
return {};
}

export async function getCookie(): Promise {
const config = await getLeetcodeConfig();
return config.cookie;
}

export async function getCookieFromLeetcode(): Promise {
const leetcodeInstance = await getLeetcode();
if (!leetcodeInstance) return undefined;
return leetcodeInstance.cookie;
}

export function getProblemUrl(problemId: number): string {
return `https://leetcode.com/problems/${problemId}`;
}

export async function openProblem(problemId: number): Promise {
const url = getProblemUrl(problemId);
vscode.env.openExternal(vscode.Uri.parse(url));
}

export function getLocalFile(path: string): vscode.Uri {
return vscode.Uri.file(path);
}

export function getFileContent(uri: vscode.Uri): string | undefined {
try {
return fs.readFileSync(uri.fsPath).toString();
} catch (e) {
vscode.window.showErrorMessage(`Can’t read file ${uri.fsPath}: ${e}`);
}
}

export function saveFileContent(uri: vscode.Uri, content: string): void {
fs.writeFileSync(uri.fsPath, content);
}

const fs = require(‘fs’);
const path = require(‘path’);

export async function copyFile(from: vscode.Uri | string | Buffer | null | undefined, to: vscode.Uri | string): Promise;
export async function copyFile(from: vscode.Uri | string | Buffer | null | undefined, to: vscode.Uri | string, options?: { overwrite?: boolean }): Promise;
async function copyFile(from: any, to: any, options?: { overwrite?: boolean }): Promise {
if (!from || !to) return;
if (!options) options = {};
options.overwrite = options.overwrite || false;
if (typeof from === ‘string’) from = vscode.Uri.file(from);
if (typeof to === ‘string’) to = vscode.Uri.file(to);
if (!(from instanceof vscode.Uri)) return;
if (!(to instanceof vscode.Uri)) return;

let existsTo = false;
try {
existsTo = fs.statSync(to.fsPath).isFile();
} catch (e) {
existsTo = false;
}
if (existsTo && !options.overwrite) return;

if (from.scheme === ‘file’) {
let data;
try {
data = fs.readFileSync(from.fsPath);
} catch (e) {
vscode.window.showErrorMessage(`Can’t read file ${from.fsPath}: ${e}`);
return;
}
fs.mkdirSync(path.dirname(to.fsPath), { recursive: true });
fs.writeFileSync(to.fsPath, data);
} else if (from.scheme === ‘untitled’) {
let data;
try {
data = await from.with({ scheme: ‘file’ }).read();
} catch (e) {
vscode.window.showErrorMessage(`Can’t read file ${from.toString()}: ${e}`);
return;
}
fs.mkdirSync(path.dirname(to.fsPath), { recursive: true });
fs.writeFileSync(to.fsPath, data);
} else if (from instanceof Buffer) {
fs.mkdirSync(path.dirname(to.fsPath), { recursive: true });
fs.writeFileSync(to.fsPath, from);
}
}
zhangjiaqian/vscode-leetcode/src/leetcode/common/leetcode.ts
import * as vscode from ‘vscode’;
import axios from ‘axios’;
import * as cheerio from ‘cheerio’;
import * as _ from ‘lodash’;
import * as path from ‘path’;

import { ProblemInfo } from ‘../extension’;
import { UserStatus } from ‘./user’;

const COOKIE_KEY_NAME = ‘__cfduid’;
const LEETCODE_COOKIE_KEY_NAME = ‘LEETCODE_SESSION’;
const LOGIN_URL = ‘https://leetcode.com/accounts/login/’;
const USER_URL = ‘https://leetcode.com/accounts/user/’;
const PROBLEM_URL_PREFIX = ‘https://leetcode.com/problems/’;
const STATUS_URL_PREFIX = ‘https://leetcode.com/api/submissions/status/’;

let leetcodeInstance: LeetcodeClient;

export async function getLeetcode(): Promise;
export async function getLeetcode(overwriteCookie?: boolean): Promise;
async function getLeetcode(overwriteCookie?: boolean): Promise {

const cookieKeyNames =
[COOKIE_KEY_NAME,
LEETCODE_COOKIE_KEY_NAME];

if (!overwriteCookie && leetcodeInstance && leetcodeInstance.cookie && cookieKeyNames.every(key => leetcodeInstance.cookie.includes(key))) return leetcodeInstance;

let cookieStr = ”;
for (const keyName of cookieKeyNames) {
const cookiesStrArry =
Object.entries(
document.cookie.split(‘;’).map(x => x.trim())
).filter(x => x[0].startsWith(keyName));
if (!cookiesStrArry.length) continue;

for (const [cookieKey] of cookiesStrArry) {
const cookieVal =
decodeURIComponent(cookiesStrArry[0][1]);
if (!cookieStr.length)
cookieStr += `${cookieKey}=${cookieVal};`;
else
cookieStr += `;${cookieKey}=${cookieVal};`;
}
break;
}

if (!cookieStr.length) return;

const axiosInstance =
axios.create({
baseURL:
LOGIN_URL,
headers:
{ Cookie:
cookieStr }
});

try {

const res =
await axiosInstance.get(USER_URL);

if (
res.data &&
res.data.username
) {

const $ =
cheerio.load(
res.data
);

const userStatusHtmlElm =
$(‘#user_status’);

const userStatusElmArry =
userStatusHtmlElm &&
userStatusHtmlElm.children();

const userStatusElm =
userStatusElmArry &&
userStatusElmArry[0];

const userStatusJsonStr =
userStatusElm &&
$(userStatusElm).attr(‘data-user-status’);

let userStatusObj:
UserStatus =
null;

if (
typeof userStatusJsonStr === ‘string’
) {

try {

userStatusObj =
JSON.parse(
userStatusJsonStr
);

} catch (_err) {

console.log(
`Failed to parse User Status JSON Str`
);

}

}

const leetCodeClient =
new LeetcodeClient(
userStatusObj,
res.headers[‘set-cookie’],
res.headers[‘x-csrftoken’]
);

return leetCodeClient;

}

return;

} catch (_err) {

console.log(
`Error when trying to create LeetCode Client`
);

return;

}

}

class LeetcodeClient {

private readonly _statusCache: Map;

constructor(private readonly _userStatus?: UserStatus,
private readonly _cookie?: string[],
private readonly _csrfToken?: string) {

this._statusCache =
new Map();

this._refreshUserStatus();

setInterval(
() => this._refreshUserStatus(),
ms(’15min’)
);

setInterval(
() => this._refreshProblemCache(),
ms(‘3min’)
);

setInterval(
() => this._updateProblemCache(),
ms(‘1min’)
);

setInterval(
() => this._updateSubmissionCache(),
ms(’30sec’)
);

setInterval(
() => this._updateAcceptanceRateCache(),
ms(‘3min’)
);

setInterval(
() => this._updateDifficultyCache(),
ms(‘3min’)
);

setInterval(
() => this._updateAcceptedCodeCache(),
ms(‘3min’)
);

setInterval(
() => this._updateTagsCache(),
ms(‘3min’)
);

setInterval(
() => this._updateQuestionMetaCache(),
ms(‘3min’)
);

setInterval(
() => this._updateSolutionsCache(),
ms(‘3min’)
);

setInterval(
() => this._updateSolutionTitlesCache(),
ms(‘3min’)
);

this._statusCache.set(-1,
new ProblemInfo({
id:
-1,
title:
”,
status:
”,
lang:
”,
runtime:
”,
timeCost:
”,
memoryCost:

}));

this._statusCache.set(-100,
new ProblemInfo({
id:
-100,
title:
”,
status:
”,
lang:
”,
runtime:
”,
timeCost:
”,
memoryCost:

}));

this._statusCache.set(-101,
new ProblemInfo({
id:
-101,
title:
”,
status:
”,
lang:
”,
runtime:
”,
timeCost:
”,
memoryCost:

}));

}

get cookie(): string[] {

return [
…this._cookie
];

}

public async getStatus(problemIdList?: number[]): Promise<Map> {

problemIdList =
problemIdList &&
Array.isArray(problemIdList)
? problemIdList
: [];

if (
!problemIdList.length
) {

return new Map(this._statusCache);

}

let statusMap =
new Map(this._statusCache);

for (
let i = problemIdList.length -1 ;
i >=0 ;
i —
) {

let problemId =
problemIdList[i];

if (
!problemId ||
!Number.isInteger(problemId)
) continue;

let problemInfo =
statusMap.get(problemId);

if (
!problemInfo ||
problemInfo.id !== problemId ||
problemInfo.status !== ”
) {

const [problemInfo] =
await this.fetchProblemInfo(problemId);

statusMap.set(problemId,
problemInfo);

}

}

return statusMap;

}

private async fetchProblemInfo(problemId: number): Promise {

if (
!problemId ||
!Number.isInteger(problemId)
) {

return [null,
null];

}

const url =
`${STATUS_URL_PREFIX}${problemId}`;

try {

const res =
await axios.get(url,
{ headers:
{ Cookie:
[…this.cookie],
‘X-CSRFToken’:
this.csrfToken
}
});

if (
res.status !==
axios.codes.ok
) {

console.log(
`Failed to fetch Status for Problem ID ${problemId}`
);

return [problemId,
null];

}

const $ =
cheerio.load(res.data);

let problemInfo:

ProblemInfo |
null |
undefined =

null;

let statusElm =

$(‘#status’);

if (
statusElm &&
statusElm.length >0
) {

const $statusHtmlElmArry =

$(statusElm).children();

if (
$statusHtmlElmArry &&
$statusHtmlElmArry.length >0
) {

const $statusHtmlElm =

$($statusHtmlElmArry[0]);

if (
$statusHtmlElm &&
$statusHtmlElm.attr(‘data-submission-id’)
) {

problemInfo =

new ProblemInfo({
id:
Number.parseInt($statusHtmlElm.attr(‘data-problem-id’)),
title:
$statusHtmlElm.attr(‘data-problem-title’),
status:
$statusHtmlElm.attr(‘data-submission-state’),
lang:

$statusHtmlElm.attr(‘data-submission-language’),
runtime:

$statusHtmlElm.attr(‘data-runtime’),
timeCost:

$statusHtmlElm.attr(‘data-time-cost’),
memoryCost:

$statusHtmlElm.attr(‘data-memory-cost’)

});

} else {

console.log(
`Failed to parse Status HTML Element for Problem ID ${problemId}`
);

problemInfo =

null;

}

} else {

console.log(
`No Children Elements found for Status HTML Element for Problem ID ${problemId}`
);

problemInfo =

null;

}

} else {

console.log(
`No Status HTML Element found for Problem ID ${problemId}`
);

problemInfo =

null;

}

return [problemId,
problemInfo];

} catch (_err) {

console.log(
`Error when fetching Status for Problem ID ${problemId}`
);

return [problemId,
null];

}

}

get csrfToken(): string | undefined {

return [
…this._csrfToken
]?.[0]?.split(‘=’)[1];

}

private async _refreshUserStatus(): Promise {

try {

const res =
await axios.get(USER_URL,
{ headers :
{ Cookie :
[…this.cookie],
‘X-CSRFToken’ :
this.csrfToken }});

if (
res.data &&
res.data.username
) {

const $ =