#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
inline long long int add(long long int a, long long int b) {
  return (a + b) >= mod ? a + b - mod : a + b;
}
inline long long int sub(long long int a, long long int b) {
  return add(a, mod - b);
}
inline long long int mul(long long int a, long long int b) {
  return (a * b) % mod;
}
long long int bigMod(long long int n, long long int r) {
  if (r == 0) return 1LL;
  long long int ret = bigMod(n, r / 2);
  ret = mul(ret, ret);
  if (r & 1) ret = mul(ret, n);
  return ret;
}
const int maxn = 200005;
long long int fact[maxn], inv[maxn];
void PreProcess() {
  fact[0] = inv[0] = 1;
  for (int i = 1; i < maxn; i++) fact[i] = mul(fact[i - 1], i);
  inv[maxn - 1] = bigMod(fact[maxn - 1], mod - 2);
  for (int i = maxn - 2; i >= 1; i--) inv[i] = mul(inv[i + 1], i + 1);
}
long long int nCr(int n, int r) {
  if (n < r) return 0;
  long long int down = mul(inv[r], inv[n - r]);
  return mul(fact[n], down);
}
const int LOG = 21;
const int maxk = 2005;
long long int score[LOG];
long long int csum[maxk];
long long int ways[maxk][LOG];
int order[maxk];
int x[maxk], y[maxk];
int main() {
  PreProcess();
  int n, m, c, s;
  scanf("%d %d %d %d", &n, &m, &c, &s);
  int e = 0;
  int k = 0;
  for (int i = 1; i <= c; i++) {
    int xx, yy;
    scanf("%d %d", &xx, &yy);
    if (xx == 1 && yy == 1)
      e++;
    else if (xx == n && yy == m)
      e++;
    else {
      k++;
      x[k] = xx, y[k] = yy;
    }
  }
  k++;
  x[k] = n, y[k] = m;
  for (int i = 1; i <= k; i++) order[i] = i;
  sort(order + 1, order + k + 1, [&](int i, int j) {
    int mni = min(x[i], y[i]);
    int mnj = min(x[j], y[j]);
    if (mni == mnj) return max(x[i], y[i]) < max(x[j], y[j]);
    return mni < mnj;
  });
  score[0] = s;
  for (int i = 1; i < LOG; i++) score[i] = (score[i - 1] + 1) / 2;
  for (int block = 0; block < LOG; block++) {
    for (int ii = 1; ii <= k; ii++) {
      int i = order[ii];
      ways[i][block] = nCr(x[i] - 1 + y[i] - 1, x[i] - 1);
      ways[i][block] = sub(ways[i][block], csum[i]);
      for (int jj = 1; jj < ii; jj++) {
        int j = order[jj];
        if (x[j] > x[i]) continue;
        if (y[j] > y[i]) continue;
        long long int here =
            mul(ways[j][block], nCr(x[i] - x[j] + y[i] - y[j], x[i] - x[j]));
        ways[i][block] = sub(ways[i][block], here);
      }
      csum[i] = add(csum[i], ways[i][block]);
    }
  }
  long long int ans = 0;
  for (int block = 0; block < LOG; block++) {
    int off = min(LOG - 1, block + e);
    ans = add(ans, mul(score[off], ways[k][block]));
  }
  long long int tot = nCr(n - 1 + m - 1, n - 1);
  ans = add(ans, sub(tot, csum[k]));
  ans = mul(ans, bigMod(tot, mod - 2));
  printf("%lld", ans);
}
