#include <bits/stdc++.h>
#pragma GCC optimize("O3")
long long int gcd(long long int a, long long int b) {
  return (b ? gcd(b, a % b) : a);
}
long long int P(long long int B, long long int power) {
  long long int ans = 1;
  while (power > 0) {
    if (power % 2 == 1) {
      ans = (ans * B) % 1000000007;
    }
    B = (B * B) % 1000000007;
    power /= 2;
  }
  return ans;
}
bool isPrime(long long int n) {
  if (n <= 1) {
    return false;
  }
  if (n <= 3) {
    return true;
  }
  if (n % 2 == 0 || n % 3 == 0) {
    return false;
  }
  for (long long int i = 5; i * i <= n; i += 6) {
    if (n % i == 0 || n % (i + 2) == 0) {
      return false;
    }
  }
  return true;
}
using namespace std;
int main() {
  ios_base::sync_with_stdio(false);
  cout.tie(NULL);
  cin.tie(NULL);
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  int t1 = a + c;
  int t2 = b + d;
  if (abs(t1 - t2) > 1 || (b < a && c) || (c < d && b)) {
    cout << "NO";
    return 0;
  }
  vector<int> ans(a + b + c + d);
  if (t1 >= t2) {
    for (long long int i = 0; i < a; i++) {
      ans[2 * i] = 0;
    }
    for (long long int i = 0; i < c; i++) {
      ans[(2 * i) + (2 * a)] = 2;
    }
    for (long long int i = 0; i < b; i++) {
      ans[(2 * i) + 1] = 1;
    }
    for (long long int i = 0; i < d; i++) {
      ans[(2 * i) + 1 + (2 * b)] = 3;
    }
  }
  if (t2 > t1) {
    for (long long int i = 0; i < b; i++) {
      ans[2 * i] = 1;
    }
    for (long long int i = 0; i < d; i++) {
      ans[(2 * i) + (2 * b)] = 3;
    }
    for (long long int i = 0; i < a; i++) {
      ans[(2 * i) + 1] = 0;
    }
    for (long long int i = 0; i < c; i++) {
      ans[(2 * i) + 1 + (2 * a)] = 2;
    }
  }
  for (long long int i = 1; i < ans.size(); i++) {
    if (abs(ans[i] - ans[i - 1]) != 1) {
      cout << "NO";
      return 0;
    }
  }
  cout << "YES"
       << "\n";
  for (auto x : ans) {
    cout << x << " ";
  }
  return 0;
}
