#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 123;
const int md = 1e9 + 7;
int n, m, k, s;
int frac[maxn], invFrac[maxn];
pair<int, int> a[3000];
int pwr(int a, int n) {
  int res = 1;
  while (n) {
    if (n & 1) res = 1LL * res * a % md;
    n >>= 1;
    a = 1LL * a * a % md;
  }
  return res;
}
void initFrac() {
  frac[0] = 1;
  for (int i = 1, _b = 200000; i <= _b; ++i)
    frac[i] = 1LL * frac[i - 1] * i % md;
  for (int i = 0, _b = 200000; i <= _b; ++i) invFrac[i] = pwr(frac[i], md - 2);
}
int C(int n, int k) {
  return 1LL * frac[n] * invFrac[k] % md * invFrac[n - k] % md;
}
int waysMove(int x, int y) { return C(x + y, y); }
void ReadData() {
  cin >> n >> m >> k >> s;
  for (int i = 1, _b = k; i <= _b; ++i) cin >> a[i].first >> a[i].second;
  sort(a + 1, a + 1 + k);
}
int dp[2005][23];
const int lg = 22;
void doSub(int &a, const int &b) {
  a -= b;
  if (a < 0) a += md;
}
int p[23];
void Process() {
  initFrac();
  memset(dp, 0, sizeof(dp));
  dp[1][1] = waysMove(a[1].first - 1, a[1].second - 1);
  for (int i = 2, _b = k; i <= _b; ++i) {
    for (int j = 1, _b = lg; j <= _b; ++j) {
      dp[i][j] = waysMove(a[i].first - 1, a[i].second - 1);
      for (int x = 1, _b = i - 1; x <= _b; ++x)
        if (a[x].first <= a[i].first && a[x].second <= a[i].second) {
          int z = waysMove(a[i].first - a[x].first, a[i].second - a[x].second);
          doSub(dp[i][j], 1LL * dp[x][j] * z % md);
        }
      for (int k = 0, _b = j - 1; k <= _b; ++k) doSub(dp[i][j], dp[i][k]);
    }
  }
  for (int i = 0, _b = lg; i <= _b; ++i) {
    p[i] = waysMove(n - 1, m - 1);
    for (int j = 1, _b = k; j <= _b; ++j) {
      doSub(p[i], 1LL * waysMove(n - a[j].first, m - a[j].second) *
                      dp[j][i + 1] % md);
    }
    for (int j = 0, _b = i - 1; j <= _b; ++j) doSub(p[i], p[j]);
  }
  int res = 0;
  int total = waysMove(n - 1, m - 1);
  int invTotal = pwr(total, md - 2);
  for (int i = 0, _b = lg; i <= _b; ++i) {
    doSub(total, p[i]);
    res = (res + 1LL * p[i] * s % md % md) % md;
    s -= s / 2;
  }
  res = (res + total) % md;
  res = 1LL * res * invTotal % md;
  cout << res << endl;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  ReadData();
  Process();
  return 0;
}
