#include <bits/stdc++.h>
#define int long long

using namespace std;

const int O = 1e6 + 5;

int a, b, c, d, ans[O], id;

bool flag = false;

main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> a >> b >> c >> d;
    for (int i = 1; i <= min(a, b) * 2; ++ i){
        ans[i] = (i & 1) ^ 1;
    }
    int cur = min(a, b);
    id = cur * 2;
    a -= cur; b -= cur;
    int turn = 0;
    for (int i = id + 1; i <= id + min(b, c) * 2; ++ i){
        ans[i] = (turn == 0) ? (2) : (1);
        turn ^= 1;
    }
    cur = min(b, c) * 2;
    id += cur;
    b -= cur; c -= cur;
    turn = 0;
    for (int i = id + 1; i <= id + min(c, d) * 2; ++ i){
        ans[i] = (turn == 0) ? (2) : (3);
        turn ^= 1;
    }
    cur = min(c, d);
    id += cur * 2;
    c -= cur; d -= cur;
    if (c){
        ++ id;
        ans[id] = 2;
        -- c;
    }
    if (b){
        ++ id;
        ans[id] = 1;
        -- b;
    }
    if (a == 0 && b == 0 && c == 0 && d == 0){
        cout << "YES\n";
        for (int i = 1; i <= id; ++ i) cout << ans[i] << " ";
        return 0;
    }
    cout << "NO";
}


#include <bits/stdc++.h>
#define int long long

using namespace std;

const int O = 1e6 + 5;

int a, b, c, d;

deque <int> ans;

main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> a >> b >> c >> d;
    if (a && b && c || a && b && c || a && c && d || b && c && d){
        for (int i = 1; i <= min(a, b); ++ i){
            ans.push_back(0);
            ans.push_back(1);
        }
        int cur = min(a, b);
        a -= cur; b -= cur;
        if (b == 1){
            -- b; ans.push_front(1);
        }
        for (int i = 1; i <= min(c, b); ++ i){
            ans.push_back(2);
            ans.push_back(1);
        }
        cur = min(b, c);
        b -= cur; c -= cur;
        if (b){
            -- b;
            ans.push_front(1);
        }
        for (int i = 1; i <= min(c, d); ++ i){
            ans.push_back(2);
            ans.push_back(3);
        }
        cur = min(c, d);
        c -= cur; d -= cur;
        if (c){
            -- c; ans.push_back(2);
        }
    }
    else{
    if (a && b && c == 0 && d == 0){
        for (int i = 1; i <= min(a, b); ++ i){
            ans.push_back(0);
            ans.push_back(1);
        }
        a -= min(a, b); b -= min(a, b);
        if (a){
            -- a;
            ans.push_back(0);
        }
        if (b){
            -- b;
            ans.push_front(1);
        }
    }
    if (c && d && a == 0 && b == 0){
        swap(a, c); swap(b, d);
        for (int i = 1; i <= min(a, b); ++ i){
            ans.push_back(2);
            ans.push_back(3);
        }
        a -= min(a, b); b -= min(a, b);
        if (a){
            -- a;
            ans.push_back(2);
        }
        if (b){
            -- b;
            ans.push_front(3);
        }
    }
    }
    if (a == 0 && b == 0 && c == 0 && d == 0){
        cout << "YES\n";
        while (ans.size()){
            cout << ans.front() << " ";
            ans.pop_front();
        }
        return 0;
    }
    cout << "NO";
}


#include <bits/stdc++.h>
using namespace std;

bool satisfy(vector<int> &O) {
	for(int i = 1; i < O.size(); ++i)
		if(abs(O[i] - O[i-1]) != 1)
			return false;

	return true;
}

// SAOIFNAOSNFNOANFOSDANF

int A[4], B[4];
vector<int> answer(int s) {
	for(int k = 0; k < 4; ++k) A[k] = B[k];
	int N = A[0] + A[1] + A[2] + A[3];
	vector<int> O(N, -1); O[0] = s; --A[s];

	int i = 1;
	for(int k = 0; k < 3; ++k) {
		while(i < N && A[k] > 0) {

			if(O[i-1] == k) O[i] = k+1, --A[k+1];
			else O[i] = k, --A[k];
			++i;
		}
	}

	if(i < N && A[3] == 1) {
		O[i] = 3;
		--A[3];
		++i;
	}

	if(min({A[0], A[1], A[2], A[3]}) == 0 && satisfy(O)) {
		return O;
	}
	else return {-1};
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0);

	for(int k = 0; k < 4; ++k) cin >> B[k];

	for(int k = 0; k < 4; ++k) {
		vector<int> O = answer(k);
		if(O[0] != -1) {
			cout << "YES\n";
			for(int o : O) cout << o << ' ';
			cout << '\n';
			return 0;
		}
	}

	cout << "NO\n";
	return 0;
}


#include <bits/stdc++.h>
using namespace std;

int main() {
	ios::sync_with_stdio(0); cin.tie(0);

	int a,b,c,d;
	cin >> a >> b >> c >> d;

	if(b >= a && b - a <= 1 && c >= d && c - d <= 1) {
		cout << "YES\n";

		int x = (a == b ? 0 : 1), p = (a == b ? 1 : -1), n = a+b;
		for(int i = 0; i < n; ++i) {
			cout << x << ' ';
			x += p;
			p = -p;
		}

		x = 2; p = 1; n = c+d;
		for(int i = 0; i < n; ++i) {
			cout << x << ' ';
			x += p;
			p = -p;
		}

		cout << '\n';
	}
	else cout << "NO\n";

	return 0;
}


#include <bits/stdc++.h>
using namespace std;

bool satisfy(vector<int> &O) {
	for(int i = 1; i < O.size(); ++i)
		if(abs(O[i] - O[i-1]) != 1)
			return false;

	return true;
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0);

	int A[4];
	for(int k = 0; k < 4; ++k) cin >> A[k];
	int N = A[0] + A[1] + A[2] + A[3];
	vector<int> O(N, -1);

	if(A[1] > A[0]) {
		O[0] = 1;
		--A[1];
	} else {
		O[0] = 0;
		--A[0];
	}

	int i = 1;
	for(int k = 0; k < 3; ++k) {
		while(A[k] > 0) {
			if(O[i-1] == k) O[i] = k+1, --A[k+1];
			else O[i] = k, --A[k];
			++i;
		}
	}

	if(A[3] == 1) {
		O[i] = 3;
		--A[3];
		++i;
	}

	if(min({A[0], A[1], A[2], A[3]}) == 0 && satisfy(O)) {
		cout << "YES\n";
		for(int o : O) cout << o << ' ';
		cout << '\n';
	}
	else cout << "NO\n";

	return 0;
}


#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <string>
#include <sstream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pii;
const LL MAXN = 4e5 + 10;
const LL INF = 1e9 + 7;

int main() {
	int a, b, c, d;
	scanf("%d %d %d %d", &a, &b, &c, &d);
	if (a + c > b + d + 1 || b + d > a + c + 1) {
		cout << "NO" << endl;
		return 0;
	}
	if (a > b || d > c) {
		if (a == b+1 && c == 0 && d == 0) {
			cout << "YES" << endl;
			for (int i = 0; i < b; i++) {
				cout << "0 1 ";
			}
			cout << "0" << endl;
			return 0;
		}
		if (d == c+1 && a == 0 && b == 0) {
			cout << "YES" << endl;
			for (int i = 0; i < c; i++) {
				cout << "3 2 ";
			}
			cout << "3" << endl;
			return 0;
		}
		cout << "NO" << endl;
		return 0;
	}
	cout << "YES" << endl;
	if (a + c == b + d + 1) {
		// start with a
		// (0,1)xa,(2,1)x(b-a),(2,3)x(d),2
		for (int i = 0; i < a; i++) {
			cout << "0 1 ";
		}
		for (int i = 0; i < b - a; i++) {
			cout << "2 1 ";
		}
		for (int i = 0; i < d; i++) {
			cout << "2 3 ";
		}
		cout << "2" << endl;
	}
	if (a + c + 1 == b + d) {
		// start with d
		// (3,2)xd,(1,2)x(c-b),(1,0)x(a),1
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - d; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << "1" << endl;
	}
	if (a + c == b + d) {
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - d; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << endl;
	}
}


#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <string>
#include <sstream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pii;
const LL MAXN = 4e5 + 10;
const LL INF = 1e9 + 7;
int a[MAXN];

int main() {
	int a, b, c, d;
	scanf("%d %d %d %d", &a, &b, &c, &d);
	if (a + c > b + d + 1 || b + d > a + c + 1) {
		cout << "NO" << endl;
		return 0;
	}
	if (a > b || d > c) {
		cout << "NO" << endl;
		return 0;
	}
	if (a + c == b + d + 1) {
		// start with a
		// (0,1)xa,(2,1)x(b-a),(2,3)x(d),2
		for (int i = 0; i < a; i++) {
			cout << "0 1 ";
		}
		for (int i = 0; i < b - a; i++) {
			cout << "2 1 ";
		}
		for (int i = 0; i < d; i++) {
			cout << "2 3 ";
		}
		cout << "2" << endl;
	}
	if (a + c + 1 == b + d) {
		// start with d
		// (3,2)xd,(1,2)x(c-b),(1,0)x(a),1
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - b; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << "1" << endl;
	}
	if (a + c == b + d) {
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - b; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << endl;
	}
}


#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <string>
#include <sstream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pii;
const LL MAXN = 4e5 + 10;
const LL INF = 1e9 + 7;

int main() {
	int a, b, c, d;
	scanf("%d %d %d %d", &a, &b, &c, &d);
	if (a + c > b + d + 1 || b + d > a + c + 1) {
		cout << "NO" << endl;
		return 0;
	}
	if (a > b || d > c) {
		cout << "NO" << endl;
		return 0;
	}
	cout << "YES" << endl;
	if (a + c == b + d + 1) {
		// start with a
		// (0,1)xa,(2,1)x(b-a),(2,3)x(d),2
		for (int i = 0; i < a; i++) {
			cout << "0 1 ";
		}
		for (int i = 0; i < b - a; i++) {
			cout << "2 1 ";
		}
		for (int i = 0; i < d; i++) {
			cout << "2 3 ";
		}
		cout << "2" << endl;
	}
	if (a + c + 1 == b + d) {
		// start with d
		// (3,2)xd,(1,2)x(c-b),(1,0)x(a),1
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - d; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << "1" << endl;
	}
	if (a + c == b + d) {
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - d; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << endl;
	}
}


#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <string>
#include <sstream>
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
using namespace std;

typedef long long LL;
typedef pair<LL, LL> pii;
const LL MAXN = 4e5 + 10;
const LL INF = 1e9 + 7;
int a[MAXN];

int main() {
	int a, b, c, d;
	scanf("%d %d %d %d", &a, &b, &c, &d);
	if (a + c > b + d + 1 || b + d > a + c + 1) {
		cout << "NO" << endl;
		return 0;
	}
	if (a > b || d > c) {
		cout << "NO" << endl;
		return 0;
	}
	cout << "YES" << endl;
	if (a + c == b + d + 1) {
		// start with a
		// (0,1)xa,(2,1)x(b-a),(2,3)x(d),2
		for (int i = 0; i < a; i++) {
			cout << "0 1 ";
		}
		for (int i = 0; i < b - a; i++) {
			cout << "2 1 ";
		}
		for (int i = 0; i < d; i++) {
			cout << "2 3 ";
		}
		cout << "2" << endl;
	}
	if (a + c + 1 == b + d) {
		// start with d
		// (3,2)xd,(1,2)x(c-b),(1,0)x(a),1
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - b; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << "1" << endl;
	}
	if (a + c == b + d) {
		for (int i = 0; i < d; i++) {
			cout << "3 2 ";
		}
		for (int i = 0; i < c - b; i++) {
			cout << "1 2 ";
		}
		for (int i = 0; i < a; i++) {
			cout << "1 0 ";
		}
		cout << endl;
	}
}


//#pragma GCC optimize(3)
#include <random>
#include <stdio.h>
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<int, int> pii;
#define Continue(x) { x; continue; }
#define Break(x) { x; break; }
#define Return(x) { x; return; }
#define P2(x) ((x) * (x))
#define lowbit(x) ((x) & -(x))
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#define MEM(x, y) memset((x), (y), sizeof(x))
#define MEN(x, y, z) memset((x), (y), sizeof((x)[0]) * (z))
#define Diz(x) (lower_bound(dz.begin(), dz.end(), (x)) - dz.begin())
#define DISCRETIZA(x) (x).push_back(-INF), sort((x).begin(), (x).end()), (x).erase(unique((x).begin(), (x).end()), (x).end())
#ifdef LOCAL
#define DEBUG(...) cout << ">> " << #__VA_ARGS__ << " =", PRT(__VA_ARGS__), cout << endl;
#define DEBUGS(...) cout << ">> " << #__VA_ARGS__ << " =", PRTS(__VA_ARGS__), cout << endl;
void PRT() {} template <typename S, typename... T> void PRT(S x, T ... y){ cout << " " << x; PRT(y...); }
void PRTS() {} template <typename S> void PRTS(S x) { for (auto v : x) cout << " " << v; }
#define TIME cout << "RunTime: " << clock() << "ms\n", 0
#define __int128_t long long
#else
#define DEBUG(...) ;
#define DEBUGS(...) ;
#define TIME 0
#endif

const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = 1e9 + 7;
template<typename S, typename T> inline bool Min(S &a, const T &b){ return a > b ? a = b, true : false; }
template<typename S, typename T> inline bool Max(S &a, const T &b){ return a < b ? a = b, true : false; }
template<typename S, typename T> inline void Adm(S &a, const T &b){ a = (a + b) % MOD; if (a < 0) a += MOD; }
template<typename S, typename T> inline void Mum(S &a, const T &b){ a = 1LL * a * b % MOD; }
template<typename T> inline bool IsPri(T x) { if (x < 2) return false; for (T i = 2; i * i <= x; ++i) if (x % i == 0) return false; return true; }
template<typename T> inline T Gcd(T a, T b){ while (b){ T t = b; b = a % b; a = t; } return a; }
template<typename T> inline int BitCnt(T x){ int cnt = 0; while (x)++cnt, x &= x - 1; return cnt; }
template<typename T> inline T MDis(T x1, T y1, T x2, T y2){ return abs(x1 - x2) + abs(y1 - y2); }
template<typename T> inline T MDis(T x1, T y1, T z1, T x2, T y2, T z2){ return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); }
inline double EDis(double x1, double y1, double x2, double y2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); }
inline double EDis(double x1, double y1, double z1, double x2, double y2, double z2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2)); }
inline ll Pow(ll a, ll n) { ll t = 1; while (n) { if (n & 1) t = t * a % MOD; a = a * a % MOD, n >>= 1; } return t % MOD; }
#define gc p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++;
inline int read(){ static char buf[1000000], *p1 = buf, *p2 = buf; register int x = false; register char ch = gc; register bool sgn = false; while (ch != '-' && (ch < '0' || ch > '9')) ch = gc; if (ch == '-') sgn = true, ch = gc; while (ch >= '0'&& ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc; return sgn ? -x : x; }
//emplace unordered 能ll就开 函数内判非法

const int N = 1e5 + 100;
int res[N];

int calc(int x, int y)
{
	if (!x || !y)
		return 0;
	if (x == y)
		return x * 2 - 1;
	return min(x, y) * 2;
}
int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
	//freopen("C:/output.txt", "w", stdout);
#endif
	int a, b, c, d, n;
	cin >> a >> b >> c >> d;
	n = a + b + c + d;
	//间断!!!
	for (int A = 0; A <= 2; ++A) //在边
		for (int B = 0; B <= 2; ++B)
			for (int C = 0; C <= 2; ++C)
				for (int D = 0; D <= 2; ++D)
					if (A + B + C + D == 2)
					{
						int ab = a * 2 - A;
						int bc = b * 2 - ab - B;
						int cd = c * 2 - bc - C;
						if (ab > calc(a, b) || bc > calc(b, c) || cd > calc(c, d))
							break;
						if (ab + bc + cd != n - 1 ||
							ab < 0  || ab > b * 2 || ab + bc != b * 2 - B ||
							bc < 0 || bc > c * 2 || bc + cd != c * 2 - C ||
							cd < 0 || cd > d * 2 || cd + D != d * 2)
							break;
						cout << "YES" << endl;
						A ? res[1] = 0, --A : 0;
						A ? res[n] = 0, --A : 0;
						B ? res[1] = 1, --B : 0;
						B ? res[n] = 1, --B : 0;
						C ? res[1] = 2, --C : 0;
						C ? res[n] = 2, --C : 0;
						D ? res[1] = 3, --D : 0;
						D ? res[n] = 3, --D : 0;
						for (int i = 2; i < n; ++i)
						{
							if (res[i - 1] == 0)
								res[i] = 1;
							else if (res[i - 1] == 1)
							{
								if (ab >= bc)
									res[i] = 0, --ab;
								else
									res[i] = 2, --bc;
							}
							else if (res[i - 1] == 2)
							{
								if (bc >= cd)
									res[i] = 1, --bc;
								else
									res[i] = 3, --cd;
							}
							else
								res[i] = 2, --cd;
						}
						for (int i = 1; i <= n; ++i)
							printf("%d ", res[i]);
						putchar('\n');
						return 0;
					}
	cout << "NO" << endl;

	return TIME;
}


#include <random>
#include <stdio.h>
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<int, int> pii;
#define Continue(x) { x; continue; }
#define Break(x) { x; break; }
#define Return(x) { x; return; }
#define P2(x) ((x) * (x))
#define lowbit(x) ((x) & -(x))
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#define MEM(x, y) memset((x), (y), sizeof(x))
#define MEN(x, y, z) memset((x), (y), sizeof((x)[0]) * (z))
#define Diz(x) (lower_bound(dz.begin(), dz.end(), (x)) - dz.begin())
#define DISCRETIZA(x) (x).push_back(-INF), sort((x).begin(), (x).end()), (x).erase(unique((x).begin(), (x).end()), (x).end())
#ifdef LOCAL
#define DEBUG(...) cout << ">> " << #__VA_ARGS__ << " =", PRT(__VA_ARGS__), cout << endl;
#define DEBUGS(...) cout << ">> " << #__VA_ARGS__ << " =", PRTS(__VA_ARGS__), cout << endl;
void PRT() {} template <typename S, typename... T> void PRT(S x, T ... y){ cout << " " << x; PRT(y...); }
void PRTS() {} template <typename S> void PRTS(S x) { for (auto v : x) cout << " " << v; }
#define TIME cout << "RunTime: " << clock() << "ms\n", 0
#define __int128_t long long
#else
#define DEBUG(...) ;
#define DEBUGS(...) ;
#define TIME 0
#endif

const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = 1e9 + 7;
template<typename S, typename T> inline bool Min(S &a, const T &b){ return a > b ? a = b, true : false; }
template<typename S, typename T> inline bool Max(S &a, const T &b){ return a < b ? a = b, true : false; }
template<typename S, typename T> inline void Adm(S &a, const T &b){ a = (a + b) % MOD; if (a < 0) a += MOD; }
template<typename S, typename T> inline void Mum(S &a, const T &b){ a = 1LL * a * b % MOD; }
template<typename T> inline bool IsPri(T x) { if (x < 2) return false; for (T i = 2; i * i <= x; ++i) if (x % i == 0) return false; return true; }
template<typename T> inline T Gcd(T a, T b){ while (b){ T t = b; b = a % b; a = t; } return a; }
template<typename T> inline int BitCnt(T x){ int cnt = 0; while (x)++cnt, x &= x - 1; return cnt; }
template<typename T> inline T MDis(T x1, T y1, T x2, T y2){ return abs(x1 - x2) + abs(y1 - y2); }
template<typename T> inline T MDis(T x1, T y1, T z1, T x2, T y2, T z2){ return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); }
inline double EDis(double x1, double y1, double x2, double y2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); }
inline double EDis(double x1, double y1, double z1, double x2, double y2, double z2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2)); }
inline ll Pow(ll a, ll n) { ll t = 1; a %= MOD; while (n) { if (n & 1) t = t * a % MOD; a = a * a % MOD, n >>= 1; } return t % MOD; }
#define gc p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++;
inline int read(){ static char buf[1000000], *p1 = buf, *p2 = buf; register int x = false; register char ch = gc; register bool sgn = false; while (ch != '-' && (ch < '0' || ch > '9')) ch = gc; if (ch == '-') sgn = true, ch = gc; while (ch >= '0'&& ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc; return sgn ? -x : x; }

const int N = 1e5 + 100;
int a[4], b[4], c[N];

int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	cin >> a[0] >> a[1] >> a[2] >> a[3];
	int n = a[0] + a[1] + a[2] + a[3];
	if (n == 1)
		for (int i = 0; i < 4; ++i)
			if (a[i])
				printf("YES\n%d\n", i), exit(0);
	for (int st = 0; st < 4; ++st)
	{
		memcpy(b, a, sizeof(a));
		int flag = 1;
		for (int i = 1; i <= n; ++i)
		{
			if (i == 1)
				c[i] = st;
			else if (!(c[i - 1] & 2))
			{
				if (b[c[i - 1] ^ 1])
					c[i] = c[i - 1] ^ 1;
				else
					c[i] = 2;
			}
			else
			{
				if (b[c[i - 1] ^ 1])
					c[i] = c[i - 1] ^ 1;
				else
					c[i] = 1;
			}
			if (--b[c[i]] < 0)
				flag = 0;
			if (i > 1 && abs(c[i] - c[i - 1]) != 1)
				flag = 0;
		}
		if (flag)
		{
			puts("YES");
			for (int i = 1; i <= n; ++i)
				printf("%d ", c[i]);
			cout << endl, exit(0);
		}
	}
	puts("NO");

	return TIME;
}


//#pragma GCC optimize(3)
#include <random>
#include <stdio.h>
#include <bits/stdc++.h>
#include <unordered_set>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<int, int> pii;
#define Continue(x) { x; continue; }
#define Break(x) { x; break; }
#define Return(x) { x; return; }
#define P2(x) ((x) * (x))
#define lowbit(x) ((x) & -(x))
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(), (x).end()
#define MEM(x, y) memset((x), (y), sizeof(x))
#define MEN(x, y, z) memset((x), (y), sizeof((x)[0]) * (z))
#define Diz(x) (lower_bound(dz.begin(), dz.end(), (x)) - dz.begin())
#define DISCRETIZA(x) (x).push_back(-INF), sort((x).begin(), (x).end()), (x).erase(unique((x).begin(), (x).end()), (x).end())
#ifdef LOCAL
#define DEBUG(...) cout << ">> " << #__VA_ARGS__ << " =", PRT(__VA_ARGS__), cout << endl;
#define DEBUGS(...) cout << ">> " << #__VA_ARGS__ << " =", PRTS(__VA_ARGS__), cout << endl;
void PRT() {} template <typename S, typename... T> void PRT(S x, T ... y){ cout << " " << x; PRT(y...); }
void PRTS() {} template <typename S> void PRTS(S x) { for (auto v : x) cout << " " << v; }
#define TIME cout << "RunTime: " << clock() << "ms\n", 0
#define __int128_t long long
#else
#define DEBUG(...) ;
#define DEBUGS(...) ;
#define TIME 0
#endif

const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int MOD = 1e9 + 7;
template<typename S, typename T> inline bool Min(S &a, const T &b){ return a > b ? a = b, true : false; }
template<typename S, typename T> inline bool Max(S &a, const T &b){ return a < b ? a = b, true : false; }
template<typename S, typename T> inline void Adm(S &a, const T &b){ a = (a + b) % MOD; if (a < 0) a += MOD; }
template<typename S, typename T> inline void Mum(S &a, const T &b){ a = 1LL * a * b % MOD; }
template<typename T> inline bool IsPri(T x) { if (x < 2) return false; for (T i = 2; i * i <= x; ++i) if (x % i == 0) return false; return true; }
template<typename T> inline T Gcd(T a, T b){ while (b){ T t = b; b = a % b; a = t; } return a; }
template<typename T> inline int BitCnt(T x){ int cnt = 0; while (x)++cnt, x &= x - 1; return cnt; }
template<typename T> inline T MDis(T x1, T y1, T x2, T y2){ return abs(x1 - x2) + abs(y1 - y2); }
template<typename T> inline T MDis(T x1, T y1, T z1, T x2, T y2, T z2){ return abs(x1 - x2) + abs(y1 - y2) + abs(z1 - z2); }
inline double EDis(double x1, double y1, double x2, double y2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); }
inline double EDis(double x1, double y1, double z1, double x2, double y2, double z2){ return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2)); }
inline ll Pow(ll a, ll n) { ll t = 1; while (n) { if (n & 1) t = t * a % MOD; a = a * a % MOD, n >>= 1; } return t % MOD; }
#define gc p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++;
inline int read(){ static char buf[1000000], *p1 = buf, *p2 = buf; register int x = false; register char ch = gc; register bool sgn = false; while (ch != '-' && (ch < '0' || ch > '9')) ch = gc; if (ch == '-') sgn = true, ch = gc; while (ch >= '0'&& ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc; return sgn ? -x : x; }
//emplace unordered 能ll就开 函数内判非法

const int N = 1e5 + 100;
int res[N];

int calc(int x, int y)
{
	if (!x || !y)
		return 0;
	if (x == y)
		return x * 2 - 1;
	return min(x, y) * 2;
}
int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
	//freopen("C:/output.txt", "w", stdout);
#endif
	int a, b, c, d, n;
	cin >> a >> b >> c >> d;
	n = a + b + c + d;
	//间断!!!
	for (int D = 0; D <= 2; ++D)
		for (int C = 0; C <= 2; ++C)
			for (int B = 0; B <= 2; ++B)
				for (int A = 0; A <= 2; ++A) //在边
					if (A + B + C + D == 2)
					{
						int ab = a * 2 - A;
						int bc = b * 2 - ab - B;
						int cd = c * 2 - bc - C;
						if (ab > calc(a, b)  || bc > calc(b, c) || cd > calc(c, d))
							break;
						if (ab + bc + cd != n - 1 ||
							ab < 0  || ab > b * 2 || ab + bc != b * 2 - B ||
							bc < 0 || bc > c * 2 || bc + cd != c * 2 - C ||
							cd < 0 || cd > d * 2 || cd + D != d * 2)
							break;
						int AA = A, BB = B, CC = C, DD = D;
						AA ? res[1] = 0, --AA : 0;
						AA ? res[n] = 0, --AA : 0;
						if (!A)
						BB ? res[1] = 1, --BB : 0;
						BB ? res[n] = 1, --BB : 0;
						if (!A && !B)
						CC ? res[1] = 2, --CC : 0;
						CC ? res[n] = 2, --CC : 0;
						if (!A && !B && !C)
						DD ? res[1] = 3, --DD : 0;
						DD ? res[n] = 3, --DD : 0;
						for (int i = 2; i < n; ++i)
						{
							if (res[i - 1] == 0)
								res[i] = 1, --ab;
							else if (res[i - 1] == 1)
							{
								if (ab >= bc)
									res[i] = 0, --ab;
								else
									res[i] = 2, --bc;
							}
							else if (res[i - 1] == 2)
							{
								if (bc >= cd)
									res[i] = 1, --bc;
								else
									res[i] = 3, --cd;
							}
							else
								res[i] = 2, --cd;
						}
						int aa = 0, bb = 0, cc = 0, dd = 0, flag = 1;
						for (int i = 1; i <= n; ++i)
						{
							if (res[i] == 0)
								++aa;
							if (res[i] == 1)
								++bb;
							if (res[i] == 2)
								++cc;
							if (res[i] == 3)
								++dd;
							if (i > 1 && abs(res[i] - res[i - 1]) != 1)
							{
								flag = 0;
								break;
							}
						}
						if (aa != a || bb != b || cc != c || dd != d || !flag)
							break;
						for (int i = 1; i <= n; ++i)
							if (res[i] > res[n - i + 1])
							{
								flag = 0;
								break;
							}
							else if (res[i] < res[n - i + 1])
								break;
						if (!flag)
							reverse(res + 1, res + n + 1);
						cout << "YES" << endl;
						for (int i = 1; i <= n; ++i)
							printf("%d ", res[i]);
						putchar('\n');
						return 0;
					}
	cout << "NO" << endl;

	return TIME;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=200005;
using namespace std;

int ans[N],j=0;
int main(){
    int a[4];
    int i,j,s=0;
    for(i=0;i<4;i++) {cin>>a[i];s+=a[i];}
    int d=1,e=0;
    for(int k=0;k<2;k++){
        memset(ans,-1,sizeof(ans));
        d=1;e=0;
        for(i=0;i<4;i++){
            if((k+i)&1){
                for(j=0;j<a[i];j++,d+=2) ans[d]=i;
            }else {
                for(j=0;j<a[i];j++,e+=2) ans[e]=i;
            }
        }
        bool f=true;
        for(i=0;i<s-1;i++){
            if(ans[i]==-1 || abs(ans[i]-ans[i+1])!=1) f=false;
        }
        if(ans[s-1]==-1) f=false;
        if(f){
            printf("YES\n");
            for(i=0;i<s;i++) printf("%d ",ans[i]);
            return 0;
        }
    }
    printf("NO\n");
    return 0;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=100005;
using namespace std;

int ans[N],j=0;
bool check(int a,int b,int c,int d){
    for(int i=0;i<a-1;i++) {ans[j++]=0;ans[j++]=1;}
    ans[j++]=0;
    b-=a-1;
    if(b==0){
        if(c>0 || d>0) return false;
        return true;
    } else{
        for(int i=0;i<b-1;i++) {ans[j++]=1;ans[j++]=2;}
        ans[j++]=1;
        c-=b-1;
        if(c<0) return false;
        for(int i=0;i<d;i++) {ans[j++]=2;ans[j++]=3;}
        if(c==d+1) ans[j++]=2;
        if(c==d || c==d+1) return true;
        else return false;
    }
}
int main(){
    int a,b,c,d,i;
    cin>>a>>b>>c>>d;
    bool f=true;
    if(a>0 && b<a-1 || d>0 && c<d-1) f=false;
    else{
        if(a>0) f=check(a,b,c,d);
        if(a==0 && d>0 || a>0 && !f && d>0) {
            f=check(d,c,b,a);
            for(i=0;i<j/2;i++){
                swap(ans[i],ans[j-i-1]);
                ans[i]=3-ans[i];
                ans[j-i-1]=3-ans[j-i-1];
            }
        }
        if(a==0 && d==0){
            f=(b==c || b==c+1 || b==c-1);
            if(b==c-1){
                for(i=0;i<b;i++){
                    ans[j++]=2;ans[j++]=1;
                }
                ans[j++]=2;
            }else{
                for(i=0;i<c;i++){
                    ans[j++]=1;ans[j++]=2;
                }
                if(b==c+1) ans[j++]=1;
            }
        }
    }
    if(!f) printf("NO\n");
    else {
        printf("YES\n");
        for(i=0;i<j;i++)
            printf("%d ",ans[i]);
    }
    return 0;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=100005;
using namespace std;

int ans[N],j=0;
bool check(int a,int b,int c,int d){
    j=0;
    for(int i=0;i<a-1;i++) {ans[j++]=0;ans[j++]=1;}
    ans[j++]=0;
    b-=a-1;
    if(b==0){
        if(c>0 || d>0) return false;
        return true;
    } else{
        for(int i=0;i<b-1;i++) {ans[j++]=1;ans[j++]=2;}
        ans[j++]=1;
        c-=b-1;
        if(c<0) return false;
        for(int i=0;i<d;i++) {ans[j++]=2;ans[j++]=3;}
        if(c==d+1) ans[j++]=2;
        if(c==d || c==d+1) return true;
        else return false;
    }
}
int main(){
    int a,b,c,d,i;
    cin>>a>>b>>c>>d;
    bool f=true;
    if(a>0 && b<a-1 || d>0 && c<d-1) f=false;
    else{
        if(a>0) f=check(a,b,c,d);
        if(a==0 && d>0 || a>0 && !f && d>0) {
            f=check(d,c,b,a);
            for(i=0;i<j/2;i++){
                swap(ans[i],ans[j-i-1]);
                ans[i]=3-ans[i];
                ans[j-i-1]=3-ans[j-i-1];
            }
        }
        if(a==0 && d==0){
            f=(b==c || b==c+1 || b==c-1);
            if(b==c-1){
                for(i=0;i<b;i++){
                    ans[j++]=2;ans[j++]=1;
                }
                ans[j++]=2;
            }else{
                for(i=0;i<c;i++){
                    ans[j++]=1;ans[j++]=2;
                }
                if(b==c+1) ans[j++]=1;
            }
        }
    }
    if(!f) printf("NO\n");
    else {
        printf("YES\n");
        for(i=0;i<j;i++)
            printf("%d ",ans[i]);
    }
    return 0;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=100005;
using namespace std;

int ans[N],j=0;
int main(){
    int a[4];
    int i,j,s=0;
    for(i=0;i<4;i++) {cin>>a[i];s+=a[i];}
    int d=1,e=0;
    for(int k=0;k<2;k++){
        memset(ans,-1,sizeof(ans));
        d=1;e=0;
        for(i=0;i<4;i++){
            if((k+i)&1){
                for(j=0;j<a[i];j++,d+=2) ans[d]=i;
            }else {
                for(j=0;j<a[i];j++,e+=2) ans[e]=i;
            }
        }
        bool f=true;
        for(i=0;i<s-1;i++){
            if(ans[i]==-1 || abs(ans[i]-ans[i+1])!=1) f=false;
        }
        if(ans[s-1]==-1) f=false;
        if(f){
            printf("YES\n");
            for(i=0;i<s;i++) printf("%d ",ans[i]);
            return 0;
        }
    }
    printf("NO\n");
    return 0;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=100005;
using namespace std;

int ans[N],j=0;
bool check(int a,int b,int c,int d){
    j=0;
    for(int i=0;i<a-1;i++) {ans[j++]=0;ans[j++]=1;}
    ans[j++]=0;
    b-=a-1;
    if(b==0){
        if(c>0 || d>0) return false;
        return true;
    } else{
        for(int i=0;i<b-1;i++) {ans[j++]=1;ans[j++]=2;}
        ans[j++]=1;
        c-=b-1;
        if(c<0) return false;
        for(int i=0;i<d;i++) {ans[j++]=2;ans[j++]=3;}
        if(c==d+1) ans[j++]=2;
        //cout<<j<<endl;
        if(c==d || c==d+1) return true;
        else return false;
    }
}
int main(){
    int a,b,c,d,i;
    cin>>a>>b>>c>>d;
    bool f=true;
    if((a>0 && b<a-1) || (d>0 && c<d-1)) f=false;
    else{
        if(a>0) f=check(a,b,c,d);
        if((a==0 && d>0) || (!f && d>0)) {
            f=check(d,c,b,a);
            for(i=0;i<j/2;i++){
                swap(ans[i],ans[j-i-1]);
                ans[i]=3-ans[i];
                ans[j-i-1]=3-ans[j-i-1];
            }
            if(j&1) ans[j/2]=3-ans[j/2];
        }
        if(a==0 && d==0){
            f=(b==c || b==c+1 || b==c-1);
            if(b==c-1){
                for(i=0;i<b;i++){
                    ans[j++]=2;ans[j++]=1;
                }
                ans[j++]=2;
            }else if(b==c+1 || b==c){
                for(i=0;i<c;i++){
                    ans[j++]=1;ans[j++]=2;
                }
                if(b==c+1) ans[j++]=1;
            }
        }
    }
    if(!f) printf("NO\n");
    else {
        printf("YES\n");
        for(i=0;i<j;i++)
            printf("%d ",ans[i]);
    }
    return 0;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=100005;
using namespace std;

int ans[N],j=0;
bool check(int a,int b,int c,int d){
    for(int i=0;i<a-1;i++) {ans[j++]=0;ans[j++]=1;}
    ans[j++]=0;
    b-=a-1;
    if(b==0){
        if(c>0 || d>0) return false;
        return true;
    } else{
        for(int i=0;i<b-1;i++) {ans[j++]=1;ans[j++]=2;}
        ans[j++]=1;
        c-=b-1;
        if(c<0) return false;
        for(int i=0;i<d;i++) {ans[j++]=2;ans[j++]=3;}
        if(c==d+1) ans[j++]=2;
        if(c==d || c==d+1) return true;
        else return false;
    }
}
int main(){
    int a,b,c,d,i;
    cin>>a>>b>>c>>d;
    bool f=true;
    if(a>0 && b<a-1 || d>0 && c<d-1) f=false;
    else{
        if(a>0) {
            f=check(a,b,c,d);
        } else if(d>0) {
            f=check(d,c,b,a);
            for(i=0;i<j/2;i++){
                swap(ans[i],ans[j-i-1]);
                ans[i]=3-ans[i];
                ans[j-i-1]=3-ans[j-i-1];
            }
        }
        else{
            f=(b==c || b==c+1 || b==c-1);
            if(b==c-1){
                for(i=0;i<b;i++){
                    ans[j++]=2;ans[j++]=1;
                }
                ans[j++]=2;
            }else{
                for(i=0;i<c;i++){
                    ans[j++]=1;ans[j++]=2;
                }
                if(b==c+1) ans[j++]=1;
            }
        }
    }
    if(!f) printf("NO\n");
    else {
        printf("YES\n");
        for(i=0;i<j;i++)
            printf("%d ",ans[i]);
    }
    return 0;
}


#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<iterator>
#include<iostream>
#include<list>
#include<map>
#include<memory>
#include<queue>
#include<set>
#include<stack>
#include<string>
#include<vector>
#include<utility>
#include<bitset>
#include<functional>
#define ll long long
const int N=100005;
using namespace std;

int ans[N],j=0;
bool check(int a,int b,int c,int d){
    j=0;
    for(int i=0;i<a-1;i++) {ans[j++]=0;ans[j++]=1;}
    ans[j++]=0;
    b-=a-1;
    if(b==0){
        if(c>0 || d>0) return false;
        return true;
    } else{
        for(int i=0;i<b-1;i++) {ans[j++]=1;ans[j++]=2;}
        ans[j++]=1;
        c-=b-1;
        if(c<0) return false;
        for(int i=0;i<d;i++) {ans[j++]=2;ans[j++]=3;}
        if(c==d+1) ans[j++]=2;
        //cout<<j<<endl;
        if(c==d || c==d+1) return true;
        else return false;
    }
}
int main(){
    int a,b,c,d,i;
    cin>>a>>b>>c>>d;
    bool f=true;
    if((a>0 && b<a-1) || (d>0 && c<d-1)) f=false;
    else{
        if(a>0) f=check(a,b,c,d);
        if((a==0 && d>0) || (!f && d>0)) {
            f=check(d,c,b,a);
            for(i=0;i<j/2;i++){
                swap(ans[i],ans[j-i-1]);
                ans[i]=3-ans[i];
                ans[j-i-1]=3-ans[j-i-1];
            }
            if(j&1) ans[j/2]=3-ans[j/2];
        }
        if(a==0 && d==0){
            f=(b==c || b==c+1 || b==c-1);
            if(b==c-1){
                for(i=0;i<b;i++){
                    ans[j++]=2;ans[j++]=1;
                }
                ans[j++]=2;
            }else{
                for(i=0;i<c;i++){
                    ans[j++]=1;ans[j++]=2;
                }
                if(b==c+1) ans[j++]=1;
            }
        }
    }
    if(!f) printf("NO\n");
    else {
        printf("YES\n");
        for(i=0;i<j;i++)
            printf("%d ",ans[i]);
    }
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c - 1 && (b != 0 && c != 0)) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1== d)) {
        c += b;
        c++;
        b++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c - 1 && (b != 0 && c != 0)) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    int sft = 0;
    while (a == 0) {
        a = b, b = c, c = d, d = 0;
        sft++;
    }
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] +sft);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] + sft);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c - 1) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1== d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c - 1) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i]);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i]);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c && (b != 0 && c != 0)) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c && (b != 0 && c != 0)) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    int sft = 0;
    while (a == 0) {
        a = b, b = c, c = d, d = 0;
        sft++;
    }
    if (a == 1 && b == 0 && c == 0 && d == 0) {
        return printf("YES\n%d", sft), 0;
    }
    if (c == 0 && d == 0 && b == a - 1) {
        puts("YES");
        for (int i = 0; i < tot; ++i) {
            putchar('0' + (i & 1) + sft);
            putchar(' ');
        }
        return 0;
    }
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] + sft);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] + sft);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c - 1 && (b != 0 && c != 0)) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c - 1 && (b != 0 && c != 0)) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    int sft = 0;
    while (a == 0) {
        a = b, b = c, c = d, d = 0;
        sft++;
    }
    if (a == 1 && b == 0 && c == 0 && d == 0) {
        return printf("YES\n%d", sft), 0;
    }
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] +sft);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] + sft);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c - 1) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1== d)) {
        c += b;
        c++;
        b++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c - 1) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i]);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i]);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c && (b != 0 && c != 0)) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c && (b != 0 && c != 0)) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    int sft = 0;
    while (a == 0) {
        a = b, b = c, c = d, d = 0;
        sft++;
    }
    if (a == 1 && b == 0 && c == 0 && d == 0) {
        return printf("YES\n%d", sft), 0;
    }
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] +sft);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] + sft);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <set>
#include <ctime>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <stack>
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;

namespace FastIO {
	template<typename tp> inline void read(tp &x) {
		x=0; register char c=getchar(); register bool f=0;
		for(;c<'0'||c>'9';f|=(c=='-'),c = getchar());
		for(;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-'0',c = getchar());
		if(f) x=-x;
	}
	template<typename tp> inline void write(tp x) {
		if (x==0) return (void) (putchar('0'));
		if (x<0) putchar('-'),x=-x;
		int pr[20]; register int cnt=0;
		for (;x;x/=10) pr[++cnt]=x%10;
		while (cnt) putchar(pr[cnt--]+'0');
	}
	template<typename tp> inline void writeln(tp x) {
		write(x);
		putchar('\n');
	}
}
using namespace FastIO;

const int N = 4e5 + 5;

int a, b, c, d, tot;

int ans[N];

bool way1() {
    if (b <= a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
    }
    b--;
    b -= a;
    if (b > c && (b != 0 && c != 0)) {
        b += a;
        b++;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

bool way2() {
    if (b < a) return 0;
    int cnt = 0;
    for (int i = 1; i <= (a << 1); ++i) {
        ans[++cnt] = (i & 1) ^ 1;
    }
    b -= a;
    if (b > c && (b != 0 && c != 0)) {
        b += a;
        return 0;
    }
    for (int i= 1; i <= (b << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt]++;
    }
    c--;
    c -= b;
    if (!(c == d || c + 1 == d)) {
        c += b;
        c++;
        b += a;
        return 0;
    }
    for (int i = 1; i <= (c << 1) + 1; ++i) {
        ans[++cnt] = i & 1;
        ans[cnt] += 2;
    }
    return 1;
}

int main() {
    read(a), read(b), read(c), read(d);
    tot = a + b + c + d;
    int sft = 0;
    while (a == 0) {
        a = b, b = c, c = d, d = 0;
        sft++;
    }
    if (a == 1 && b == 0 && c == 0 && d == 0) {
        return printf("YES\n%d", sft), 0;
    }
    if (c == 0 && d == 0 && b == a - 1) {
        puts("YES");
        for (int i = 0; i < tot; ++i) {
            putchar('0' + (i & 1));
            putchar(' ');
        }
        return 0;
    }
    if (way1()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] +sft);
        }
        return 0;
    }
    if (way2()) {
        puts("YES");
        for (int i= 1; i <= tot; ++i) {
            printf("%d ", ans[i] + sft);
        }
        return 0;
    }
    puts("NO");
    return 0;
}


#include <iostream>
#include <vector>
using namespace std;

vector<int> ans1,ans2,ans;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	for (int i = 0; i <= 3; i++)
	{
		ans.clear();
		int cnt[] = {a,b,c,d};
		if( cnt[i] == 0 ) continue;
		ans.push_back(i);
		cnt[i] --;
		int id = i;
		while( 1 )
		{
			if( id == 0 )
			{
				id ++;
				if( cnt[id] == 0 ) break;
			}else if( id == 1 || id == 2 )
			{
				if( cnt[id+1] == 0 && cnt[id-1] == 0 ) break;
				if( cnt[id+1] == 0 ) id --;
				else id ++;
			}else
			{
				id --;
				if( cnt[id] == 0 ) break;
			}
			ans.push_back(id);
			cnt[id] --;
		}
		if( ans.size() == a + b + c + d )
		{
			cout << "YES" << '\n';
			for (int i = 0; i < ans.size(); i++)
			{
				cout << ans[i];
				if( i == ans.size() - 1 ) cout << '\n';
				else cout << ' ';
			}
			return 0;
		}
	}
	cout << "NO" << '\n';
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

vector<int> ans1,ans2,ans;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	if( a == 0 && b == 0 )
	{
		ans.push_back(-1);
		for (int i = 0; i < min(c,d); i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		if( c - d  == 1 )
		{
			ans[0] = 2;
		}else if( d - c == 1 ) ans.push_back(3);
		else if( d != c )
		{
			cout << "NO" << '\n';
			return 0;
		}
		cout << "YES" << '\n';
		for (int i = 0; i < ans.size(); i++)
		{
			if( ans[i] == -1 ) continue;
			cout << ans[i];
			if( i != ans.size() - 1 ) cout << ' ';
			else cout << '\n';
		}
		return 0;
	}else if( c == 0 && d == 0 )
	{
		ans.push_back(-1);
		for (int i = 0; i < min(a,b); i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		if( a - b  == 1 )
		{
			ans[0] = 0;
		}else if( b - a == 1 ) ans.push_back(1);
		else if( b != a )
		{
			cout << "NO" << '\n';
			return 0;
		}
		cout << "YES" << '\n';
		for (int i = 0; i < ans.size(); i++)
		{
			if( ans[i] == -1 ) continue;
			cout << ans[i];
			if( i != ans.size() - 1 ) cout << ' ';
			else cout << '\n';
		}
		return 0;
	}
	if( a > b || d > c )
	{
		cout << "NO" << '\n';
		return 0;
	}
	b -= a;
	c -= d;
	if( b <= c )
	{
		for (int i = 0; i < a; i++)
		{
			ans.push_back(0);
			ans.push_back(1);
		}
		for (int i = 0; i < d; i++)
		{
			ans.push_back(2);
			ans.push_back(3);
		}
		for (int i = 0; i < b; i++)
		{
			ans.push_back(2);
			ans.push_back(1);
		}
		c -= b;
		if( c > 1 )
		{
			cout << "NO" << '\n';
			return 0;
		}
		else if( c == 1 ) ans.push_back(2);
	}else
	{
		for (int i = 0; i < d; i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		for (int i = 0; i < a; i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		for (int i = 0; i < c; i++)
		{
			ans.push_back(1);
			ans.push_back(2);
		}
		b -= c;
		if( b > 1 )
		{
			cout << "NO" << '\n';
			return 0;
		}
		else if( b == 1) ans.push_back(1);
	}
	cout << "YES" << '\n';
	for (int i = 0; i < ans.size(); i++)
	{
		cout << ans[i];
		if( i == ans.size() - 1 ) cout << '\n';
		else cout << ' ';
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

vector<int> ans1,ans2,ans;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	if( a == 0 && b == 0 )
	{
		ans.push_back(-1);
		for (int i = 0; i < min(c,d); i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		if( c - d  == 1 )
		{
			ans[0] = 2;
		}else if( d - c == 1 ) ans.push_back(3);
		else if( d != c )
		{
			cout << "NO" << '\n';
			return 0;
		}
		cout << "YES" << '\n';
		for (int i = 0; i < ans.size(); i++)
		{
			if( ans[i] == -1 ) continue;
			cout << ans[i];
			if( i != ans.size() - 1 ) cout << ' ';
			else cout << '\n';
		}
		return 0;
	}else if( c == 0 && d == 0 )
	{
		ans.push_back(-1);
		for (int i = 0; i < min(a,b); i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		if( a - b  == 1 )
		{
			ans[0] = 0;
		}else if( b - a == 1 ) ans.push_back(1);
		else if( b != a )
		{
			cout << "NO" << '\n';
			return 0;
		}
		cout << "YES" << '\n';
		for (int i = 0; i < ans.size(); i++)
		{
			if( ans[i] == -1 ) continue;
			cout << ans[i];
			if( i != ans.size() - 1 ) cout << ' ';
			else cout << '\n';
		}
		return 0;
	}
	if( a > b || d > c )
	{
		cout << "NO" << '\n';
		return 0;
	}
	b -= a;
	c -= d;
	if( b <= c )
	{
		for (int i = 0; i < a; i++)
		{
			ans.push_back(0);
			ans.push_back(1);
		}
		for (int i = 0; i < d; i++)
		{
			ans.push_back(2);
			ans.push_back(3);
		}
		for (int i = 0; i < b; i++)
		{
			ans.push_back(2);
			ans.push_back(1);
		}
		c -= b;
		if( c > 1 )
		{
			cout << "NO" << '\n';
			return 0;
		}
		else if( c == 1 ) ans.push_back(2);
	}else
	{
		for (int i = 0; i < d; i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		for (int i = 0; i < a; i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		for (int i = 0; i < c; i++)
		{
			ans.push_back(1);
			ans.push_back(2);
		}
		b -= c;
		if( b > 1 ) cout << "NO" << '\n';
		else if( b == 1) ans.push_back(1);
	}
	cout << "YES" << '\n';
	for (int i = 0; i < ans.size(); i++)
	{
		cout << ans[i];
		if( i == ans.size() - 1 ) cout << '\n';
		else cout << ' ';
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

vector<int> ans1,ans2,ans;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	if( a > b || d > c )
	{
		cout << "NO" << '\n';
		return 0;
	}
	b -= a;
	c -= d;
	if( b <= c )
	{
		for (int i = 0; i < a; i++)
		{
			ans.push_back(0);
			ans.push_back(1);
		}
		for (int i = 0; i < d; i++)
		{
			ans.push_back(2);
			ans.push_back(3);
		}
		for (int i = 0; i < b; i++)
		{
			ans.push_back(2);
			ans.push_back(1);
		}
		c -= b;
		if( c > 1 )
		{
			cout << "NO" << '\n';
			return 0;
		}
		else if( c == 1 ) ans.push_back(2);
	}else
	{
		for (int i = 0; i < d; i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		for (int i = 0; i < a; i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		for (int i = 0; i < c; i++)
		{
			ans.push_back(1);
			ans.push_back(2);
		}
		b -= c;
		if( b > 1 ) cout << "NO" << '\n';
		else if( b == 1) ans.push_back(1);
	}
	cout << "YES" << '\n';
	for (int i = 0; i < ans.size(); i++)
	{
		cout << ans[i];
		if( i == ans.size() - 1 ) cout << '\n';
		else cout << ' ';
	}
	return 0;
}


#include <iostream>
#include <vector>
using namespace std;

vector<int> ans1,ans2,ans;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	if( a == 0 && b == 0 )
	{
		for (int i = 0; i < min(c,d); i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		if( c - d  == 1 )
		{
			cout << 2;
			if( d == 0 ) cout << '\n';
			else cout << ' ';
		}else if( d - c == 1 ) ans.push_back(3);
		else if( d != c )
		{
			cout << "NO" << '\n';
			return 0;
		}
		for (int i = 0; i < ans.size(); i++)
		{
			cout << ans[i];
			if( i != ans.size() - 1 ) cout << ' ';
			else cout << '\n';
		}
		return 0;
	}else if( c == 0 && d == 0 )
	{
		for (int i = 0; i < min(a,b); i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		if( a - b  == 1 )
		{
			cout << 0;
			if( b == 0 ) cout << '\n';
			else cout << ' ';
		}else if( b - a == 1 ) ans.push_back(1);
		else if( b != a )
		{
			cout << "NO" << '\n';
			return 0;
		}
		for (int i = 0; i < ans.size(); i++)
		{
			cout << ans[i];
			if( i != ans.size() - 1 ) cout << ' ';
			else cout << '\n';
		}
		return 0;
	}
	if( a > b || d > c )
	{
		cout << "NO" << '\n';
		return 0;
	}
	b -= a;
	c -= d;
	if( b <= c )
	{
		for (int i = 0; i < a; i++)
		{
			ans.push_back(0);
			ans.push_back(1);
		}
		for (int i = 0; i < d; i++)
		{
			ans.push_back(2);
			ans.push_back(3);
		}
		for (int i = 0; i < b; i++)
		{
			ans.push_back(2);
			ans.push_back(1);
		}
		c -= b;
		if( c > 1 )
		{
			cout << "NO" << '\n';
			return 0;
		}
		else if( c == 1 ) ans.push_back(2);
	}else
	{
		for (int i = 0; i < d; i++)
		{
			ans.push_back(3);
			ans.push_back(2);
		}
		for (int i = 0; i < a; i++)
		{
			ans.push_back(1);
			ans.push_back(0);
		}
		for (int i = 0; i < c; i++)
		{
			ans.push_back(1);
			ans.push_back(2);
		}
		b -= c;
		if( b > 1 ) cout << "NO" << '\n';
		else if( b == 1) ans.push_back(1);
	}
	cout << "YES" << '\n';
	for (int i = 0; i < ans.size(); i++)
	{
		cout << ans[i];
		if( i == ans.size() - 1 ) cout << '\n';
		else cout << ' ';
	}
	return 0;
}


#include <bits/stdc++.h>

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")

#define forn(i,n) for(int i = 0; i < int(n); i++)
#define forsn(i,s,n) for(int i = int(s); i < int(n); i++)
#define dforn(i,n) for (int i = int(n)-1; i >= 0; i--)
#define dforsn(i,s,n) for(int i = int(n)-1; i >= int(s); i--)
#define all(c) (c).begin(),(c).end()
#define pb push_back
#define fst first
#define snd second
#define FAST_IO ios::sync_with_stdio(false);cin.tie(nullptr);

using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> ii;

void startAlgo (int &a, int &b, int c1, int c2, vi &thisTira) {
    int ind = 0;
    int arr[2] = {a,b}, ch[2] = {c1,c2};
    while (arr[ind] > 0) {
        thisTira.pb(ch[ind]);
        arr[ind]--; ind = ((ind+1)&1);
    }
    a = arr[0]; b = arr[1];
}

int main() {
    FAST_IO;

    int a,b,c,d; cin >> a >> b >> c >> d;

    forn(i,(1<<5)) {
        vi tira;
        int a1 = a, b1 = b, c1 = c, d1 = d;
        if (i&1) startAlgo(a1,b1,0,1,tira);
        else startAlgo(b1,a1,1,0,tira);
        if (i&2) startAlgo(c1,b1,2,1,tira);
        else startAlgo(b1,c1,1,2,tira);
        if (i&4) startAlgo(d1,c1,3,2,tira);
        else startAlgo(c1,d1,2,3,tira);
        while (d1-- > 0) tira.pb(3);

        bool posib = true;
        forsn(i,1,tira.size()) if (abs(tira[i]-tira[i-1]) != 1) {posib = false; break;}
        if (tira.size() != a+b+c+d) posib = false;

        if (posib) {
            cout << "YES\n";
            for(auto &i : tira) cout << i << ' ';
            return 0;
        }
    }

    cout << "NO";

    return 0;
}

/// ESCRIBÍ en vez de tanto dar vueltas
/// si te parece que no va PROBALO PRIMERO!
/// CODEA LO BÁSICO PRIMERO!
/// HACE C-A-S-O-S D-E P-R-U-E-B-A.A.A.A.A!!!


#include <bits/stdc++.h>

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")

#define forn(i,n) for(int i = 0; i < int(n); i++)
#define forsn(i,s,n) for(int i = int(s); i < int(n); i++)
#define dforn(i,n) for (int i = int(n)-1; i >= 0; i--)
#define dforsn(i,s,n) for(int i = int(n)-1; i >= int(s); i--)
#define all(c) (c).begin(),(c).end()
#define pb push_back
#define fst first
#define snd second
#define FAST_IO ios::sync_with_stdio(false);cin.tie(nullptr);

using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> ii;

vi tira,tira2;

void startAlgo (int &a, int &b, int c1, int c2, vi &thisTira) {
    int ind = 0;
    int arr[2] = {a,b}, ch[2] = {c1,c2};
    while (arr[ind] > 0) {
        thisTira.pb(ch[ind]);
        arr[ind]--; ind = ((ind+1)&1);
    }
    a = arr[0]; b = arr[1];
}

int main() {
    FAST_IO;

    freopen("salida.out","w",stdout);

    int a,b,c,d; cin >> a >> b >> c >> d;
    int a1 = a, a2 = a, b1 = b, b2 = b, c1 = c, c2 = c, d1 = d, d2 = d;

    /// TIRA1
    startAlgo(a,b,0,1,tira);
    //startAlgo(b,a,1,0);
    startAlgo(c,b,2,1,tira);
    startAlgo(d,c,3,2,tira);
    while (d-- > 0) tira.pb(3);

    //startAlgo(a,b,0,1,tira);
    startAlgo(b1,a1,1,0,tira2);
    startAlgo(c1,b1,2,1,tira2);
    startAlgo(d1,c1,3,2,tira2);
    while (d1-- > 0) tira2.pb(3);

    bool posib1 = true, posib2 = true;
    forsn(i,1,tira.size()) if (abs(tira[i]-tira[i-1]) != 1) {posib1 = false; break;}
    if (tira.size() != a2+b2+c2+d2) posib1 = false;
    forsn(i,1,tira2.size()) if (abs(tira2[i]-tira2[i-1]) != 1) {posib2 = false; break;}
    if (tira2.size() != a2+b2+c2+d2) posib2 = false;

    if (!posib1 && !posib2) {
        cout << "NO";
    }
    else {
        cout << "YES\n";
        if (posib1) for(auto &i : tira) cout << i << ' ';
        else for(auto &i : tira2) cout << i << ' ';
    }

    return 0;
}

/// ESCRIBÍ en vez de tanto dar vueltas
/// si te parece que no va PROBALO PRIMERO!
/// CODEA LO BÁSICO PRIMERO!
/// HACE C-A-S-O-S D-E P-R-U-E-B-A.A.A.A.A!!!


#include <bits/stdc++.h>

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")

#define forn(i,n) for(int i = 0; i < int(n); i++)
#define forsn(i,s,n) for(int i = int(s); i < int(n); i++)
#define dforn(i,n) for (int i = int(n)-1; i >= 0; i--)
#define dforsn(i,s,n) for(int i = int(n)-1; i >= int(s); i--)
#define all(c) (c).begin(),(c).end()
#define pb push_back
#define fst first
#define snd second
#define FAST_IO ios::sync_with_stdio(false);cin.tie(nullptr);

using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> ii;

vi tira;

void startAlgo (int &a, int &b, int c1, int c2) {
    int ind = 0;
    int arr[2] = {a,b}, ch[2] = {c1,c2};
    while (arr[ind] > 0) {
        tira.pb(ch[ind]);
        arr[ind]--; ind = ((ind+1)&1);
    }
    a = arr[0]; b = arr[1];
}

int main() {
    FAST_IO;

    int a,b,c,d; cin >> a >> b >> c >> d;
    if (a == b) startAlgo(a,b,0,1);
    else startAlgo(b,a,1,0);
    startAlgo(c,b,2,1);
    startAlgo(d,c,3,2);
    while (d-- > 0) tira.pb(3);

    bool posib = true;
    forsn(i,1,tira.size()) if (abs(tira[i]-tira[i-1]) != 1) {posib = false; break;}

    if (!posib) cout << "NO";
    else {
        cout << "YES\n";
        for (auto &i : tira) cout << i << ' ';
    }

    return 0;
}

/// ESCRIBÍ en vez de tanto dar vueltas
/// si te parece que no va PROBALO PRIMERO!
/// CODEA LO BÁSICO PRIMERO!
/// HACE C-A-S-O-S D-E P-R-U-E-B-A.A.A.A.A!!!


#include <bits/stdc++.h>

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")

#define forn(i,n) for(int i = 0; i < int(n); i++)
#define forsn(i,s,n) for(int i = int(s); i < int(n); i++)
#define dforn(i,n) for (int i = int(n)-1; i >= 0; i--)
#define dforsn(i,s,n) for(int i = int(n)-1; i >= int(s); i--)
#define all(c) (c).begin(),(c).end()
#define pb push_back
#define fst first
#define snd second
#define FAST_IO ios::sync_with_stdio(false);cin.tie(nullptr);

using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> ii;

vi tira;

void startAlgo (int &a, int &b, int c1, int c2) {
    int ind = 0;
    int arr[2] = {a,b}, ch[2] = {c1,c2};
    while (arr[ind] > 0) {
        tira.pb(ch[ind]);
        arr[ind]--; ind = ((ind+1)&1);
    }
    a = arr[0]; b = arr[1];
}

int main() {
    FAST_IO;

    int a,b,c,d; cin >> a >> b >> c >> d;
    if (a == b) startAlgo(a,b,0,1);
    else startAlgo(b,a,1,0);
    startAlgo(c,b,2,1);
    startAlgo(d,c,3,2);
    startAlgo(d,d,3,3);

    bool posib = true;
    forsn(i,1,tira.size()) if (abs(tira[i]-tira[i-1]) != 1) {posib = false; break;}

    if (!posib) cout << "NO";
    else {
        cout << "YES\n";
        for (auto &i : tira) cout << i << ' ';
    }

    return 0;
}

/// ESCRIBÍ en vez de tanto dar vueltas
/// si te parece que no va PROBALO PRIMERO!
/// CODEA LO BÁSICO PRIMERO!
/// HACE C-A-S-O-S D-E P-R-U-E-B-A.A.A.A.A!!!


#include <bits/stdc++.h>

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")

#define forn(i,n) for(int i = 0; i < int(n); i++)
#define forsn(i,s,n) for(int i = int(s); i < int(n); i++)
#define dforn(i,n) for (int i = int(n)-1; i >= 0; i--)
#define dforsn(i,s,n) for(int i = int(n)-1; i >= int(s); i--)
#define all(c) (c).begin(),(c).end()
#define pb push_back
#define fst first
#define snd second
#define FAST_IO ios::sync_with_stdio(false);cin.tie(nullptr);

using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> ii;

vi tira,tira2;

void startAlgo (int &a, int &b, int c1, int c2, vi &thisTira) {
    int ind = 0;
    int arr[2] = {a,b}, ch[2] = {c1,c2};
    while (arr[ind] > 0) {
        thisTira.pb(ch[ind]);
        arr[ind]--; ind = ((ind+1)&1);
    }
    a = arr[0]; b = arr[1];
}

int main() {
    FAST_IO;

    int a,b,c,d; cin >> a >> b >> c >> d;
    int a1 = a, a2 = a, b1 = b, b2 = b, c1 = c, c2 = c, d1 = d, d2 = d;

    /// TIRA1
    startAlgo(a,b,0,1,tira);
    //startAlgo(b,a,1,0);
    startAlgo(c,b,2,1,tira);
    startAlgo(d,c,3,2,tira);
    while (d-- > 0) tira.pb(3);

    /// TIRA2
    //startAlgo(a,b,0,1,tira);
    startAlgo(b1,a1,1,0,tira2);
    startAlgo(c1,b1,2,1,tira2);
    startAlgo(d1,c1,3,2,tira2);
    while (d1-- > 0) tira2.pb(3);

    bool posib1 = true, posib2 = true;
    forsn(i,1,tira.size()) if (abs(tira[i]-tira[i-1]) != 1) {posib1 = false; break;}
    if (tira.size() != a2+b2+c2+d2) posib1 = false;
    forsn(i,1,tira2.size()) if (abs(tira2[i]-tira2[i-1]) != 1) {posib2 = false; break;}
    if (tira2.size() != a2+b2+c2+d2) posib2 = false;

    if (!posib1 && !posib2) {
        cout << "NO";
    }
    else {
        cout << "YES\n";
        if (posib1) for(auto &i : tira) cout << i << ' ';
        else for(auto &i : tira2) cout << i << ' ';
    }

    return 0;
}

/// ESCRIBÍ en vez de tanto dar vueltas
/// si te parece que no va PROBALO PRIMERO!
/// CODEA LO BÁSICO PRIMERO!
/// HACE C-A-S-O-S D-E P-R-U-E-B-A.A.A.A.A!!!


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(a==b+1 && c==0 && d==0){
		printf("0 ");
		for(int i=1;i<=b;i++) printf("1 0 ");
	}
	else if(d==c+1 && a==0 && b==0){
		printf("3 ");
		for(int i=1;i<=c;i++) printf("2 3 ");
	}
	else if(b<a || c<d || abs(b-a-c+d)>1) printf("NO");
	else{
		printf("YES\n");
		int t=min(b-a,c-d);
		if(b-a>t) printf("1 ");
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		for(int i=1;i<=t;i++) printf("2 1 ");
		if(c-d>t) printf("2 ");
	}
}


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(b<a || c<d || (b-a)/2!=(c-d)/2) printf("NO");
	else{
		printf("YES\n");
		if((b-a)&1){b--;printf("1 ");}
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		if((c-d)&1){c--;printf("2 ");}
		for(int i=1;i<=c-d;i++) printf("1 2 ");
	}
}


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(b<a || c<d || abs(b-a-c+d)<=1) printf("NO");
	else{
		printf("YES\n");
		if(b-a>c-d){b--;printf("1 ");}
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		if(c-d>b-a){c--;printf("2 ");}
		for(int i=1;i<=c-d;i++) printf("1 2 ");
	}
}


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(b<a || c<d || abs(b-a-c+d)>1) printf("NO");
	else{
		printf("YES\n");
		if(b-a>c-d){b--;printf("1 ");}
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		if(c-d>b-a){c--;printf("2 ");}
		for(int i=1;i<=c-d;i++) printf("1 2 ");
	}
}


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(b<a || c<d || abs(b-a-c+d)>1) printf("NO");
	else{
		printf("YES\n");
		if(b-a>c-d){b--;printf("1 ");}
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		if(c-d>b-a){c--;printf("2 ");for(int i=1;i<=c-d;i++) printf("1 2 ");}
		else for(int i=1;i<=c-d;i++) printf("2 1 ");
	}
}


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(b<a || c<d || abs(b-a-c+d)>1) printf("NO");
	else{
		printf("YES\n");
		int t=min(b-a,c-d);
		if(b-a>t) printf("1 ");
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		for(int i=1;i<=t;i++) printf("2 1 ");
		if(c-d>t) printf("2 ");
	}
}


#include<bits/stdc++.h>
using namespace std;

int a,b,c,d;

int main(){
	scanf("%d %d %d %d",&a,&b,&c,&d);
	if(a==b+1 && c==0 && d==0){
		printf("YES\n");
		printf("0 ");
		for(int i=1;i<=b;i++) printf("1 0 ");
	}
	else if(d==c+1 && a==0 && b==0){
		printf("YES\n");
		printf("3 ");
		for(int i=1;i<=c;i++) printf("2 3 ");
	}
	else if(b<a || c<d || abs(b-a-c+d)>1) printf("NO");
	else{
		printf("YES\n");
		int t=min(b-a,c-d);
		if(b-a>t) printf("1 ");
		for(int i=1;i<=a;i++) printf("0 1 ");
		for(int i=1;i<=d;i++) printf("2 3 ");
		for(int i=1;i<=t;i++) printf("2 1 ");
		if(c-d>t) printf("2 ");
	}
}


#include <bits/stdc++.h>
using namespace std;
int main(){
    int stop = 2;
    bool flag = 0;
    int a,b,c,d,A,B,C,D;
    cin>>A>>B>>C>>D;

    while(stop--){
        vector<short> ans;
        a = A,b = B,c = C,d = D;
        if(a <= b || (c==0&&d==0&&a==b+1)){
            while(a && b){
                ans.push_back((flag?1:0));
                (flag?b:a) -= 1;
                flag = !flag;
            }
            if(b <= c || (d == 0&&b == c+1)){
                flag = 0;
                while(b && c){
                    ans.push_back((flag?2:1));
                    (flag?c:b) -= 1;
                    flag = !flag;
                }
                if(c == d || c == d+1 || (c+1 == d && B == 0)){
                    flag = 0;
                    if((c+1 == d && B == 0))flag = 1;
                    while(c && d){
                        ans.push_back((flag?3:2));
                        (flag?d:c) -= 1;
                        flag = !flag;
                    }
                    if(a)ans.push_back(0);
                    if(b)ans.push_back(1);
                    if(c)ans.push_back(2);
                    if(d)ans.push_back(3);
                    cout<<"YES\n"<<ans[0];
                    for(int i=1;i<ans.size();i++){
                        cout<<" "<<ans[i];
                    }
                    cout<<endl;
                    return 0;
                }
            }
        }
        flag = 1;
    }
    cout<<"NO"<<endl;
}


#include  <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,c,d,A[4];
    bool flag;
    cin>>a>>b>>c>>d;
    vector<short> ans;
    A[0] = a,A[1] = b,A[2] = c,A[3] = d;
    if(a <= b){
        flag = (a == b ? 0:1);
        while(a && b){
            ans.push_back((flag?1:0));
            (flag ? b:a) -= 1;
            flag = !flag;
        }
        if(b <= c){
            flag = 0;
            while(c && b){
                ans.push_back((flag?2:1));
                (flag ? c:b) -= 1;
                flag = !flag;
            }
            int x = c-d;
            if(x == 0 || x == 1){
                cout<<"YES"<<endl;
                flag = 0;
                while(c && d){
                    ans.push_back((flag?3:2));
                    (flag ? d:c) -= 1;
                    flag = !flag;
                }
                if(c)ans.push_back(2);
                else ans.push_back(3);
                cout<<ans[0];
                for(int i=1;i<ans.size();i++)
                    cout<<" "<<ans[i];
                cout<<endl;
                return 0;
            }
        }
    }
    cout<<"NO"<<endl;
}


#include <bits/stdc++.h>
using namespace std;
int main(){
    int stop = 2;
    bool flag = 0;
    int a,b,c,d,A,B,C,D;
    cin>>A>>B>>C>>D;

    while(stop--){
        vector<short> ans;
        a = A,b = B,c = C,d = D;
        if(a <= b || (c==0&&d==0&&a==b+1)){
            while(a && b){
                ans.push_back((flag?1:0));
                (flag?b:a) -= 1;
                flag = !flag;
            }
            if(b <= c || (d == 0&&b == c+1)){
                flag = 0;
                while(b && c){
                    ans.push_back((flag?2:1));
                    (flag?c:b) -= 1;
                    flag = !flag;
                }
                if(c == d || c == d+1){
                    flag = 0;
                    while(c && d){
                        ans.push_back((flag?3:2));
                        (flag?d:c) -= 1;
                        flag = !flag;
                    }
                    if(a)ans.push_back(0);
                    if(b)ans.push_back(1);
                    if(c)ans.push_back(2);
                    if(d)ans.push_back(3);
                    cout<<"YES\n"<<ans[0];
                    for(int i=1;i<ans.size();i++){
                        cout<<" "<<ans[i];
                    }
                    cout<<endl;
                    return 0;
                }
            }
        }
        flag = 1;
    }
    cout<<"NO"<<endl;
}


#include <bits/stdc++.h>
using namespace std;
int main(){
    int stop = 2;
    bool flag = 0;
    int a,b,c,d,A,B,C,D;
    cin>>A>>B>>C>>D;

    while(stop--){
        vector<short> ans;
        a = A,b = B,c = C,d = D;
        if(a <= b || (c==0&&d==0&&a==b+1)){
            while(a && b){
                ans.push_back((flag?1:0));
                (flag?b:a) -= 1;
                flag = !flag;
            }
            if(b <= c || (d == 0&&b == c+1)){
                while(b && c){
                    ans.push_back((flag?1:2));
                    (flag?b:c) -= 1;
                    flag = !flag;
                }
                if(c == d || c == d+1 || (c+1 == d && B == 0)){
                    while(c && d){
                        ans.push_back((flag?3:2));
                        (flag?d:c) -= 1;
                        flag = !flag;
                    }
                    if(a)ans.push_back(0);
                    if(b)ans.push_back(1);
                    if(c)ans.push_back(2);
                    if(d)ans.push_back(3);
                    if(ans.size() != (A+B+C+D))continue;
                    cout<<"YES\n"<<ans[0];
                    for(int i=1;i<ans.size();i++){
                        cout<<" "<<ans[i];
                    }
                    cout<<endl;
                    return 0;
                }
            }
        }
        flag = 1;
    }
    cout<<"NO"<<endl;
}


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	int a,b,c,d,res1=0,res2=0;
	bool f1=0,f2=0,flag=0,tmp=0;
	cin>>a>>b>>c>>d;
	if(a==b+1){
		if(c==d&&d==0){
			printf("YES\n");
			for(int i=1;i<=a+b;++i) printf("%d ",i&1?0:1);
		}
		else printf("NO\n");
		return 0;
	}
	if(d==c+1){
		if(a==0&&b==0) {
			printf("YES\n");
			for(int i=1;i<=c+d;++i) printf("%d ",i&1?3:2);
		}
		else printf("NO\n");
		return 0;
	}
	if(a>b||d>c){ printf("NO\n");return 0;}
	res1=b-a+1;res2=c-d+1;
	if(abs(res1-res2)>1) {printf("NO");return 0;}
	if(res1>res2) {printf("1 ");--res1;}
	else if(res2>res1){ --res2,tmp=1;}
	if(res1==res2){
		printf("YES\n");
		for(int i=1;i<=a;++i) printf("0 1 ");
		for(int i=1;i<=res1;++i) printf("2 1 ");
		for(int i=1;i<=d;++i) printf("2 3 ");
	}
	if(tmp) printf("2 ");
	return 0;
}


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	int a,b,c,d,res1=0,res2=0;
	bool f1=0,f2=0,flag=0,tmp=0;
	cin>>a>>b>>c>>d;
	if(a==b+1){
		if(c==d&&d==0){
			printf("YES\n");
			for(int i=1;i<=a+b;++i) printf("%d ",i&1?0:1);
		}
		else printf("NO\n");
		return 0;
	}
	if(d==c+1){
		if(a==0&&b==0) {
			printf("YES\n");
			for(int i=1;i<=c+d;++i) printf("%d ",i&1?3:2);
		}
		else printf("NO\n");
		return 0;
	}
	if(a>b||d>c){ printf("NO\n");return 0;}
	res1=b-a;res2=c-d;
	printf("YES\n");
	if(abs(res1-res2)>1) {printf("NO");return 0;}
	if(res1>res2) {printf("1 ");--res1;}
	else if(res2>res1){ --res2,tmp=1;}
	if(res1==res2){
		for(int i=1;i<=a;++i) printf("0 1 ");
		for(int i=1;i<=res1;++i) printf("2 1 ");
		for(int i=1;i<=d;++i) printf("2 3 ");
	}
	if(tmp) printf("2 ");
	return 0;
}


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	int a,b,c,d,res1=0,res2=0;
	bool f1=0,f2=0,flag=0,tmp=0;
	cin>>a>>b>>c>>d;
	if(a==b+1){
		if(c==d&&d==0){
			printf("YES\n");
			for(int i=1;i<=a+b;++i) printf("%d ",i&1?0:1);
		}
		else printf("NO\n");
		return 0;
	}
	if(d==c+1){
		if(a==0&&b==0) {
			printf("YES\n");
			for(int i=1;i<=c+d;++i) printf("%d ",i&1?3:2);
		}
		else printf("NO\n");
		return 0;
	}
	if(a>b||d>c){ printf("NO\n");return 0;}
	res1=b-a;res2=c-d;
	if(abs(res1-res2)>1) {printf("NO");return 0;}
	printf("YES\n");
	if(res1>res2) {printf("1 ");--res1;}
	else if(res2>res1){ --res2,tmp=1;}
	if(res1==res2){
		for(int i=1;i<=a;++i) printf("0 1 ");
		for(int i=1;i<=res1;++i) printf("2 1 ");
		for(int i=1;i<=d;++i) printf("2 3 ");
	}
	if(tmp) printf("2 ");
	return 0;
}


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	int a,b,c,d,res1=0,res2=0;
	bool f1=0,f2=0,flag=0,tmp=0;
	cin>>a>>b>>c>>d;
	if(a==b+1){
		if(c==d&&d==0){
			printf("YES\n");
			for(int i=1;i<=a+b;++i) printf("%d ",i&1?0:1);
		}
		else printf("NO\n");
		return 0;
	}
	if(d==c+1){
		if(a==0&&b==0) {
			printf("YES\n");
			for(int i=1;i<=c+d;++i) printf("%d ",i&1?3:2);
		}
		else printf("NO\n");
		return 0;
	}
	if(a>b||d>c){ printf("NO\n");return 0;}
	res1=b-a;res2=c-d;
	if(abs(res1-res2)>1) {printf("NO");return 0;}
	if(res1>res2) {printf("1 ");--res1;}
	else if(res2>res1){ --res2,tmp=1;}
	if(res1==res2){
		printf("YES\n");
		for(int i=1;i<=a;++i) printf("0 1 ");
		for(int i=1;i<=res1;++i) printf("2 1 ");
		for(int i=1;i<=d;++i) printf("2 3 ");
	}
	if(tmp) printf("2 ");
	return 0;
}


#include <bits/stdc++.h>
using namespace std;

const int N = 100000;
int ans[N+5];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int ta, tb, tc, td, a, b, c, d, cnt;
    cin >> ta >> tb >> tc >> td;
    bool f = false;

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (a && b){ ans[++cnt] = 0, ans[++cnt] = 1; --a; --b; }
    if (a){ ans[++cnt] = 0; --a; }
    else {
        while (b && c){ ans[++cnt] = 2, ans[++cnt] = 1; --b; --c; }
        while (c && d){ ans[++cnt] = 2, ans[++cnt] = 3; --c; --d; }
        if (c){ ans[++cnt] = 2; --c; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (a && b){ ans[++cnt] = 1, ans[++cnt] = 0; --a; --b; }
    while (b && c){ ans[++cnt] = 1, ans[++cnt] = 2; --b; --c; }
    if (b){ ans[++cnt] = 1; --b; }
    else if (ans[cnt] == 2){
        while (c && d){ ans[++cnt] = 3, ans[++cnt] = 2; --c; --d; }
        if (d){ ans[++cnt] = 3; --d; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (c && d){ ans[++cnt] = 2, ans[++cnt] = 3; --c; --d; }
    while (b && c){ ans[++cnt] = 2, ans[++cnt] = 1; --b; --c; }
    if (c){ ans[++cnt] = 2; --c; }
    else if (ans[cnt] == 1){
        while (a && b){ ans[++cnt] = 0, ans[++cnt] = 1; --a; --b; }
        if (a){ ans[++cnt] = 0; --a; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (d && c){ ans[++cnt] = 3, ans[++cnt] = 2; --d; --c; }
    if (d){ ans[++cnt] = 3; --d; }
    else {
        while (c && b){ ans[++cnt] = 1, ans[++cnt] = 2; --c; --b; }
        while (b && a){ ans[++cnt] = 1, ans[++cnt] = 0; --a; --b; }
        if (b){ ans[++cnt] = 1; --b; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    end:
    if (f){
        cout << "YES" << endl;
        for (int i = 1; i <= cnt; ++i) cout << ans[i] << ' ';
        cout << endl;
    }
    else cout << "NO" << endl;
    return 0;
}


#include <bits/stdc++.h>
using namespace std;

const int N = 100000;
int ans[N+5];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int ta, tb, tc, td, a, b, c, d, cnt;
    cin >> ta >> tb >> tc >> td;
    bool f = false;

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (a && b){ ans[++cnt] = 0, ans[++cnt] = 1; --a; --b; }
    if (a){ ans[++cnt] = 0; --a; }
    else {
        while (b && c){ ans[++cnt] = 2, ans[++cnt] = 1; --b; --c; }
        while (c && d){ ans[++cnt] = 2, ans[++cnt] = 3; --c; --d; }
        if (c){ ans[++cnt] = 2; --c; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (a && b){ ans[++cnt] = 1, ans[++cnt] = 0; --a; --b; }
    while (b && c){ ans[++cnt] = 1, ans[++cnt] = 2; --b; --c; }
    if (b){ ans[++cnt] = 1; --b; }
    else {
        while (c && d){ ans[++cnt] = 3, ans[++cnt] = 2; --c; --d; }
        if (d){ ans[++cnt] = 3; --d; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (c && d){ ans[++cnt] = 2, ans[++cnt] = 3; --c; --d; }
    while (b && c){ ans[++cnt] = 2, ans[++cnt] = 1; --b; --c; }
    if (c){ ans[++cnt] = 2; --c; }
    else {
        while (a && b){ ans[++cnt] = 0, ans[++cnt] = 1; --a; --b; }
        if (a){ ans[++cnt] = 0; --a; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    a = ta, b = tb, c = tc, d = td; cnt = 0;
    while (d && c){ ans[++cnt] = 3, ans[++cnt] = 2; --d; --c; }
    if (d){ ans[++cnt] = 3; --d; }
    else {
        while (c && b){ ans[++cnt] = 1, ans[++cnt] = 2; --c; --b; }
        while (b && a){ ans[++cnt] = 1, ans[++cnt] = 0; --a; --b; }
        if (b){ ans[++cnt] = 1; --b; }
    }
    if (!a && !b && !c && !d){ f = true; goto end; }

    end:
    if (f){
        cout << "YES" << endl;
        for (int i = 1; i <= cnt; ++i) cout << ans[i] << ' ';
        cout << endl;
    }
    else cout << "NO" << endl;
    return 0;
}


//CLOCKS_PER_SEC
using namespace std;
#include<bits/stdc++.h>
#define sqr(x) (x)*(x)
//#define sort stable_sort
#define ll long long
#define mk make_pair
#define pb push_back
#define in insert
#define mtr(x,y,z) mk(mk(x,y),z)
#define fi first
#define se second
#define lch(x) ((x)<<1)
#define rch(x) (((x)<<1)|1)
#define all(x) (x).begin(),(x).end()
#define titose CLOCKS_PER_SEC
#define fpi(x) freopen(x,"r",stdin);
#define fpo(x) freopen(x,"w",stdout);
#define fprio fpi("in.txt");fpo("out.txt");
#define fast ios_base::sync_with_stdio(false);
inline void read(int &x){int v=0,f=1;char c=getchar();while (!isdigit(c)&&c!='-') c=getchar();if (c=='-') f=-1; else v=(c&15);while (isdigit(c=getchar())) v=(v<<1)+(v<<3)+(c&15);x=v*f;}
inline void read(ll &x){ll v=0ll,f=1ll;char c=getchar();while (!isdigit(c)&&c!='-') c=getchar();if (c=='-') f=-1; else v=(c&15);while (isdigit(c=getchar())) v=(v<<1)+(v<<3)+(c&15);x=v*f;}
inline void readc(char &x){char c;while (((c=getchar())==' ')||c=='\n');x=c;}
#define pii pair<int,int>
#define pll pair<ll,ll>
#define vi vector<int>
#define vl vector<ll>
#define si set<int>
#define sl set<ll>
#define mii map<int,int>
#define mll map<ll,ll>
#define msi map<string,int>
#define msl map<string,ll>
#define piii pair<int,pii >
#define piipi pair<pii,int>
#define plll pair<ll,pll >
#define pllpl pair<pll,ll>
#define pqi priority_queue<int>
#define pql priority_queue<ll>
#define npqi priority_queue<int,vector<int>,greater<int> >
#define npql priority_queue<ll,vector<ll>,greater<ll> >
#define forup(i,a,b) for ((i)=(a);(i)<=(b);(i)++)
#define fordo(i,a,b) for ((i)=(a);(i)>=(b);(i)--)
#define rep(i,x) forup ((i),1,(x))
#define repd(i,x) fordo ((i),(x),1)
#define rep0(i,x) forup ((i),0,(x)-1)
#define rep0d(i,x) fordo ((i),((int)(x))-1,0)
#define itr iterator
#define fe(itcalc,c) for(__typeof((c).begin()) itcalc=(c).begin();itcalc!=(c).end();itcalc++)
#define NO {cout<<"NO";return 0;}
#define YES {cout<<"YES";return 0;}
#define y0 y000000000000000000000000000
#define y1 y111111111111111111111111111
#define j0 j000000000000000000000000000
#define j1 j111111111111111111111111111
#define cl0(a) memset((a),(0),(sizeof((a))))
#define clz(a) memset((a),(0x16),(sizeof((a))))
#define clf(a) memset((a),(-(0x16)),(sizeof((a))))
#define inf 0x3bbbbbbb
#define lnf 0x1bbbbbbbbbbbbbbbll
#define sqrt divi
#define p2(i) (1ll<<(i))
#define readi read
#define readll read
/*************************************************/
int a,b,c,d,f[4],i;
int main()
{
	read(a);read(b);read(c);read(d);
	if(abs(a+c-b-d)>1){
		puts("NO");
		return 0;
	}
	if(a&&!b&&c){
		puts("NO");
		return 0;
	}
	if(b&&!c&&d){
		puts("NO");
		return 0;
	}
	if(a&&(!b||!c)&&d){
		puts("NO");
		return 0;
	}
	if(max(a-b,0)+max(d-c,0)>1){
		puts("NO");
		return 0;
	}
	if(a-b==1){
		if(c||d){
			puts("NO");
			return 0;
		}
		puts("YES");
		putchar('0');
		rep(i,b) printf(" 1 0");
		puts("");return 0;
	}
	if(d-c==1){
		if(a||b){
			puts("NO");
			return 0;
		}
		puts("YES");
		putchar('4');
		rep(i,c) printf(" 3 4");
		puts("");return 0;
	}
	f[0]=a;f[1]=b;f[2]=c;f[3]=d;
	puts("YES");
	if(a+c>b+d){
		int t=0;
		for(;;){
			if(f[t]){
				printf("%d ",t);
				f[t]--;
			}
			if(t>0&&f[t-1]) t--; else t++;
			if(t>3) break;
		}
	}
	else{
		int t=3;
		for(;;){
			if(f[t]){
				printf("%d ",t);
				f[t]--;
			}
			if(t<3&&f[t+1]) t++; else t--;
			if(t<0) break;
		}
	}
	return 0;
}


//CLOCKS_PER_SEC
using namespace std;
#include<bits/stdc++.h>
#define sqr(x) (x)*(x)
//#define sort stable_sort
#define ll long long
#define mk make_pair
#define pb push_back
#define in insert
#define mtr(x,y,z) mk(mk(x,y),z)
#define fi first
#define se second
#define lch(x) ((x)<<1)
#define rch(x) (((x)<<1)|1)
#define all(x) (x).begin(),(x).end()
#define titose CLOCKS_PER_SEC
#define fpi(x) freopen(x,"r",stdin);
#define fpo(x) freopen(x,"w",stdout);
#define fprio fpi("in.txt");fpo("out.txt");
#define fast ios_base::sync_with_stdio(false);
inline void read(int &x){int v=0,f=1;char c=getchar();while (!isdigit(c)&&c!='-') c=getchar();if (c=='-') f=-1; else v=(c&15);while (isdigit(c=getchar())) v=(v<<1)+(v<<3)+(c&15);x=v*f;}
inline void read(ll &x){ll v=0ll,f=1ll;char c=getchar();while (!isdigit(c)&&c!='-') c=getchar();if (c=='-') f=-1; else v=(c&15);while (isdigit(c=getchar())) v=(v<<1)+(v<<3)+(c&15);x=v*f;}
inline void readc(char &x){char c;while (((c=getchar())==' ')||c=='\n');x=c;}
#define pii pair<int,int>
#define pll pair<ll,ll>
#define vi vector<int>
#define vl vector<ll>
#define si set<int>
#define sl set<ll>
#define mii map<int,int>
#define mll map<ll,ll>
#define msi map<string,int>
#define msl map<string,ll>
#define piii pair<int,pii >
#define piipi pair<pii,int>
#define plll pair<ll,pll >
#define pllpl pair<pll,ll>
#define pqi priority_queue<int>
#define pql priority_queue<ll>
#define npqi priority_queue<int,vector<int>,greater<int> >
#define npql priority_queue<ll,vector<ll>,greater<ll> >
#define forup(i,a,b) for ((i)=(a);(i)<=(b);(i)++)
#define fordo(i,a,b) for ((i)=(a);(i)>=(b);(i)--)
#define rep(i,x) forup ((i),1,(x))
#define repd(i,x) fordo ((i),(x),1)
#define rep0(i,x) forup ((i),0,(x)-1)
#define rep0d(i,x) fordo ((i),((int)(x))-1,0)
#define itr iterator
#define fe(itcalc,c) for(__typeof((c).begin()) itcalc=(c).begin();itcalc!=(c).end();itcalc++)
#define NO {cout<<"NO";return 0;}
#define YES {cout<<"YES";return 0;}
#define y0 y000000000000000000000000000
#define y1 y111111111111111111111111111
#define j0 j000000000000000000000000000
#define j1 j111111111111111111111111111
#define cl0(a) memset((a),(0),(sizeof((a))))
#define clz(a) memset((a),(0x16),(sizeof((a))))
#define clf(a) memset((a),(-(0x16)),(sizeof((a))))
#define inf 0x3bbbbbbb
#define lnf 0x1bbbbbbbbbbbbbbbll
#define sqrt divi
#define p2(i) (1ll<<(i))
#define readi read
#define readll read
/*************************************************/
int a,b,c,d,f[4],i;
int main()
{
	read(a);read(b);read(c);read(d);
	if(abs(a+c-b-d)>1){
		puts("NO");
		return 0;
	}
	if(a&&!b&&c){
		puts("NO");
		return 0;
	}
	if(b&&!c&&d){
		puts("NO");
		return 0;
	}
	if(a&&(!b||!c)&&d){
		puts("NO");
		return 0;
	}
	if(max(a-b,0)+max(d-c,0)>1){
		puts("NO");
		return 0;
	}
	if(a-b==1){
		if(c||d){
			puts("NO");
			return 0;
		}
		puts("YES");
		putchar('0');
		rep(i,b) printf(" 1 0");
		puts("");return 0;
	}
	if(d-c==1){
		if(a||b){
			puts("NO");
			return 0;
		}
		puts("YES");
		putchar('3');
		rep(i,c) printf(" 2 3");
		puts("");return 0;
	}
	f[0]=a;f[1]=b;f[2]=c;f[3]=d;
	puts("YES");
	if(a+c>b+d){
		int t=0;
		for(;;){
			if(f[t]){
				printf("%d ",t);
				f[t]--;
			}
			if(t>0&&f[t-1]) t--; else t++;
			if(t>3) break;
		}
	}
	else{
		int t=3;
		for(;;){
			if(f[t]){
				printf("%d ",t);
				f[t]--;
			}
			if(t<3&&f[t+1]) t++; else t--;
			if(t<0) break;
		}
	}
	return 0;
}