#include <bits/stdc++.h> using namespace std; template <class K, class V> ostream &operator<<(ostream &out, const pair<K, V> &obj) { return out << "(" << obj.first << ", " << obj.second << ")"; } template <class T, class = decay_t<decltype(*begin(declval<T>()))>, class = enable_if_t<!is_same<T, string>::value>> ostream &operator<<(ostream &out, const T &obj) { out << "["; for (auto it = obj.begin(); it != obj.end(); it++) { out << &", "[2 * (it == obj.begin())] << *it; } return out << "]"; } using ll = long long; template <class T> using vec = vector<T>; #define FOR(i, s, e) for (ll i = (ll)(s); i < (ll)(e); i++) #define CFOR(i, s, e) for (ll i = (ll)(s); i <= (ll)(e); i++) #define TRAV(e, i) for (const auto &e : i) #define dbg(x) cerr << "ln" << __LINE__ << ": " << #x << " = " << x << "\n"; int main() { ll n, m, r, c; cin >> n >> m >> r >> c; vec<string> grid(n, string(m, ' ')); string garbage = "bcd"; if (r == n) { FOR(i, 0, n - 1) { FOR(j, 0, m) { grid[i][j] = 'a'; } } FOR(i, 0, m) { grid[n - 1][i] = 'b'; } ll curr = c; FOR(j, 0, m) { if (j >= m - j - 1) break; if (curr >= 2) { grid[n - 1][j] = 'a'; grid[n - 1][m - j - 1] = 'a'; curr -= 2; } } if (curr) { grid[n - 1][m / 2] = 'a'; } } else if (c == m) { FOR(i, 0, n) { FOR(j, 0, m - 1) { grid[i][j] = 'a'; } } FOR(i, 0, n) { grid[i][m - 1] = 'b'; } ll curr = r; FOR(i, 0, n) { if (i >= n - i - 1) break; if (curr >= 2) { grid[i][m - 1] = 'a'; grid[n - i - 1][m - 1] = 'a'; curr -= 2; } } if (curr) { grid[n / 2][m - 1] = 'a'; } } else { FOR(i, 0, n) { FOR(j, 0, m) { grid[i][j] = garbage[(i + j) % 3]; } } FOR(i, 0, r) { FOR(j, 0, m) { grid[i][j] = 'a'; } } FOR(i, 0, n) { FOR(j, 0, c) { grid[i][j] = 'a'; } } } ll nr = 0, nc = 0; FOR(i, 0, n) { bool p = true; FOR(j, 0, m) { if (grid[i][j] != grid[i][m - j - 1]) p = false; } if (p) nr++; } FOR(j, 0, m) { bool p = true; FOR(i, 0, n) { if (grid[i][j] != grid[n - i - 1][j]) p = false; } if (p) nc++; } if (nr != r || nc != c) { cout << "IMPOSSIBLE\n"; return 0; } FOR(i, 0, n) { cout << grid[i] << "\n"; } }