#include <bits/stdc++.h>
using namespace std;
const int inf = 987654321;
const long long int INF = 123456789987654321;
const long long int mod = 1000000007;
vector<long long int> pw;
void get_pw() {
  pw.resize(10000);
  pw[0] = 1;
  for (int i = 1; i < 10000; i++) {
    pw[i] = pw[i - 1] * 2 % mod;
  }
}
int N;
vector<pair<int, int> > P;
pair<int, int> bottom_left;
int bottom_left_sum;
void get_bottom_left() {
  bottom_left = pair<int, int>(inf, inf);
  for (int i = 0; i < N; i++) {
    if (bottom_left.first + bottom_left.second > P[i].first + P[i].second) {
      bottom_left = P[i];
    }
  }
  bottom_left_sum = bottom_left.first + bottom_left.second;
}
vector<pair<int, int> > tmp;
int get_max_dist() {
  int ret = -inf;
  int maxi = -inf, mini = inf;
  for (int i = 0; i < tmp.size(); i++) {
    maxi = max(maxi, tmp[i].second + tmp[i].first);
    mini = min(mini, tmp[i].second + tmp[i].first);
  }
  ret = max(ret, maxi - mini);
  maxi = -inf, mini = inf;
  for (int i = 0; i < tmp.size(); i++) {
    maxi = max(maxi, tmp[i].second - tmp[i].first);
    mini = min(mini, tmp[i].second - tmp[i].first);
  }
  ret = max(ret, maxi - mini);
  return ret;
}
bool f(int x) {
  int maxi = -inf, mini = inf;
  for (int i = 0; i < N; i++) {
    if (P[i].second + P[i].first > bottom_left_sum + x) continue;
    maxi = max(maxi, P[i].second - P[i].first);
    mini = min(mini, P[i].second - P[i].first);
  }
  if (1) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + x ||
          P[i].second - P[i].first > mini + x) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= x) return true;
  }
  if (2) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + x ||
          P[i].second - P[i].first < maxi - x) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= x) return true;
  }
  return false;
}
int ans;
long long int ans_cnt;
vector<int> left1, right1, left2, right2;
void get_ans_cnt() {
  int maxi = -inf, mini = inf;
  for (int i = 0; i < N; i++) {
    if (P[i].second + P[i].first > bottom_left_sum + ans) continue;
    maxi = max(maxi, P[i].second - P[i].first);
    mini = min(mini, P[i].second - P[i].first);
  }
  if (1) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + ans ||
          P[i].second - P[i].first > mini + ans) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= ans) {
      int maxi2 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi2 = max(maxi2, tmp[i].second + tmp[i].first);
      }
      maxi2 = max(maxi2, bottom_left_sum + ans);
      int maxi3 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi3 = max(maxi3, tmp[i].second - tmp[i].first);
      }
      int mini2 = inf;
      for (int i = 0; i < tmp.size(); i++) {
        mini2 = min(mini2, tmp[i].second - tmp[i].first);
      }
      if (mini2 < mini) {
        maxi3 = mini2 + ans;
      } else {
        maxi3 = max(maxi3, mini + ans);
      }
      int cnt = 0;
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first <= bottom_left_sum + ans &&
            P[i].second - P[i].first <= mini + ans) {
          if (maxi2 >= P[i].second + P[i].first &&
              P[i].second + P[i].first >= maxi2 - ans) {
            if (maxi3 >= P[i].second - P[i].first &&
                P[i].second - P[i].first >= maxi3 - ans)
              cnt++;
          }
        }
      }
      ans_cnt += pw[cnt];
      ans_cnt %= mod;
      for (int i = 0; i < N; i++) {
        if (maxi2 >= P[i].second + P[i].first &&
            P[i].second + P[i].first >= maxi2 - ans) {
          if (maxi3 >= P[i].second - P[i].first &&
              P[i].second - P[i].first >= maxi3 - ans)
            continue;
        }
        left1.push_back(i);
      }
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first > bottom_left_sum + ans ||
            P[i].second - P[i].first > mini + ans) {
          right1.push_back(i);
        }
      }
    }
  }
  if (2) {
    tmp.clear();
    for (int i = 0; i < N; i++) {
      if (P[i].second + P[i].first > bottom_left_sum + ans ||
          P[i].second - P[i].first < maxi - ans) {
        tmp.push_back(P[i]);
      }
    }
    if (get_max_dist() <= ans) {
      int maxi2 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi2 = max(maxi2, tmp[i].second + tmp[i].first);
      }
      int mini2 = inf;
      for (int i = 0; i < tmp.size(); i++) {
        mini2 = min(mini2, tmp[i].second - tmp[i].first);
      }
      int maxi3 = -inf;
      for (int i = 0; i < tmp.size(); i++) {
        maxi3 = max(maxi3, tmp[i].second - tmp[i].first);
      }
      if (maxi < maxi3) {
        mini2 = maxi3 - ans;
      } else {
        mini2 = min(mini2, maxi - ans);
      }
      int cnt = 0;
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first <= bottom_left_sum + ans &&
            P[i].second - P[i].first >= maxi - ans) {
          if (maxi2 >= P[i].second + P[i].first &&
              P[i].second + P[i].first >= maxi2 - ans) {
            if (mini2 <= P[i].second - P[i].first &&
                P[i].second - P[i].first <= mini2 + ans)
              cnt++;
          }
        }
      }
      for (int i = 0; i < N; i++) {
        if (maxi2 >= P[i].second + P[i].first &&
            P[i].second + P[i].first >= maxi2 - ans) {
          if (mini2 <= P[i].second - P[i].first &&
              P[i].second - P[i].first <= mini2 + ans)
            continue;
        }
        left2.push_back(i);
      }
      for (int i = 0; i < N; i++) {
        if (P[i].second + P[i].first > bottom_left_sum + ans ||
            P[i].second - P[i].first < maxi - ans) {
          right2.push_back(i);
        }
      }
      int ok = 1;
      if (left1.size() != left2.size() || right1.size() != right2.size())
        ok = 0;
      else {
        for (int i = 0; i < left1.size(); i++) {
          if (left1[i] != left2[i]) {
            ok = 0;
            break;
          }
        }
        for (int i = 0; i < right1.size(); i++) {
          if (right1[i] != right2[i]) {
            ok = 0;
            break;
          }
        }
      }
      if (ok) return;
      ans_cnt += pw[cnt];
      ans_cnt %= mod;
    }
  }
}
int main() {
  get_pw();
  scanf("%d", &N);
  P.resize(N);
  for (int i = 0; i < N; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    P[i] = pair<int, int>(x, y);
  }
  get_bottom_left();
  int s = 0, e = 10000;
  while (s <= e) {
    int m = (s + e) >> 1;
    if (f(m)) {
      ans = m;
      e = m - 1;
    } else
      s = m + 1;
  }
  printf("%d\n", ans);
  get_ans_cnt();
  printf("%I64d", ans_cnt * 2 % mod);
}
