#include <bits/stdc++.h>
using namespace std;
const long long P = 1000000007;
int n, m, k, s;
long long F[200000][2];
long long dp[2][2001];
long long pre[2001];
inline long long inv(long long a) {
  long long res = 1;
  for (long long b = a, p = P - 2; p > 0; p /= 2, b = b * b % P)
    if (p & 1) res = res * b % P;
  return res;
}
inline long long com(long long a, long long b) {
  return F[a][0] * F[b][1] % P * F[a - b][1] % P;
}
int main() {
  scanf("%d%d%d%d", &n, &m, &k, &s);
  F[0][0] = F[0][1] = 1;
  for (int i = 1; i <= n + m - 2; i++)
    F[i][0] = F[i - 1][0] * i % P, F[i][1] = inv(F[i][0]);
  vector<vector<long long>> a;
  bool flag = false;
  for (int i = 0, r, c; i < k; i++) {
    scanf("%d%d", &r, &c);
    a.push_back({r + c, r, c});
    flag |= a.back() == vector<long long>{2, 1, 1};
  }
  if (!flag) a.push_back({2, 1, 1}), k++;
  sort(a.begin(), a.end());
  memset(pre, 0, sizeof(pre));
  long long ans = 0, cnt = 0;
  if (flag) s = (s + 1) / 2;
  for (int sel = 0; s > 1; s = (s + 1) / 2, sel ^= 1) {
    for (int j = k - 1; j >= 0; j--) {
      long long x = a[j][1], y = a[j][2];
      long long &res = dp[sel][j];
      res = com(n - x + m - y, n - x);
      for (int l = j + 1; l < k; l++)
        if (x <= a[l][1] && y <= a[l][2])
          res = (res + P -
                 com(a[l][1] - x + a[l][2] - y, a[l][1] - x) * dp[sel][l] % P) %
                P;
      res = (res + P - pre[j]) % P;
      pre[j] = (pre[j] + res) % P;
    }
    ans = (ans + s * dp[sel][0] % P) % P;
    cnt = (cnt + dp[sel][0]) % P;
  }
  ans = (ans + com(n - 1 + m - 1, n - 1) + P - cnt) % P;
  ans = ans * inv(com(n - 1 + m - 1, n - 1)) % P;
  printf("%lld\n", ans);
}
