#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 10;
const long long inf = 1ll << 60;
const long long mod = 1e9 + 7;
void GG() {
  cout << "0\n";
  exit(0);
}
long long mpow(long long a, long long n, long long mo = mod) {
  long long re = 1;
  while (n > 0) {
    if (n & 1) re = re * a % mo;
    a = a * a % mo;
    n >>= 1;
  }
  return re;
}
long long inv(long long b, long long mo = mod) {
  if (b == 1) return b;
  return (mo - mo / b) * inv(mo % b, mo) % mo;
}
const int maxn = 1e6 + 5;
long long dp[2003][22];
long long fac[200006], ifac[200006];
inline long long CC(int a, int b) {
  a = a + b;
  return fac[a] * ifac[b] % mod * ifac[a - b] % mod;
}
int R[2003], C[2003];
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  ;
  fac[0] = ifac[0] = 1;
  for (int i = 1; i <= 200006; ++i) {
    fac[i] = fac[i - 1] * i % mod;
    ifac[i] = inv(fac[i]);
  }
  int n, m, k, second;
  cin >> n >> m >> k >> second;
  vector<pair<int, int> > v;
  v.push_back({1, 1});
  v.push_back({n, m});
  for (int i = 0; i < k; ++i) {
    int r, c;
    cin >> r >> c;
    v.push_back({r, c});
  }
  sort(v.begin(), v.end());
  for (int i = 1; i <= (int)v.size() - 1; ++i) {
    R[i] = v[i].first, C[i] = v[i].second;
    dp[i][0] = CC(R[i] - 1, C[i] - 1);
    for (int fk = 0; fk < 21; ++fk) {
      for (int j = 1; j <= i - 1; ++j) {
        if (R[j] <= R[i] && C[j] <= C[i]) {
          dp[i][fk] -= dp[j][fk] * CC(R[i] - R[j], C[i] - C[j]) % mod;
          if (dp[i][fk] < 0) dp[i][fk] += mod;
          dp[i][fk + 1] += dp[j][fk] * CC(R[i] - R[j], C[i] - C[j]) % mod;
          if (dp[i][fk + 1] >= mod) dp[i][fk + 1] -= mod;
        }
      }
    }
  }
  long long re = 0;
  for (int fk = 0; fk < 22; ++fk) {
    re += dp[(int)v.size() - 1][fk] * second % mod;
    second = (second + 1) / 2;
  }
  cout << re * inv(CC(n - 1, m - 1)) % mod << '\n';
}
