#include <bits/stdc++.h>
#define int long long
#define mk make_pair
#define pb emplace_back
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (! isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); }
while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getchar(); }
return x * f;
}
const int maxn = 5e5 + 10, maxN = maxn * 5;
int n, en, tot, cnt, nodes; stack<int> st; queue<int> q;
int bel[maxN], h[maxN], in[maxN], dfn[maxN], low[maxN], pos[maxn], l[maxn], r[maxn];
int ll[maxN], rr[maxN];
struct Node { int u, v, nxt; } e[maxN << 2];
void add_edge(int u, int v) { e[++ en] = Node {u, v, h[u]}, h[u] = en; }
int bld(int p, int l, int r) {
nodes = max(nodes, p + n); if (l == r) return pos[l] = p + n; int mi = l + r >> 1;
add_edge(p + n, bld(p << 1, l, mi)), add_edge(p + n, bld(p << 1 | 1, mi + 1, r)); return p + n;
}
void add(int p, int l, int r, int x, int y, int u) {
if (x <= l && r <= y) return add_edge(u, p + n), void();
int mi = l + r >> 1;
if (x <= mi) add(p << 1, l, mi, x, y, u);
if (mi < y) add(p << 1 | 1, mi + 1, r, x, y, u);
}
void dfs(int u) {
low[u] = dfn[u] = ++ tot, st.push(u), in[u] = 1;
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].v;
if (!dfn[v]) dfs(v), low[u] = min(low[u], low[v]);
else if (in[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
int p; cnt ++; do { p = st.top(), st.pop(), in[p] = 0, bel[p] = cnt;
if (p <= n) l[cnt] = min(l[cnt], ll[p]), r[cnt] = max(r[cnt], rr[p]); } while (p != u);
}
}
signed main() {
n = read(), l[n + 1] = 2e18;
for (int i = 1; i <= n; i ++) l[i] = read(), r[i] = read();
bld(1, 1, n);
for (int i = 1; i <= n; i ++) add_edge(i, pos[i]), add_edge(pos[i], i);
for (int i = 1; i <= n; i ++) {
ll[i] = lower_bound(l + 1, l + n + 1, l[i] - r[i]) - l,
rr[i] = upper_bound(l + 1, l + n + 1, l[i] + r[i]) - l - 1;
add(1, 1, n, ll[i], rr[i], i);
}
for (int i = 1; i <= n; i ++) l[i] = n + 1, r[i] = 0;
for (int i = 1; i <= nodes; i ++) if (!dfn[i]) dfs(i);
for (int i = 1; i <= nodes; i ++) in[i] = h[i] = 0;
int L = en; en = 0; assert(cnt <= n);
for (int i = 1; i <= L; i ++) { int u = e[i].u, v = e[i].v;
if (bel[v] ^ bel[u]) add_edge(bel[v], bel[u]), in[bel[u]] ++; }
for (int i = 1; i <= cnt; i ++) if (!in[i]) q.push(i);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].v;
l[v] = min(l[v], l[u]), r[v] = max(r[v], r[u]);
if (-- in[v] == 0) q.push(v);
}
}
int ans = 0;
for (int i = 1; i <= n; i ++)
(ans += 1ll * (r[bel[i]] - l[bel[i]] + 1) * i) %= (int)(1e9 + 7);
printf("%lld\n", ans);
return 0;
}