There is an array a of 2^{30} integers, indexed from 0 to 2^{30}-1. Initially, you know that 0 ≤ a_i < 2^{30} (0 ≤ i < 2^{30}), but you do not know any of the values. Your task is to process queries of two types:

  * 1 l r x: You are informed that the bitwise xor of the subarray [l, r] (ends inclusive) is equal to x. That is, a_l ⊕ a_{l+1} ⊕ … ⊕ a_{r-1} ⊕ a_r = x, where ⊕ is the bitwise xor operator. In some cases, the received update contradicts past updates. In this case, you should ignore the contradicting update (the current update).
  * 2 l r: You are asked to output the bitwise xor of the subarray [l, r] (ends inclusive). If it is still impossible to know this value, considering all past updates, then output -1.



Note that the queries are encoded. That is, you need to write an online solution.

Input

The first line contains a single integer q (1 ≤ q ≤ 2 ⋅ 10^5) — the number of queries.

Each of the next q lines describes a query. It contains one integer t (1 ≤ t ≤ 2) — the type of query.

The given queries will be encoded in the following way: let last be the answer to the last query of the second type that you have answered (initially, last = 0). If the last answer was -1, set last = 1.

  * If t = 1, three integers follow, l', r', and x' (0 ≤ l', r', x' < 2^{30}), meaning that you got an update. First, do the following: l = l' ⊕ last, r = r' ⊕ last, x = x' ⊕ last 

and, if l > r, swap l and r.

This means you got an update that the bitwise xor of the subarray [l, r] is equal to x (notice that you need to ignore updates that contradict previous updates).

  * If t = 2, two integers follow, l' and r' (0 ≤ l', r' < 2^{30}), meaning that you got a query. First, do the following: l = l' ⊕ last, r = r' ⊕ last 

and, if l > r, swap l and r.

For the given query, you need to print the bitwise xor of the subarray [l, r]. If it is impossible to know, print -1. Don't forget to change the value of last.




It is guaranteed there will be at least one query of the second type.

Output

After every query of the second type, output the bitwise xor of the given subarray or -1 if it is still impossible to know.

Examples

Input

12
2 1 2
2 1 1073741822
1 0 3 4
2 0 0
2 3 3
2 0 3
1 6 7 3
2 4 4
1 0 2 1
2 0 0
2 4 4
2 0 0


Output

-1
-1
-1
-1
5
-1
6
3
5


Input

4
1 5 5 9
1 6 6 5
1 6 5 10
2 6 5


Output

12

Note

In the first example, the real queries (without being encoded) are:

  * 12
  * 2 1 2
  * 2 0 1073741823
  * 1 1 2 5
  * 2 1 1
  * 2 2 2
  * 2 1 2
  * 1 2 3 6
  * 2 1 1
  * 1 1 3 0
  * 2 1 1
  * 2 2 2
  * 2 3 3


  * The answers for the first two queries are -1 because we don't have any such information on the array initially. 
  * The first update tells us a_1 ⊕ a_2 = 5. Note that we still can't be certain about the values a_1 or a_2 independently (for example, it could be that a_1 = 1, a_2 = 4, and also a_1 = 3, a_2 = 6). 
  * After we receive all three updates, we have enough information to deduce a_1, a_2, a_3 independently. 



In the second example, notice that after the first two updates we already know that a_5 ⊕ a_6 = 12, so the third update is contradicting, and we ignore it.
#include <bits/stdc++.h>
using namespace std;
namespace ufs {
int fa[400005];
int w[400005];
void makeset(int n) {
  for (int i = 1; i <= n; i++) fa[i] = i;
}
int findset(int x) {
  if (fa[x] == x) return x;
  int t = findset(fa[x]);
  w[x] ^= w[fa[x]];
  return fa[x] = t;
}
void merge(int u, int v, int ty) {
  swap(u, v);
  int a = findset(u);
  int b = findset(v);
  fa[a] = b;
  w[a] = w[u] ^ ty ^ w[v];
  w[b] = 0;
}
}  // namespace ufs
using namespace ufs;
int ty;
int n, cnt;
int lans;
map<int, int> hashh;
int opt, l, r, x;
void divide(int val, int *a) {
  for (int i = 0; i <= 30; i++) a[i] = 0;
  int len = 0;
  while (val) {
    a[len++] = (val & 1);
    val >>= 1;
  }
  len--;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  makeset(2 * n);
  for (int i = 1; i <= n; i++) {
    cin >> opt >> l >> r;
    l ^= lans;
    r ^= lans;
    if (l > r) swap(l, r);
    l--;
    if (hashh.count(l) == 0) hashh[l] = ++cnt;
    if (hashh.count(r) == 0) hashh[r] = ++cnt;
    l = hashh[l];
    r = hashh[r];
    if (opt == 1) {
      cin >> x;
      x ^= lans;
      if (findset(l) != findset(r)) merge(l, r, x);
    } else {
      lans = 0;
      if (findset(l) != findset(r)) {
        lans = 1;
        cout << "-1\n";
      } else {
        lans = (w[l] ^ w[r]);
        cout << lans << '\n';
      }
    }
  }
  return 0;
}
