#include <stdio.h>

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    char pan[n + 2][m + 2]; // 使用 n+2 和 m+2 避免边界检查

    // 初始化边界为 '.',防止越界访问
    for (int i = 0; i < n + 2; i++) {
        for (int j = 0; j < m + 2; j++) {
            pan[i][j] = '.';
        }
    }

    // 读取输入,注意跳过换行符
    for (int a = 1; a <= n; a++) {
        scanf(" "); // 跳过可能的换行符
        for (int b = 1; b <= m; b++) {
            scanf("%c", &pan[a][b]);
        }
    }

    // 计算每个格子周围的地雷数
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= m; b++) {
            if (pan[a][b] == '*') {
                continue; // 如果是地雷,跳过
            }
            int shu = 0;
            // 检查周围的8个方向
            if (pan[a][b - 1] == '*') shu++; // ←
            if (pan[a - 1][b - 1] == '*') shu++; // ↖
            if (pan[a - 1][b] == '*') shu++; // ↑
            if (pan[a - 1][b + 1] == '*') shu++; // ↗
            if (pan[a][b + 1] == '*') shu++; // →
            if (pan[a + 1][b + 1] == '*') shu++; // ↘
            if (pan[a + 1][b] == '*') shu++; // ↓
            if (pan[a + 1][b - 1] == '*') shu++; // ↙
            pan[a][b] = shu + '0'; // 将数字转换为字符
        }
    }

    // 输出结果
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= m; b++) {
            printf("%c", pan[a][b]);
        }
        printf("\n"); // 每行结束后换行
    }

    return 0;
}