You are given n integers a_1, a_2, ..., a_n, where n is odd. You are allowed to flip the sign of some (possibly all or none) of them. You wish to perform these flips in such a way that the following conditions hold:

  1. At least (n - 1)/(2) of the adjacent differences a_{i + 1} - a_i for i = 1, 2, ..., n - 1 are greater than or equal to 0. 
  2. At least (n - 1)/(2) of the adjacent differences a_{i + 1} - a_i for i = 1, 2, ..., n - 1 are less than or equal to 0. 



Find any valid way to flip the signs. It can be shown that under the given constraints, there always exists at least one choice of signs to flip that satisfies the required condition. If there are several solutions, you can find any of them.

Input

The input consists of multiple test cases. The first line contains an integer t (1 ≤ t ≤ 500) — the number of test cases. The description of the test cases follows.

The first line of each test case contains an integer n (3 ≤ n ≤ 99, n is odd) — the number of integers given to you.

The second line of each test case contains n integers a_1, a_2, ..., a_n (-10^9 ≤ a_i ≤ 10^9) — the numbers themselves.

It is guaranteed that the sum of n over all test cases does not exceed 10000.

Output

For each test case, print n integers b_1, b_2, ..., b_n, corresponding to the integers after flipping signs. b_i has to be equal to either a_i or -a_i, and of the adjacent differences b_{i + 1} - b_i for i = 1, ..., n - 1, at least (n - 1)/(2) should be non-negative and at least (n - 1)/(2) should be non-positive.

It can be shown that under the given constraints, there always exists at least one choice of signs to flip that satisfies the required condition. If there are several solutions, you can find any of them.

Example

Input


5
3
-2 4 3
5
1 1 1 1 1
5
-2 4 7 -6 4
9
9 7 -4 -2 1 -3 9 -4 -5
9
-4 1 9 4 8 9 5 1 -9


Output


-2 -4 3
1 1 1 1 1
-2 -4 7 -6 4
-9 -7 -4 2 1 -3 -9 -4 -5
4 -1 -9 -4 -8 -9 -5 -1 9

Note

In the first test case, the difference (-4) - (-2) = -2 is non-positive, while the difference 3 - (-4) = 7 is non-negative.

In the second test case, we don't have to flip any signs. All 4 differences are equal to 0, which is both non-positive and non-negative.

In the third test case, 7 - (-4) and 4 - (-6) are non-negative, while (-4) - (-2) and (-6) - 7 are non-positive.

import java.util.*;
import java.io.*;
 
 
public class gfg  {
 
    static PrintWriter out = new PrintWriter(System.out);
    
    public static void main(String[] args) throws IOException{
        //Reader.init(System.in);
        
        Reader.init(System.in);
        int t = Reader.nextInt();
        while(t-->0){
           solve();
        }
        out.close();
    }
    
    static ArrayList<Integer>[] graph; 
    static int n=0;
    static int m=0;
    static int k =0;
    static long mod =1000000007;
    static int MOD = 1000000007;
    static int[] dx = {0,0,1,-1};
    static int[] dy = {1,-1,0,0};
    


    static int[] seg  = new int[(int)2e5];

    static void solve()throws IOException{
        n = Reader.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = Reader.nextInt();
            if(i%2==0){
                if(arr[i]>0){
                    arr[i] = 0-arr[i];
                }
            }
            else{
                if(arr[i]<0){
                    arr[i] = 0-arr[i];
                }
            }
        }
        for(int i=0;i<n;i++){
            out.print(arr[i]+" ");
        }
        out.println();

        
    }

    static void update(int ind, int l , int r , int pos, int val){
        if(l==r){
            seg[ind] = val;
            return ;
        }
        int mid  = (l+r)/2;
        if(pos<=mid)
            update(2*ind,l,mid,pos,val);
        else
            update(2*ind+1,mid+1,r,pos,val);

        seg[ind] = Math.min(seg[2*ind],seg[2*ind+1]);

    }
    static int query(int ind, int l, int r, int ll, int rr){

        if(ll>rr | l>r)
            return (int)2e9;
        if(l==ll && r==rr)
            return seg[ind];
        int mid  = (l+r)/2;

        return Math.min( query(2*ind,l,mid,ll,Math.min(rr,mid)), query(2*ind+1,mid+1,r,Math.max(ll,mid+1),rr) );
    }

    /*static void dfs1(int a,int p){
        size[a]=1;
        for(int v: graph[a]){
            if(v!=p){
                dfs1(v,a);
                size[a]+=size[v];
                sum[a]+= (size[v]+sum[v]);
            }
        }
    }
    static void dfs2(int a,int p){
        if(p==-1)
            ans[a]= sum[a];
        else{
            ans[a] = ans[p] - (sum[a]+size[a]) + (n-size[a]) +sum[a];
        }
        for(int v:graph[a]){
            if(v!=p){
                dfs2(v,a);
            }
        }
    }*/

    
    // ggratest common divisor
    static int gcd(int a , int b){
        if(b==0)
            return a;
        else
            return gcd(b,a%b);
    }
 
    // least common multiple
    static int lcm(int a, int b){
        return (a*b)/gcd(a,b);
    }
    
    // a^b
    static long fastpow(long a, long b){
        long res = 1;a=a%mod;
        while(b>0){
            if(b%2==1)
                res = (res*a)%mod;
            a = (a*a)%mod;
            b = b>>1;
        }
        return res;
    }

    // segment tree
   /* static void update(int ind, int l, int h, int pos, int v){
        if(l==h){
            seg[ind] = v;
            return;
        }
        int mid = (l+h)/2;
        if(pos<=mid)
            update(2*ind,l,mid,pos,v);
        else
            update(2*ind+1,mid+1,h,pos,v);
        seg[ind] = seg[2*ind]^seg[2*ind+1];
    }
    static int query(int ind, int l , int h, int ll , int hh){
        if(ll>hh)
            return 0;
        if(l==ll && h==hh)
            return seg[ind];
        int mid = (l+h)/2;
        return query(2*ind,l,mid,ll,Math.min(mid,hh)) ^ query(2*ind+1,mid+1,h,Math.max(mid+1,ll),hh);
    }*/
    // priority queue with comparator
    // PriorityQueue<Interval> pq = new PriorityQueue<>(new Comparator<Interval>() {
    //             public int compare(Interval a, Interval b){
    //                 int diff1 = a.r - a.l;
    //                 int diff2 = b.r - b.l;
 
    //                 if(diff1 == diff2){
    //                     return a.l - b.l;
    //                 }
 
    //                 return diff2 - diff1;
    //             }
    // });
}
 
class trienode{
        int v;
        trienode[] child ;
        boolean leaf;
        int cnt;
        int p=0;
        trienode(int vv){
            child = new trienode[2];
            leaf=false;
            cnt=0;
            v=vv;
        }
        trienode(){
            child = new trienode[2];
            leaf=false;
            cnt=0;
            v=0;
        }
    }
class Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;
 
    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) {
        reader = new BufferedReader(
                     new InputStreamReader(input) );
        tokenizer = new StringTokenizer("");
    }
 
    /** get next word */
    static String next() throws IOException {
        while ( ! tokenizer.hasMoreTokens() ) {
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                   reader.readLine() );
        }
        return tokenizer.nextToken();
    }
 
    static int nextInt() throws IOException {
        return Integer.parseInt( next() );
    }
    static long nextLong() throws IOException {
        return Long.parseLong( next() );
    }
    
    static double nextDouble() throws IOException {
        return Double.parseDouble( next() );
    }
}
class newcomparator implements Comparator<Integer>{
    //@Override
    public int compare(Integer a, Integer  b){
        return a<=b?1:-1;
    }
 }
class node {
    int f;
    int s;// cost to rreach\
    node(int ff,int ss){
        f=ff;
        s=ss;
    }
}
class mergesort{
    static void sort(int l, int h, int[] arr){
        if(l<h){
            int mid = (l+h)/2;
            
            sort(l,mid,arr);
            sort(mid+1,h,arr);
            merge(l,mid,h,arr);
        }
    }
    static void merge(int l, int m , int h , int [] arr){

        int[] left = new int[m-l+1];
        int[] right = new int[h-m];
        for(int i= 0 ;i< m-l+1;i++){
            left[i] = arr[l+i];
        }
        for(int i=0;i<h-m;i++){
            right[i] = arr[m+1+i];
        }
        //now left and right arrays are assumed to be sorted and we have tp merge them together 
        // int the original aaray.
        int i=l;
        int lindex = 0;
        int rindex =  0;
        
        while(lindex<m-l+1 && rindex<h-m){
            if(left[lindex]<=right[rindex]){
                arr[i]=left[lindex];
                lindex++;
                i++;
            }
            else{
                arr[i]=right[rindex];
                rindex++;
                i++;
            }
        }
        while(lindex<m-l+1){
            arr[i]=left[lindex];
            lindex++;
            i++;
        }
        while(rindex<h-m){
            arr[i]=right[rindex];
            rindex++;
            i++;
        }
    }
    
}
 
 
