#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define Debug(...) fprintf(stderr, __VA_ARGS__)

typedef long long LL;
typedef long double LD;
typedef unsigned int uint;
typedef pair <int, int> pii;
typedef unsigned long long uLL;

template <typename T> inline void Read(T &x) {
  char c = getchar();
  bool f = false;
  for (x = 0; !isdigit(c); c = getchar()) {
    if (c == '-') {
      f = true;
    }
  }
  for (; isdigit(c); c = getchar()) {
    x = x * 10 + c - '0';
  }
  if (f) {
    x = -x;
  }
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}

const int N = 1005;

int n, m, a, b;
char s[N][N];

inline void A(int x, int y) {
  if (a) {
    s[x][y] = '<', s[x][y + 1] = '>', --a;
  }
}

inline void B(int x, int y) {
  if (b) {
    s[x][y] = '^', s[x + 1][y] = 'v', --b;
  }
}

int main() {
#ifdef wxh010910
  freopen("d.in", "r", stdin);
#endif
  Read(n), Read(m), Read(a), Read(b);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      s[i][j] = '.';
    }
  }
  if ((n & 1) && (m & 1) && n >= 3 && m >= 3) {
    for (int i = 1; i < m; i += 2) {
      A(n, i);
    }
    for (int i = 2; i < n; i += 2) {
      B(i, m);
    }
    bool flg = false;
    if (a & 1) {
      A(1, m - 1), B(1, m - 2), flg = true;
    }
    for (int i = 1; i < n; i += 2) {
      for (int j = 1; j < m; j += 2) {
        if (i == 1 && j == m - 2 && flg) {
          continue;
        }
        if (a) {
          A(i, j), A(i + 1, j);
        } else if (b) {
          B(i, j), B(i, j + 1);
        }
      }
    }
  } else {
    if (n & 1) {
      for (int i = 1; i < m; i += 2) {
        A(n, i);
      }
    }
    if (m & 1) {
      for (int i = 1; i < n; i += 2) {
        B(i, m);
      }
    }
    for (int i = 1; i < n; i += 2) {
      for (int j = 1; j < m; j += 2) {
        if (a) {
          A(i, j), A(i + 1, j);
        } else if (b) {
          B(i, j), B(i, j + 1);
        }
      }
    }
  }
  if (a || b) {
    puts("NO");
  } else {
    puts("YES");
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= m; ++j) {
        putchar(s[i][j]);
      }
      putchar(10);
    }
  }
#ifdef wxh010910
  Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
  return 0;
}

### Prompt

Your task is to create a Cpp solution to the following problem:

Takahashi has an N \times M grid, with N horizontal rows and M vertical columns. Determine if we can place A 1 \times 2 tiles (1 vertical, 2 horizontal) and B 2 \times 1 tiles (2 vertical, 1 horizontal) satisfying the following conditions, and construct one arrangement of the tiles if it is possible:

* All the tiles must be placed on the grid.
* Tiles must not stick out of the grid, and no two different tiles may intersect.
* Neither the grid nor the tiles may be rotated.
* Every tile completely covers exactly two squares.

Constraints

* 1 \leq N,M \leq 1000
* 0 \leq A,B \leq 500000
* N, M, A and B are integers.

Input

Input is given from Standard Input in the following format:


N M A B


Output

If it is impossible to place all the tiles, print `NO`. Otherwise, print the following:


YES
c_{11}...c_{1M}
:
c_{N1}...c_{NM}


Here, c_{ij} must be one of the following characters: `.`, `<`, `>`, `^` and `v`. Represent an arrangement by using each of these characters as follows:

* When c_{ij} is `.`, it indicates that the square at the i-th row and j-th column is empty;
* When c_{ij} is `<`, it indicates that the square at the i-th row and j-th column is covered by the left half of a 1 \times 2 tile;
* When c_{ij} is `>`, it indicates that the square at the i-th row and j-th column is covered by the right half of a 1 \times 2 tile;
* When c_{ij} is `^`, it indicates that the square at the i-th row and j-th column is covered by the top half of a 2 \times 1 tile;
* When c_{ij} is `v`, it indicates that the square at the i-th row and j-th column is covered by the bottom half of a 2 \times 1 tile.

Examples

Input

3 4 4 2


Output

YES
<><>
^<>^
v<>v


Input

4 5 5 3


Output

YES
<>..^
^.<>v
v<>.^
<><>v


Input

7 9 20 20


Output

NO

### Response

```cpp
#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
#define Debug(...) fprintf(stderr, __VA_ARGS__)

typedef long long LL;
typedef long double LD;
typedef unsigned int uint;
typedef pair <int, int> pii;
typedef unsigned long long uLL;

template <typename T> inline void Read(T &x) {
  char c = getchar();
  bool f = false;
  for (x = 0; !isdigit(c); c = getchar()) {
    if (c == '-') {
      f = true;
    }
  }
  for (; isdigit(c); c = getchar()) {
    x = x * 10 + c - '0';
  }
  if (f) {
    x = -x;
  }
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}

const int N = 1005;

int n, m, a, b;
char s[N][N];

inline void A(int x, int y) {
  if (a) {
    s[x][y] = '<', s[x][y + 1] = '>', --a;
  }
}

inline void B(int x, int y) {
  if (b) {
    s[x][y] = '^', s[x + 1][y] = 'v', --b;
  }
}

int main() {
#ifdef wxh010910
  freopen("d.in", "r", stdin);
#endif
  Read(n), Read(m), Read(a), Read(b);
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= m; ++j) {
      s[i][j] = '.';
    }
  }
  if ((n & 1) && (m & 1) && n >= 3 && m >= 3) {
    for (int i = 1; i < m; i += 2) {
      A(n, i);
    }
    for (int i = 2; i < n; i += 2) {
      B(i, m);
    }
    bool flg = false;
    if (a & 1) {
      A(1, m - 1), B(1, m - 2), flg = true;
    }
    for (int i = 1; i < n; i += 2) {
      for (int j = 1; j < m; j += 2) {
        if (i == 1 && j == m - 2 && flg) {
          continue;
        }
        if (a) {
          A(i, j), A(i + 1, j);
        } else if (b) {
          B(i, j), B(i, j + 1);
        }
      }
    }
  } else {
    if (n & 1) {
      for (int i = 1; i < m; i += 2) {
        A(n, i);
      }
    }
    if (m & 1) {
      for (int i = 1; i < n; i += 2) {
        B(i, m);
      }
    }
    for (int i = 1; i < n; i += 2) {
      for (int j = 1; j < m; j += 2) {
        if (a) {
          A(i, j), A(i + 1, j);
        } else if (b) {
          B(i, j), B(i, j + 1);
        }
      }
    }
  }
  if (a || b) {
    puts("NO");
  } else {
    puts("YES");
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= m; ++j) {
        putchar(s[i][j]);
      }
      putchar(10);
    }
  }
#ifdef wxh010910
  Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC);
#endif
  return 0;
}

```