#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <stdlib.h>
#include <string.h>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <stdio.h>
#include <tuple>
#include <bitset>
#include <cfloat>
#include <fstream>
#include <limits.h>
#include <list>
#include <math.h>
#include <random>
#include <unordered_map>
#include <unordered_set>
#include <bitset>
#include <numeric>
#include <utility>
#include <sstream>

template<class T> inline bool chmin(T& a, T b) {
	if (a > b) {
		a = b;
		return true;
	}
	return false;
}
template<class T> inline bool chmax(T& a, T b) {
	if (a < b) {
		a = b;
		return true;
	}
	return false;
}

using namespace std;
#define int long long
#define ll long long
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define FOR(i,a,b) for(ll i=(a);i<(b);i++)
#define FORR(i,a,b)for(ll i=(a);i<=(b);i++)
#define repr(i,n) for(ll i=n;i>=0;i--)
#define P pair<ll, ll>
#define sz(x) (ll)x.size()
#define ALL(x) (x).begin(),(x).end()
#define ALLR(x) (x).rbegin(),(x).rend()
#define VE vector<ll>
#define COUT(x) cout<<(x)<<endl
#define MA map<ll,ll>
#define SE set<ll>
#define PQ priority_queue<ll>
#define PQR priority_queue<ll,VE,greater<ll>>
#define COUT(x) cout<<(x)<<endl
#define YES(n) cout << ((n) ? "YES" : "NO"  ) << endl
#define Yes(n) cout << ((n) ? "Yes" : "No"  ) << endl
#define EPS (1e-10)
#define pb push_back

const long long MOD = 1000000007;
//const long long MOD = 998244353;
const long long INF = 1LL << 60;
const double PI = acos(-1.0);


long long modinv(long long a, long long m) {
	long long b = m, u = 1, v = 0;
	while (b) {
		long long t = a / b;
		a -= t * b; swap(a, b);
		u -= t * v; swap(u, v);
	}
	u %= m;
	if (u < 0) u += m;
	return u;
}
ll gcd(ll a, ll b) {
	if (a < b)swap(a, b);
	if (b == 0) return a;
	unsigned r;
	while ((r = a % b)) {
		a = b;
		b = r;
	}
	return b;
}
ll lcm(ll a, ll b) {
	ll g = gcd(a, b);
	return a * b / g;
}
bool prime(ll n) {
	for (ll i = 2; i <= sqrt(n); i++) {
		if (n%i == 0)return false;
	}
	return n != 1;
}
map<ll, ll> prime_factor(ll n) {
	map<ll, ll> ret;
	for (ll i = 2; i * i <= n; i++) {
		while (n % i == 0) {
			ret[i]++;
			n /= i;
		}
	}
	if (n != 1) ret[n] = 1;
	return ret;
}



const int MAX_N = 100010;


signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int h, w; cin >> h >> w;
	vector<vector<char>>field(h, vector<char>(w));
	rep(i, h) {
		rep(j, w) {
			cin >> field[i][j];
		}
	}
	vector<VE>l(h, VE(w)), r(h, VE(w)), u(h, VE(w)), d(h, VE(w));
	rep(i, h) {
		rep(j, w) {
			if (j == 0) {
				if (field[i][j] == '#')l[i][j] = 0;
				else l[i][j] = 1;
			}
			else {
				if (field[i][j] != '#')l[i][j] = l[i][j - 1] + 1;
				else l[i][j] = 0;
			}
		}
	}
	rep(i, h) {
		for (int j = w - 1; j >= 0; j--) {
			if (j == w - 1) {
				if (field[i][j] == '#')r[i][j] = 0;
				else r[i][j] = 1;
			}
			else {
				if (field[i][j] != '#')r[i][j] = r[i][j + 1] + 1;
				else r[i][j] = 0;
			}
		}
	}
	rep(j, w) {
		rep(i, h) {
			if (i == 0) {
				if (field[i][j] == '#')u[i][j] = 0;
				else u[i][j] = 1;
			}
			else {
				if (field[i][j] != '#')u[i][j] = u[i - 1][j] + 1;
				else u[i][j] = 0;
			}
		}
	}
	rep(j, w) {
		for (int i = h - 1; i >= 0; i--) {
			if (i == h - 1) {
				if (field[i][j] == '#')d[i][j] = 0;
				else d[i][j] = 1;
			}
			else {
				if (field[i][j] != '#')d[i][j] = d[i + 1][j] + 1;
				else d[i][j] = 0;
			}
		}
	}
	int ans = 0;
	rep(i, h) {
		rep(j, w) {
			//cout <<i<<" "<<j<<" "<< l[i][j] + r[i][j] + d[i][j] + u[i][j] - 3 << endl;
			if(field[i][j]!='#')chmax(ans, l[i][j] + r[i][j] + d[i][j] + u[i][j] - 3);
		}
	}
	cout << ans << endl;
	return 0;
}

Measured memory_bytes: 129536