You are given four positive integers n, m, a, b (1 ≤ b ≤ n ≤ 50; 1 ≤ a ≤ m ≤ 50). Find any such rectangular matrix of size n × m that satisfies all of the following conditions:

  * each row of the matrix contains exactly a ones; 
  * each column of the matrix contains exactly b ones; 
  * all other elements are zeros. 



If the desired matrix does not exist, indicate this.

For example, for n=3, m=6, a=2, b=1, there exists a matrix satisfying the conditions above:

$$$ \begin{vmatrix} 0 & 1 & 0 & 0 & 0 & 1 \\\ 1 & 0 & 0 & 1 & 0 & 0 \\\ 0 & 0 & 1 & 0 & 1 & 0 \end{vmatrix} $$$

Input

The first line contains an integer t (1 ≤ t ≤ 1000) — the number of test cases. Then t test cases follow.

Each test case is described by four positive integers n, m, a, b (1 ≤ b ≤ n ≤ 50; 1 ≤ a ≤ m ≤ 50), where n and m are the sizes of the matrix, and a and b are the number of ones for rows and columns, respectively.

Output

For each test case print:

  * "YES" (without quotes) and the required matrix (if there are several answers, print any) if it exists, or 
  * "NO" (without quotes) if it does not exist. 



To print the matrix n × m, print n rows, each of which consists of m numbers 0 or 1 describing a row of the matrix. Numbers must be printed without spaces.

Example

Input


5
3 6 2 1
2 2 2 1
2 2 2 2
4 4 2 2
2 1 1 2


Output


YES
010001
100100
001010
NO
YES
11
11
YES
1100
1100
0011
0011
YES
1
1

import java.util.*;
import java.io.*;
import java.math.BigInteger;
 public class Solution
{
     static class Pair<A,B>
     {
        A parent;
        B rank;
        Pair(A parent,B rank)
        {
            this.rank=rank;
            this.parent=parent;
        }
    }
     static class Node{
         int x;
         int y;
         Node(int i,int j)
         {
             x=i;
             y=j;
         }
     }
     static int m=1000000007;
     static ArrayList<Integer> graph[];
     static boolean visited[];
     static int fact[];
    public static void main (String[] args) throws IOException
    {
        StringBuilder sb = new StringBuilder();
        FastReader s1 = new FastReader();
        int t=s1.I();
        while(t--!=0)
        {
           int n=s1.I();
           int m=s1.I();
           int a=s1.I();
           int b=s1.I();
           int temp1=n*a;
           int temp2=m*b;
           int col=0;
           int ar[][] = new int[n][m];
           int count=0;
           if(temp1==temp2 && temp1<=m*n)
           {
               for(int i=0;i<n;i++)
               {
                   int temp=0;
                   for(int j=col;temp<a;j++,temp++)
                   {
                       if(j>=m)
                       {
                           j=0;
                       }
                       ar[i][j]=1;
                       col=j;
                   }
                   col++;
               }
               sb.append("YES\n");
               for(int i=0;i<n;i++)
               {
                   for(int j=0;j<m;j++)
                   {
                       sb.append(ar[i][j]);
                   }
                   sb.append("\n");
               }
           }
           else
           {
               sb.append("NO\n");
           }
        }
        System.out.println(sb);
    }
    static class FastReader{
        BufferedReader br;
        StringTokenizer st;
        public FastReader()
        {
            br = new BufferedReader(new
                             InputStreamReader(System.in));
        }
        String next()
        {
            while (st == null || !st.hasMoreElements())
            {
                try
                {
                    st = new StringTokenizer(br.readLine());
                }
                catch (IOException  e)
                {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        
        int I()
        {
            return Integer.parseInt(next());
        }
        
        long L()
        {
            return Long.parseLong(next());
        }
        
        double D()
        {
            return Double.parseDouble(next());
        }
        
        String nextLine()
        {
            String str = "";
            try
            {
                str = br.readLine();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return str;
        }
    }
    static long gcd(long a,long b)
    {
        if(a%b==0)
            return b;
        return gcd(b,a%b);
    }
    static float power(float x, int y)
    {
        float temp;
        if( y == 0)
            return 1;
        temp = power(x, y/2);
        
        if (y%2 == 0)
            return temp*temp;
        else
        {
            if(y > 0)
                return x * temp * temp;
            else
                return (temp * temp) / x;
        }
    }
    static long pow(long x, long y)
    {
        int p =  1000000007;
        long res = 1;
        x = x % p;
        if(x<0)
            x+=p;
        while (y > 0)
        {
            if((y & 1)==1){
                res = (res * x) % p;
                if(res<0)
                    res+=p;
            }
            y = y >> 1;
            x = (x * x) % p;
            if(x<0)
                x=x+p;
        }
        res=res%p;
                if(res<0)
                    res+=p;
        return res;
    }
    static void sieveOfEratosthenes(int n)
    {
        ArrayList<Integer> prime=new ArrayList<Integer>();
        boolean Prime[] = new boolean[n+1];
        for(int i=2;i<n;i++)
            Prime[i] = true;
        
        for(int p = 2; p*p <=n; p++)
        {
            if(Prime[p] == true)
            {
                prime.add(p);
                for(int i = p*p; i <= n; i += p)
                    Prime[i] = false;
            }
        }
    }
}