#include <bits/stdc++.h>
using namespace std;
int n, m, k, s, y, x;
long long P;
long long f[200007];
long long dp[2007][25];
long long dpc[2007][25];
vector<pair<int, int> > c;
long long ile[2007][2007];
long long add[27];
long long pot(long long a, int w) {
  long long res = 1;
  for (int i = 0; i < 31; ++i) {
    if (w & (1 << i)) res = (res * a) % 1000000007;
    a = (a * a) % 1000000007;
  }
  return res;
}
long long dziel(long long a, long long b) {
  return ((a % 1000000007) * pot(b % 1000000007, 1000000007 - 2)) % 1000000007;
}
int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  f[0] = 1;
  for (int i = 1; i < 200007; ++i) {
    f[i] = (f[i - 1] * i) % 1000000007;
  }
  cin >> n >> m >> k >> s;
  add[0] = s;
  for (int i = 1; i <= 25; ++i) {
    add[i] = (add[i - 1] + 1) / 2;
  }
  for (int i = 1; i <= k; ++i) {
    cin >> y >> x;
    c.emplace_back(y, x);
  }
  k += 2;
  c.emplace_back(1, 1);
  c.emplace_back(n, m);
  sort((c).begin(), (c).end());
  for (int i = 0; i < k; ++i) {
    for (int j = i + 1; j < k; ++j) {
      if (c[j].second >= c[i].second)
        ile[i][j] =
            dziel(f[c[j].first - c[i].first + c[j].second - c[i].second],
                  f[c[j].first - c[i].first] * f[c[j].second - c[i].second]);
    }
  }
  for (int i = 0; i < k; ++i) {
    dpc[i][1] = dziel(f[c[i].first - 1 + c[i].second - 1],
                      f[c[i].first - 1] * f[c[i].second - 1]);
  }
  for (int l = 2; l < 25; ++l) {
    for (int i = 0; i < k; ++i) {
      for (int j = 0; j < i; ++j) {
        dpc[i][l] = (dpc[i][l] + ile[j][i] * dp[j][l - 1]) % 1000000007;
      }
      dp[i][l - 1] = (dpc[i][l - 1] - dpc[i][l] + 1000000007) % 1000000007;
    }
  }
  for (int i = 2; i < 24; ++i) {
    P = (P + add[i - 2] * dp[k - 1][i]) % 1000000007;
  }
  P = (P + add[22] * dpc[k - 1][24]) % 1000000007;
  cout << dziel(P, dziel(f[n - 1 + m - 1], f[n - 1] * f[m - 1]));
}
