You are given an array a of length 2n. Consider a partition of array a into two subsequences p and q of length n each (each element of array a should be in exactly one subsequence: either in p or in q).

Let's sort p in non-decreasing order, and q in non-increasing order, we can denote the sorted versions by x and y, respectively. Then the cost of a partition is defined as f(p, q) = ∑_{i = 1}^n |x_i - y_i|.

Find the sum of f(p, q) over all correct partitions of array a. Since the answer might be too big, print its remainder modulo 998244353.

Input

The first line contains a single integer n (1 ≤ n ≤ 150 000).

The second line contains 2n integers a_1, a_2, …, a_{2n} (1 ≤ a_i ≤ 10^9) — elements of array a.

Output

Print one integer — the answer to the problem, modulo 998244353.

Examples

Input


1
1 4


Output


6

Input


2
2 1 2 1


Output


12

Input


3
2 2 2 2 2 2


Output


0

Input


5
13 8 35 94 9284 34 54 69 123 846


Output


2588544

Note

Two partitions of an array are considered different if the sets of indices of elements included in the subsequence p are different.

In the first example, there are two correct partitions of the array a:

  1. p = [1], q = [4], then x = [1], y = [4], f(p, q) = |1 - 4| = 3; 
  2. p = [4], q = [1], then x = [4], y = [1], f(p, q) = |4 - 1| = 3. 



In the second example, there are six valid partitions of the array a: 

  1. p = [2, 1], q = [2, 1] (elements with indices 1 and 2 in the original array are selected in the subsequence p); 
  2. p = [2, 2], q = [1, 1]; 
  3. p = [2, 1], q = [1, 2] (elements with indices 1 and 4 are selected in the subsequence p); 
  4. p = [1, 2], q = [2, 1]; 
  5. p = [1, 1], q = [2, 2]; 
  6. p = [2, 1], q = [2, 1] (elements with indices 3 and 4 are selected in the subsequence p). 
import java.io.*;
import java.util.*;
public class B1444{
	public static void main(String args[])throws IOException{
		// BufferedReader br = new BufferedReader(new InputStreamReader);
		Reader sc = new Reader();
        PrintWriter out = new PrintWriter(System.out);
		// int T = Integer.parseInt(br.readLine());
		int T = 1;
		while(T-->0){
			// int n = Integer.parseInt(br.readLine()); 
			// StringTokenizer str = new StringTokenizer(br.readLine);
			int n = sc.nextInt();

            int a[] = new int[2*n];
            long sum = 0;
            long first = 0, second = 0;
            for(int i=0; i<2*n; i++){
                a[i] = sc.nextInt();
                sum+=a[i];
            }
            Arrays.sort(a);
            for(int i=n; i<2*n; i++){                
                second+=a[i];
            }
            first = sum - second;

            long mod = 998244353;
            long ans = ((second - first + mod)%mod * ncr(2*n, n, mod)%mod)%mod;
            out.println(ans);
		}
        out.flush();
	}

    public static long ncr(long n, long k, long mod){
        if(n-k < k) k=n-k;
        long res = 1;
        for(int i=0; i<k; i++){
            res = (res*(n-i))%mod;
            res = (res*power(i+1, mod-2, mod)%mod)%mod;
        }
        return res;
    }

    public static long power(long a, long b, long m){
        long res = 1;
        a = a%m;
        while(b>0){
            if(b%2==1)  res = (res*a)%m;
            a=(a*a)%m;
            b=b/2;
        }
        return res;
    }
	
	static class Reader { 
        final private int BUFFER_SIZE = 1 << 16; private DataInputStream din; private byte[] buffer; private int bufferPointer, bytesRead; 
        public Reader() 
        { din = new DataInputStream(System.in); buffer = new byte[BUFFER_SIZE]; bufferPointer = bytesRead = 0; } 
        public Reader(String file_name) throws IOException 
        { din = new DataInputStream(new FileInputStream(file_name)); buffer = new byte[BUFFER_SIZE]; bufferPointer = bytesRead = 0; } 
        public String readLine() throws IOException 
        { byte[] buf = new byte[64]; int cnt = 0, c; while ((c = read()) != -1) { if (c == '\n') break; buf[cnt++] = (byte) c; } return new String(buf, 0, cnt); } 
        public int nextInt() throws IOException 
        { int ret = 0; byte c = read(); while (c <= ' ') c = read(); boolean neg = (c == '-'); if (neg) c = read(); do{ ret = ret * 10 + c - '0'; }  while ((c = read()) >= '0' && c <= '9'); if (neg) return -ret; return ret; } 
        public long nextLong() throws IOException 
        { long ret = 0; byte c = read(); while (c <= ' ') c = read(); boolean neg = (c == '-'); if (neg) c = read(); do { ret = ret * 10 + c - '0'; } while ((c = read()) >= '0' && c <= '9'); if (neg) return -ret; return ret; } 
        public double nextDouble() throws IOException 
        { double ret = 0, div = 1; byte c = read(); while (c <= ' ') c = read(); boolean neg = (c == '-'); if (neg) c = read(); do { ret = ret * 10 + c - '0'; } while ((c = read()) >= '0' && c <= '9'); if (c == '.') { while ((c = read()) >= '0' && c <= '9') { ret += (c - '0') / (div *= 10); } } if (neg) return -ret; return ret; } 
        private void fillBuffer() throws IOException 
        { bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE); if (bytesRead == -1) buffer[0] = -1; } 
        private byte read() throws IOException 
        { if (bufferPointer == bytesRead) fillBuffer(); return buffer[bufferPointer++]; } 
        public void close() throws IOException 
        { if (din == null) return; din.close(); } 
    } 
}