Problem: Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both main diagonals are odd.

Input

The only line contains odd integer n (1 ≤ n ≤ 49).

Output

Print n lines with n integers. All the integers should be different and from 1 to n2. The sum in each row, column and both main diagonals should be odd.

Examples

Input

1


Output

1


Input

3


Output

2 1 4
3 5 7
6 9 8

Solution (in JAVA):

Solution:
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.NoSuchElementException;
 
import java.util.*;
public class Main {
	int N;
	int[][] square;
	Queue<Integer> even,odd;
	public void solve(){
		N = nextInt();
		even = new ArrayDeque<Integer>();
		odd = new ArrayDeque<Integer>();
		
		for(int i = 1;i <= N * N;i++){
			if(i%2==0){
				even.add(i);
			}else{
				odd.add(i);
			}
		}
		
		square = new int[N][N];
		for(int i = 0;i < N / 2;i++){
			for(int j = 0;j < N / 2;j++){
				if(i + j < N / 2){
					square[i][j] = even.poll();
					square[N - i - 1][N - j - 1] = even.poll();
				}
			}
		}
		
		for(int i = N / 2 + 1;i < N;i++){
			for(int j = 0;j < N / 2;j++){
				if(i - j >= N / 2 + 1){
					square[i][j] = even.poll();
					square[N - i - 1][N - j - 1] = even.poll();
				}
			}
		}
		
		for(int i = 0;i < N;i++){
			for(int j = 0;j < N;j++){
				if(square[i][j] == 0){
					square[i][j] = odd.poll();
				}
			}
		}
		
		for(int i = 0;i < N;i++){
			for(int j = 0;j < N;j++){
				if(j != 0)out.print(" ");
				out.print(square[i][j]);
			}
			out.println();
		}
	}
 
	public static void main(String[] args) {
		out.flush();
		new Main().solve();
		out.close();
	}
 
	/* Input */
	private static final InputStream in = System.in;
	private static final PrintWriter out = new PrintWriter(System.out);
	private final byte[] buffer = new byte[2048];
	private int p = 0;
	private int buflen = 0;
 
	private boolean hasNextByte() {
		if (p < buflen)
			return true;
		p = 0;
		try {
			buflen = in.read(buffer);
		} catch (IOException e) {
			e.printStackTrace();
		}
		if (buflen <= 0)
			return false;
		return true;
	}
 
	public boolean hasNext() {
		while (hasNextByte() && !isPrint(buffer[p])) {
			p++;
		}
		return hasNextByte();
	}
 
	private boolean isPrint(int ch) {
		if (ch >= '!' && ch <= '~')
			return true;
		return false;
	}
 
	private int nextByte() {
		if (!hasNextByte())
			return -1;
		return buffer[p++];
	}
 
	public String next() {
		if (!hasNext())
			throw new NoSuchElementException();
		StringBuilder sb = new StringBuilder();
		int b = -1;
		while (isPrint((b = nextByte()))) {
			sb.appendCodePoint(b);
		}
		return sb.toString();
	}
 
	public int nextInt() {
		return Integer.parseInt(next());
	}
 
	public long nextLong() {
		return Long.parseLong(next());
	}
 
	public double nextDouble() {
		return Double.parseDouble(next());
	}
}