#include <bits/stdc++.h>
using namespace std;
bool vis[4005][4005];
long long dx[] = {0, 1, 1, 2, 2, -1, -1, -2, -2},
          dy[] = {0, 2, -2, 1, -1, 2, -2, 1, -1};
long long ans[505], k, n;
struct node {
  long long x, y, step;
};
inline long long read() {
  long long ret = 0, ff = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') ff = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    ret = (ret << 3) + (ret << 1) + (ch ^ 48);
    ch = getchar();
  }
  return ret * ff;
}
signed main() {
  k = read(), n = read();
  for (long long i = 1; i <= n; i++) {
    long long x = read(), y = read();
    vis[x + 2000][y + 2000] = 1;
  }
  vis[2000][2000] = 1, ans[0] = 1;
  queue<node> q;
  q.push((node){2000, 2000, 0});
  while (!q.empty() && q.front().step < 500) {
    node t = q.front();
    q.pop();
    for (long long i = 1; i <= 8; i++) {
      long long tx = t.x + dx[i], ty = t.y + dy[i];
      if (!vis[tx][ty]) {
        ans[t.step + 1]++;
        vis[tx][ty] = 1;
        q.push((node){tx, ty, t.step + 1});
      }
    }
  }
  if (k <= 500) {
    long long res = 0;
    for (long long i = 0; i <= k; i++) res += ans[i];
    printf("%lld", res);
    return 0;
  } else {
    long long cha = ans[500] - ans[499];
    long long res = 0;
    for (long long i = 0; i < 500; i++) res += ans[i];
    k -= 499;
    k %= 1000000007;
    res =
        (res + ans[500] * k + k * (k - 1) / 2 % 1000000007 * cha) % 1000000007;
    printf("%lld", res);
  }
  return 0;
}
