#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2, 3, "Ofast", "inline")
const long long p = 1e9 + 7;
long long n, b[200005], dp[200005][35], ans, m, s, k, inv[200005];
struct node {
  long long x, y;
  inline bool operator<(const node &w) const {
    return x != w.x ? x < w.x : y < w.y;
  }
} a[2005];
inline long long pows(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = ans * x % p;
    x = x * x % p;
    y >>= 1;
  }
  return ans;
}
inline long long C(long long x, long long y) {
  return b[x] * inv[y] % p * inv[x - y] % p;
}
inline long long dis(long long x, long long y) {
  return C(a[y].x - a[x].x + a[y].y - a[x].y, a[y].x - a[x].x);
}
signed main() {
  cin >> n >> m >> k >> s;
  b[0] = inv[0] = 1;
  for (long long i = 1; i <= n + m; i++) b[i] = b[i - 1] * i % p;
  for (long long i = 1; i <= n + m; i++) inv[i] = pows(b[i], p - 2) % p;
  for (long long i = 1; i <= k; i++) cin >> a[i].x >> a[i].y;
  a[++k] = (node){1, 1};
  a[++k] = (node){n, m};
  sort(a + 1, a + k + 1);
  s *= 2;
  dp[1][0] = 1;
  for (register long long i = 2; i <= k; i++) {
    dp[i][1] = dis(1, i);
    for (register long long j = 2; j <= 21; j++)
      for (register long long l = 1; l < i; l++)
        if (a[i].y >= a[l].y)
          (dp[i][j] += ((dp[l][j - 1] - dp[l][j]) * dis(l, i) % p + p) % p) %=
              p;
  }
  for (long long i = 1; i <= 21; i++) {
    s -= s / 2;
    ans = (ans + (dp[k][i] - dp[k][i + 1]) * s % p + p) % p;
  }
  ans = ans * pows(dis(1, k), p - 2) % p;
  printf("%lld", ans);
}
