import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取矩阵的行数和列数
int n = scanner.nextInt();
int m = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
// 读取初始扫雷矩阵
char[][] matrix = new char[n][m];
for (int i = 0; i < n; i++) {
String line = scanner.nextLine();
matrix[i] = line.toCharArray();
}
// 计算并输出完整的扫雷矩阵
for (int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < m; j++) {
if (matrix[i][j] == '*') {
// 如果是雷,直接添加'*'
sb.append('*');
} else {
// 计算周围8个方向的雷数量
int count = countMines(matrix, i, j, n, m);
sb.append(count);
}
}
System.out.println(sb.toString());
}
}
// 计算指定位置周围8个方向的雷数量
private static int countMines(char[][] matrix, int x, int y, int n, int m) {
int count = 0;
// 8个方向的偏移量
int[][] directions = {
{-1, -1}, {-1, 0}, {-1, 1},
{0, -1}, {0, 1},
{1, -1}, {1, 0}, {1, 1}
};
// 检查每个方向
for (int[] dir : directions) {
int nx = x + dir[0];
int ny = y + dir[1];
// 确保坐标在矩阵范围内
if (nx >= 0 && nx < n && ny >= 0 && ny < m) {
if (matrix[nx][ny] == '*') {
count++;
}
}
}
return count;
}
}