function Main(input) {
    //xは縦芳香、ｙは横方向で8芳香の動き方
    var dx = [1,1,0,-1,-1,-1,0,1];
    var dy = [0,1,1,1,0,-1,-1,-1];
    
    var input = input.split('\n');
    var hw = input[0].split(' ').map(n => parseInt(n, 10));
    var h = hw[0];
    var w = hw[1];
    //二重配列にして升目作る,arr[i行][j列]で各マスをとってこれるようになる
    var board = [];
    for(i = 1; i <= h; i++) board.push(input[i].split(''));
    //爆弾を除いた全てのマスから8芳香探索して爆弾の数を数えてその数をマスに入れる
    for(i = 0; i < h; i++) {
        for(j = 0; j < w; j++) {　//まず全てのマスを参照するfor文を回す
            if(board[i][j] == '#') continue;　//爆弾を除く
            var cnt = 0;
            //八芳香を見ていく。マス(i,j)からk番目の方向に進む先は
            //(i+dx[k], j+dy[k])となる(0<= k < 8)
            for(k = 0; k < 8; k++) {
                x = i + dx[k];
                y = j + dy[k];
                //(x,y)が枠外に行かないかつ爆弾である時にカウントする
                if(x >= 0 && x < h && y >= 0 && y < w && board[x][y] == '#') cnt++;
            }
            //8芳香のカウントが終わった後マスにその数字をを入れる
            board[i][j] = cnt;
        }
    }
    //boardをは二重の配列になってるのでboardでコンソールすると配列で出力されるし、多段にならない。
    //board[i行]の要素をjoinしてboard[i行]をループ出力すると文字列かつ多段に出力される。
    for(i = 0; i < h; i++) console.log(board[i].join(''))
}

Main(require('fs').readFileSync('/dev/stdin', 'utf8'));