#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
char g[4][5];
for (int i = 0; i < 4; ++i) cin >> g[i];
vector<pair<int, int>> unk;
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
if (g[i][j] == '.') unk.emplace_back(i, j);
int U = unk.size();
struct Clue { int r, c, need; };
vector<Clue> clues;
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
if (isdigit(g[i][j])) clues.push_back({i, j, g[i][j] - '0'});
vector<bool> valid(1 << U, true);
for (int mask = 0; mask < (1 << U); ++mask) {
for (auto &cl : clues) {
int cnt = 0;
for (int dr = -1; dr <= 1; ++dr)
for (int dc = -1; dc <= 1; ++dc) {
if (dr == 0 && dc == 0) continue;
int nr = cl.r + dr, nc = cl.c + dc;
if (nr < 0 || nr > 3 || nc < 0 || nc > 3) continue;
char ch = g[nr][nc];
if (ch == 'X') ++cnt;
else if (isdigit(ch)) continue;
else {
auto it = find(unk.begin(), unk.end(), make_pair(nr, nc));
int id = it - unk.begin();
if (id < U && (mask >> id & 1)) ++cnt;
}
}
if (cnt != cl.need) { valid[mask] = false; break; }
}
}
vector<char> res;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
res.push_back(g[i][j]);
}
}
for (int id = 0; id < U; ++id) {
bool all1 = true, all0 = true;
for (int mask = 0; mask < (1 << U); ++mask) if (valid[mask]) {
if (mask >> id & 1) all0 = false;
else all1 = false;
}
auto [r, c] = unk[id];
if (all1) res[r * 4 + c] = 'X';
else if (all0) res[r * 4 + c] = 'O';
}
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) cout << res[i * 4 + j];
cout << '\n';
}
return 0;
}
// 64 位输出请用 printf("%lld")