#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream& operator<<(ostream& os, vector<T> V) {
  os << "[ ";
  for (auto v : V) os << v << " ";
  os << "]";
  return os;
}
template <class T>
ostream& operator<<(ostream& os, set<T> second) {
  os << "{ ";
  for (auto s : second) os << s << " ";
  return os << "}";
}
template <class T>
ostream& operator<<(ostream& os, multiset<T> second) {
  os << "{ ";
  for (auto s : second) os << s << " ";
  return os << "}";
}
template <class L, class R>
ostream& operator<<(ostream& os, pair<L, R> P) {
  return os << "(" << P.first << "," << P.second << ")";
}
template <class L, class R>
ostream& operator<<(ostream& os, map<L, R> M) {
  os << "{ ";
  for (auto m : M) os << "(" << m.first << ":" << m.second << ") ";
  return os << "}";
}
template <class L, class R>
ostream& operator<<(ostream& os, unordered_map<L, R> M) {
  os << "{ ";
  for (auto m : M) os << "(" << m.first << ":" << m.second << ") ";
  return os << "}";
}
const long long N = 100, M = 1e9 + 7;
long long a, b, c, d, n, x[N];
char M1[N][N], M2[N][N];
void solve() {
  cin >> a >> b >> c >> d >> n;
  for (long long i = 0; i < n; i++) cin >> x[i];
  long long tot = (a * b) + (c * d);
  char fill = 'a';
  long long cu = 0;
  if (a % 2 == 0) {
    for (long long i = 0; i < a; i++) {
      for (long long j = 0; j < b; j++) {
        M1[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
      i++;
      if (i >= a) break;
      for (long long j = b - 1; j >= 0; j--) {
        M1[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
    }
    for (long long i = 0; i < c; i++) {
      for (long long j = 0; j < d; j++) {
        M2[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
      i++;
      if (i >= c) break;
      for (long long j = d - 1; j >= 0; j--) {
        M2[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
    }
  } else {
    for (long long i = 0; i < a; i++) {
      for (long long j = b - 1; j >= 0; j--) {
        M1[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
      i++;
      if (i >= a) break;
      for (long long j = 0; j < b; j++) {
        M1[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
    }
    for (long long i = 0; i < c; i++) {
      for (long long j = 0; j < d; j++) {
        M2[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
      i++;
      if (i >= c) break;
      for (long long j = d - 1; j >= 0; j--) {
        M2[j][i] = fill, x[cu]--;
        if (x[cu] == 0) cu++, fill++;
      }
    }
  }
  cout << "YES\n";
  for (long long i = 0; i < max(b, d); i++) {
    for (long long j = 0; j < a; j++)
      if (i >= b)
        cout << ".";
      else
        cout << M1[i][j];
    for (long long j = 0; j < c; j++)
      if (i >= d)
        cout << ".";
      else
        cout << M2[i][j];
    cout << "\n";
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(0);
  solve();
  return 0;
}
