#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
char board[N][N];
vector<pair<int, int> > neighbours[N][N];
int getColor(vector<pair<int, int> > v) {
  bool forbidden[10];
  for (int i = 0; i < 10; ++i) forbidden[i] = false;
  for (__typeof(v.begin()) it = (v.begin()); it != (v).end(); ++it)
    for (__typeof(neighbours[it->first][it->second].begin()) jt =
             (neighbours[it->first][it->second].begin());
         jt != (neighbours[it->first][it->second]).end(); ++jt)
      if (board[jt->first][jt->second] >= '0' &&
          board[jt->first][jt->second] <= '9')
        forbidden[board[jt->first][jt->second] - '0'] = true;
  int result = 0;
  while (forbidden[result]) ++result;
  return result;
}
bool visited[N][N];
bool taken[N][N];
vector<pair<int, int> > lastBrick;
int rootY, rootX;
void dfs(int y, int x) {
  visited[y][x] = true;
  vector<pair<int, int> > sons;
  for (__typeof(neighbours[y][x].begin()) it = (neighbours[y][x].begin());
       it != (neighbours[y][x]).end(); ++it) {
    if (!visited[it->first][it->second]) {
      dfs(it->first, it->second);
      if (!taken[it->first][it->second])
        sons.push_back(make_pair(it->first, it->second));
    }
  }
  if (!sons.empty()) {
    sons.push_back(make_pair(y, x));
    int distRoot = 2;
    for (__typeof(sons.begin()) it = (sons.begin()); it != (sons).end(); ++it)
      distRoot =
          min(distRoot, abs(it->first - rootY) + abs(it->second - rootX));
    if ((int)sons.size() < 5 && distRoot == 1) {
      lastBrick = sons;
    }
    for (__typeof(sons.begin()) it = (sons.begin()); it != (sons).end(); ++it)
      taken[it->first][it->second] = true;
    int color = getColor(sons);
    for (__typeof(sons.begin()) it = (sons.begin()); it != (sons).end(); ++it)
      board[it->first][it->second] = color + '0';
  }
}
int rows, cols;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, -1, 0, 1};
int main() {
  scanf("%d %d", &rows, &cols);
  for (int i = 1; i <= rows; ++i) scanf("%s", board[i] + 1);
  for (int i = 1; i <= rows; ++i)
    for (int j = 1; j <= cols; ++j) {
      if (board[i][j] == '#') visited[i][j] = true;
      for (int d = 0; d < 4; ++d) {
        int y = i + dy[d];
        int x = j + dx[d];
        if (y >= 1 && y <= rows && x >= 1 && x <= cols)
          neighbours[i][j].push_back(make_pair(y, x));
      }
    }
  for (int i = 1; i <= rows; ++i)
    for (int j = 1; j <= cols; ++j) {
      if (!visited[i][j]) {
        lastBrick.clear();
        rootY = i;
        rootX = j;
        dfs(i, j);
        if (!taken[i][j]) {
          if (lastBrick.empty()) {
            printf("-1\n");
            return 0;
          }
          lastBrick.push_back(make_pair(i, j));
          int color = getColor(lastBrick);
          taken[i][j] = true;
          for (__typeof(lastBrick.begin()) it = (lastBrick.begin());
               it != (lastBrick).end(); ++it)
            board[it->first][it->second] = color + '0';
        }
      }
    }
  for (int i = 1; i <= rows; ++i) printf("%s\n", board[i] + 1);
}
