Problem: You are given an integer N.

Construct any one N-by-N matrix a that satisfies the conditions below. It can be proved that a solution always exists under the constraints of this problem.

* 1 \leq a_{i,j} \leq 10^{15}
* a_{i,j} are pairwise distinct integers.
* There exists a positive integer m such that the following holds: Let x and y be two elements of the matrix that are vertically or horizontally adjacent. Then, {\rm max}(x,y) {\rm mod} {\rm min}(x,y) is always m.

Constraints

* 2 \leq N \leq 500

Input

Input is given from Standard Input in the following format:


N


Output

Print your solution in the following format:


a_{1,1} ... a_{1,N}
:
a_{N,1} ... a_{N,N}

Output

Print your solution in the following format:


a_{1,1} ... a_{1,N}
:
a_{N,1} ... a_{N,N}

Example

Input

2


Output

4 7
23 10

Solution (in CPP):

Solution:
#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
inline long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
inline long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }

vector<int> prime_table(int n) {
    vector<int> is_prime(n + 1);
    if (n) iota(is_prime.begin() + 2, is_prime.end(), 2);
    for (int i = 2; i * i <= n; i++) if (is_prime[i]) {
        for (int j = i + i; j <= n; j += i) is_prime[j] = 0;
    }
    return is_prime;
}
vector<int> make_primes(int ma) {
    vector<int> ps = prime_table(ma);
    ps.erase(remove(ps.begin(), ps.end(), 0), ps.end());
    return ps;
}

int main() {
    auto ps = make_primes(10000);
    int n; cin >> n;
    vector<long long> pos, neg;
    int sz = n + 2;
    pos.insert(pos.end(), ps.begin(), ps.begin() + sz);
    neg.insert(neg.end(), ps.begin() + sz, ps.begin() + sz * 2);
    vector<vector<long long>> a(sz, vector<long long>(sz, 1));
    for (int i = 0; i < sz; i++) for (int j = 0; j < sz; j++) {
        int wa = i + j, sa = i - j + n + 1;
        if ((i + j) & 1) a[i][j] = pos[wa / 2] * neg[sa / 2];
    }
    for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {
        if ((i + j) & 1) continue;
        a[i][j] = lcm(a[i-1][j], lcm(a[i][j-1], lcm(a[i][j+1], a[i+1][j]))) + 1;
    }
    for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) {
        cout << a[i][j] << " \n"[j == n];
    }
    return 0;
}