// AtCode.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。
//

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <stdint.h>

using namespace std;

typedef struct datum_name {
	int x;
	int y;
	int whosay;
	bool operator==(const datum_name& data) const
	{
		return (x == data.x && y == data.y);
	}
} datum;


bool cmp_who(const datum& left, const datum& right) {
	return left.whosay < right.whosay;
}

typedef vector<vector<int>> Graph;
vector<bool> seen;
vector<int> depth;

void dfs(const Graph& G, int v, int depth_num) {
	seen[v] = true;
	depth[v] = depth_num;

	for (auto next_v : G[v]) {
		if (seen[next_v]) continue;
		dfs(G, next_v, depth_num+1); //再帰探索
	}
}

int main()
{
	int64_t N;
	cin >> N;
	vector<int64_t> array;
	for (int64_t i = 0; i < N; i++) {
		int64_t tmp;
		cin >> tmp;
		array.push_back(tmp);
	}
	vector<int64_t> one_num;
	one_num.resize(64);
	for (int64_t order = 0; order < 64; order++) {
		for (int64_t i = 0; i < N; i++) {
			if (array[i] & ((int64_t)(1) << order)) {
				one_num[order] += 1;
			}
		}
	}

	vector<int64_t> ans_one_num;
	ans_one_num.resize(64);

	for (int64_t order = 0; order < 64; order++) {
		for (int64_t j = 0; j < N; j++) {
			if (array[j] & ((int64_t)(1) << order)) { // case bit=1
				one_num[order] -= (int64_t)(1);
				ans_one_num[order] += (int64_t)( (N-j-1) - one_num[order]);
			}
			else { // case bit = 0;
				ans_one_num[order] += (int64_t)( one_num[order]);
			}
			ans_one_num = ans_one_num % (int64_t)(1000000000 + 7);
		}
	}

	int64_t ans = 0;
	for (int64_t order = 0; order < 64; order++) {
		int64_t order_value = ((int64_t)(1) << order) % (int64_t)(1000000000 + 7);
		ans += ans_one_num[order] * order_value;
		ans = ans % (int64_t)(1000000000 + 7);
	}
	cout << ans << endl;

	return 0;

}
