#include <bits/stdc++.h>
using namespace std;
long long powmod(long long base, long long exponent, long long mod) {
  long long result = 1;
  while (exponent > 0) {
    if (exponent % 2 == 0) {
      exponent /= 2;
      base = (base * base) % mod;
    } else {
      result = (result * base) % mod;
      exponent /= 2;
      base = (base * base) % mod;
    }
  }
  return result;
}
bool decresing(long long x, long long y) { return x > y; }
long long trin(long long start, long long stop) {
  return (stop - start + 1) * (stop + start) / 2;
}
bool sortvectorf(pair<long long, long long> a, pair<long long, long long> b) {
  return ((a.first > b.first) || (a.first == b.first && a.second > b.second));
}
bool sortvectorfv(pair<long long, long long> a, pair<long long, long long> b) {
  return ((a.first > b.first) || (a.first == b.first && a.second < b.second));
}
bool sortvectors(pair<long long, long long> a, pair<long long, long long> b) {
  return ((a.second > b.second) || (a.second == b.second && a.first > b.first));
}
bool negasortvectorf(pair<long long, long long> a,
                     pair<long long, long long> b) {
  return ((a.first < b.first) || (a.first == b.first && a.second < b.second));
}
bool negasortvectors(pair<long long, long long> a,
                     pair<long long, long long> b) {
  return ((a.second < b.second) || (a.second == b.second && a.first < b.first));
}
vector<vector<long long>> findPermutations(vector<long long> &a) {
  sort(a.begin(), a.end());
  vector<vector<long long>> sol;
  do {
    sol.push_back(a);
  } while (next_permutation(a.begin(), a.end()));
  return sol;
}
long long gcd(long long a, long long b) {
  if (a == 0) {
    return b;
  }
  if (b == 0) {
    return a;
  }
  return gcd(b % a, a);
}
bool isprime(long long n) {
  for (int i = 2; i < n; i += 1) {
    if (i * i > n) {
      break;
    }
    if ((n / i) * i == n) {
      return false;
    }
  }
  return true;
}
long long fdivisor(long long n, long long fro) {
  for (int i = 1; i < n + 1; i += 1) {
    if ((n / i) * i == n && i >= fro) {
      return i;
    }
  }
  return -1;
}
vector<long long> divlist(long long n) {
  vector<long long> curr;
  for (int i = 2; i < n; i += 1) {
    if ((long long)i * i > n) {
      break;
    }
    if ((n / i) * i == n) {
      curr.push_back(i);
      curr.push_back(n / i);
    }
    if ((long long)i * i == n) {
      curr.pop_back();
    }
  }
  sort(curr.begin(), curr.end());
  return curr;
}
long long digsum(long long num) {
  long long cr = 0;
  while (num > 0) {
    cr += num % 10;
    num /= 10;
  }
  return cr;
}
long long modInverse(long long a, long long b) {
  long long m = b;
  long long y = 0, x = 1;
  while (a > 1) {
    long long q = a / m;
    long long t = m;
    m = a % m, a = t;
    t = y;
    y = x - q * y;
    x = t;
  }
  if (x < 0) {
    x += b;
  }
  return x;
}
long long azeret(long long num, long long mod) {
  long long sil = 1;
  while (num > 1) {
    sil *= num;
    sil %= mod;
    num--;
  }
  return sil;
}
long long moddiv(long long to, long long by, long long mod) {
  to %= mod;
  while (to % by != 0) {
    to += mod;
    if (to > (by + 1) * mod) {
      return -1;
    }
  }
  return (to / by) % mod;
}
pair<long long, long long> func(pair<long long, long long> a,
                                pair<long long, long long> b) {
  if (a.first < b.first) {
    return a;
  }
  if (b.first < a.first) {
    return b;
  }
  return {a.first, (a.second + b.second) % 1000000007};
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long n;
  cin >> n;
  vector<pair<long long, long long>> matrioskas(n);
  set<long long> alls;
  for (int i = 0; i < n; i += 1) {
    cin >> matrioskas[i].second >> matrioskas[i].first;
    alls.insert(matrioskas[i].first);
    alls.insert(matrioskas[i].second);
  }
  alls.insert(0);
  sort(matrioskas.begin(), matrioskas.end(), negasortvectorf);
  vector<long long> ral;
  for (auto it = alls.begin(); it != alls.end(); it++) {
    ral.push_back(*it);
  }
  long long siz = ral.size();
  vector<vector<long long>> cons(siz);
  vector<pair<long long, long long>> pts(siz,
                                         {999999999999999, 99999999999999});
  pts[0] = {0, 1};
  for (int i = 0; i < n; i += 1) {
    long long left, right, mid;
    left = 0;
    right = siz - 1;
    while (right > left) {
      mid = (right + left + 1) / 2;
      if (ral[mid] > matrioskas[i].first) {
        right = mid - 1;
      } else {
        left = mid;
      }
    }
    long long inpart = left;
    left = 0;
    right = siz - 1;
    while (right > left) {
      mid = (right + left + 1) / 2;
      if (ral[mid] > matrioskas[i].second) {
        right = mid - 1;
      } else {
        left = mid;
      }
    }
    long long outpart = left;
    cons[inpart].push_back(outpart);
  }
  for (int i = 1; i < siz; i += 1) {
    pair<long long, long long> ptt = pts[i - 1];
    ptt.first += ral[i] - ral[i - 1];
    pts[i] = func(pts[i], ptt);
    for (int ii = 0; ii < cons[i].size(); ii += 1) {
      pts[cons[i][ii]] = func(pts[i], pts[cons[i][ii]]);
    }
  }
  pair<long long, long long> ans = {999999999999999, 99999999999999};
  for (int i = siz - 1; i >= 0; i += -1) {
    if (cons[i].size() > 0) {
      break;
    }
    ans = func(ans, pts[i]);
  }
  cout << ans.second << endl;
  return 0;
}
