#include <bits/stdc++.h>
using namespace std;
long long int gcd(long long int a, long long int b) {
  if (!b)
    return a;
  else
    return gcd(b, a % b);
}
vector<long long int> fact;
vector<long long int> ifact;
long long int add(long long int a, long long int b) {
  a += b;
  while (a >= (long long int)(1e9 + 7)) a -= (long long int)(1e9 + 7);
  return a;
}
long long int mult(long long int a, long long int b) {
  return (a * 1LL * b) % (long long int)(1e9 + 7);
}
long long int binpow(long long int a, long long int b) {
  long long int r = 1;
  while (b) {
    if (b & 1) r = mult(r, a);
    a = mult(a, a);
    b >>= 1;
  }
  return r;
}
long long int choose(long long int a, long long int b) {
  if (a < b) return 0;
  if (b == 0) return 1;
  if (a == b) return 1;
  long long int r = mult(ifact[b], ifact[a - b]);
  r = mult(r, fact[a]);
  return r;
}
long long int permute(long long int a, long long int b) {
  long long int res = mult(fact[a], ifact[a - b]);
  return res;
}
long long int inv(int a) { return binpow(a, (long long int)(1e9 + 7) - 2); }
void init(long long int n) {
  fact.clear();
  ifact.clear();
  fact.resize(n + 1);
  ifact.resize(n + 1);
  ifact[0] = 1;
  fact[0] = 1;
  for (int i = 1; i <= n; i++) {
    fact[i] = mult(fact[i - 1], i);
  }
  ifact[n] = inv(fact[n]);
  for (int i = n - 1; i >= 1; i--) {
    ifact[i] = mult(ifact[i + 1], i + 1);
  }
}
int main() {
  int n, m, k, s;
  cin >> n >> m >> k >> s;
  vector<pair<int, int>> p(k);
  init(3 * (n + m));
  for (int i = 0; i < k; i++) cin >> p[i].first >> p[i].second;
  p.push_back({n, m});
  sort(p.begin(), p.end());
  vector<vector<long long int>> dp(k + 1, vector<long long int>(21, 0));
  for (int kk = 0; kk < 20; kk++) {
    for (int i = 0; i <= k; i++) {
      int x = p[i].first, y = p[i].second;
      dp[i][kk] = choose(x + y - 2, x - 1);
      for (int j = 0; j < i; j++) {
        int x1 = p[j].first, y1 = p[j].second;
        if (x >= x1 && y >= y1) {
          dp[i][kk] +=
              (long long int)(1e9 + 7) - (choose(x - x1 + y - y1, x - x1) *
                                          dp[j][kk] % (long long int)(1e9 + 7));
          dp[i][kk] %= (long long int)(1e9 + 7);
        }
      }
      for (int j = 0; j < kk; j++) {
        dp[i][kk] += (long long int)(1e9 + 7) - dp[i][j];
        dp[i][kk] %= (long long int)(1e9 + 7);
      }
    }
  }
  long long int out = choose(n + m - 2, n - 1);
  long long int ans = 0;
  long long int div = inv(out);
  for (int i = 0; i < 20; i++) {
    ans += dp[k][i] * s % (long long int)(1e9 + 7);
    out += (long long int)(1e9 + 7) - dp[k][i];
    out %= (long long int)(1e9 + 7);
    ans %= (long long int)(1e9 + 7);
    s = (s + 1) / 2;
  }
  ans += out;
  cout << ans * div % (long long int)(1e9 + 7) << '\n';
}
