Problem: You are given an integer N. Determine if there exists a tree with 2N vertices numbered 1 to 2N satisfying the following condition, and show one such tree if the answer is yes.

* Assume that, for each integer i between 1 and N (inclusive), Vertex i and N+i have the weight i. Then, for each integer i between 1 and N, the bitwise XOR of the weights of the vertices on the path between Vertex i and N+i (including themselves) is i.

Constraints

* N is an integer.
* 1 \leq N \leq 10^{5}

Input

Input is given from Standard Input in the following format:


N


Output

If there exists a tree satisfying the condition in the statement, print `Yes`; otherwise, print `No`. Then, if such a tree exists, print the 2N-1 edges of such a tree in the subsequent 2N-1 lines, in the following format:


a_{1} b_{1}
\vdots
a_{2N-1} b_{2N-1}


Here each pair (a_i, b_i) means that there is an edge connecting Vertex a_i and b_i. The edges may be printed in any order.

Examples

Input

3


Output

Yes
1 2
2 3
3 4
4 5
5 6


Input

1


Output

No

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N=100000;

int n;

void into(){
  scanf("%d",&n);
}

int ca,ans[N*2+9][2];

void Get_ans(){
  if ((n&-n)==n) return;
  for (int i=3;i<=n;i+=2){
	int x=i-1,y=i;
	ans[++ca][0]=x;ans[ca][1]=y;
	ans[++ca][0]=x+n;ans[ca][1]=y+n;
	ans[++ca][0]=1;ans[ca][1]=x;
	ans[++ca][0]=1;ans[ca][1]=y+n;
  }
  ans[++ca][0]=n+1;ans[ca][1]=3;
  if (n&1) return;
  int x=n&-n,y=n-x;
  ans[++ca][0]=n;ans[ca][1]=x;
  ans[++ca][0]=n<<1;ans[ca][1]=y+n+1;
}

void work(){
  Get_ans();
}

void outo(){
  if ((n&-n)==n) puts("No");
  else{
	puts("Yes");
    for (int i=1;i<n<<1;++i)
	  printf("%d %d\n",ans[i][0],ans[i][1]);
  }
}

int main(){
  into();
  work();
  outo();
  return 0;
}