#include <bits/stdc++.h>
// #include <iostream>
// #include <vector>
// #include <map>
// #include <algorithm>
using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())

template<typename T>
T mod(T a, T b){
    return (a + b) % b;
}

template<typename T>
T gcd(T a, T b){
    if (b == 0) return a;
    return gcd(b, a % b);
}

ll lcm(ll a, ll b){
    return a * b / gcd(a,b);
}

// n を素因数分解
map<ll, ll> factor(ll n){
    map<ll, ll> mp;
    for (ll i = 2; i*i <= n; i++) {
        while (n % i == 0) {
            mp[i]++;
            n /= i;
        }
    }

    if (n > 1) {
        mp[n]++;
    }

    return mp;
}

// 文字列に "hoge" が含まれているか
// string str = "hogepiyo";
// if (str.find("hoge") != string::npos) {
//     cout << "文字列が含まれています" << endl;
// }

// char to string
// char c = 'a';
// string str = {c};

void solve(){
    int H, W;
    cin >> H >> W;

    char board[H+2][W+2];
    for (int i = 0; i < H+2; i++) {
        for (int j = 0; j < W+2; j++) {
            board[i][j] = '#';
        }
    }

    for (int i = 0; i < H; i++) {
        string s;
        cin >> s;

        for (int j = 0; j < W; j++) {
            if (s[j] == '.') {
                board[i+1][j+1] = '.';
            }
        }
    }

    // for (int i = 0; i < H+2; i++) {
    //     for (int j = 0; j < W+2; j++) {
    //         cout << board[i][j];
    //     }
    //     cout << endl;
    // }


    vector<int> yoko_gomi[H+2], tate_gomi[W+2];
    for (int i = 0; i < H+2; i++) {
        for (int j = 0; j < W+2; j++) {
            if (board[i][j] == '#') {
                yoko_gomi[i].push_back(j);
                tate_gomi[j].push_back(i);
            }
        }
    }

    // for (int i = 0; i < (int)yoko_gomi[1].size(); i++) {
    //     cout << yoko_gomi[1][i] << endl;
    // }

    int yoko_board[H+2][W+2];
    int tate_board[H+2][W+2];
    for (int i = 0; i < H+2; i++) {
        for (int j = 0; j < W+2; j++) {
            yoko_board[i][j] = 0;
            tate_board[i][j] = 0;
        }
    }

    for (int i = 0; i <= H+1; i++) {
        for (int j = 0; j < (int)yoko_gomi[i].size()-1; j++) {
            for (int k = yoko_gomi[i][j]+1; k < yoko_gomi[i][j+1]; k++) {
                yoko_board[i][k] = yoko_gomi[i][j+1] - yoko_gomi[i][j] - 1;
                // cout << yoko_board[i][j];
            }
        }
        // cout << endl;
    }
    // cout << endl;

    for (int i = 0; i <= W+1; i++) {
        for (int j = 0; j < (int)tate_gomi[i].size() - 1; j++) {
            for (int k = tate_gomi[i][j]+1; k < tate_gomi[i][j+1]; k++) {
                tate_board[k][i] = tate_gomi[i][j+1] - tate_gomi[i][j] - 1;
            }
        }
    }

    // for (int i = 0; i < H+2; i++) {
    //     for (int j = 0; j < (int)yoko_gomi[i].size(); j++) {
    //         cout << yoko_gomi[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    //
    // cout << endl;
    // for (int i = 0; i < W+2; i++) {
    //     for (int j = 0; j < (int)tate_gomi[i].size(); j++) {
    //         cout << tate_gomi[i][j] << " ";
    //     }
    //     cout << endl;
    // }

    int ans = 0;
    for (int i = 1; i <= H; i++) {
        for (int j = 1; j <= W; j++) {
            if (board[i][j] == '.')
                ans = max(ans, tate_board[i][j] + yoko_board[i][j] - 1);
        }
    }

    cout << ans << endl;

    return;
}

int main(int argc, char const* argv[])
{
    solve();
    return 0;
}


Measured memory_bytes: 69760