extractDataRegion(bitMatrix) {
			const symbolSizeRows = this.version.getSymbolSizeRows();
			const symbolSizeColumns = this.version.getSymbolSizeColumns();
			if (bitMatrix.getHeight() !== symbolSizeRows) {
				throw new IllegalArgumentException('Dimension of bitMatrix must match the version size');
			}
			const dataRegionSizeRows = this.version.getDataRegionSizeRows();
			const dataRegionSizeColumns = this.version.getDataRegionSizeColumns();
			const numDataRegionsRow = symbolSizeRows / dataRegionSizeRows | 0;
			const numDataRegionsColumn = symbolSizeColumns / dataRegionSizeColumns | 0;
			const sizeDataRegionRow = numDataRegionsRow * dataRegionSizeRows;
			const sizeDataRegionColumn = numDataRegionsColumn * dataRegionSizeColumns;
			const bitMatrixWithoutAlignment = new BitMatrix(sizeDataRegionColumn, sizeDataRegionRow);
			for (let dataRegionRow = 0; dataRegionRow < numDataRegionsRow; ++dataRegionRow) {
				const dataRegionRowOffset = dataRegionRow * dataRegionSizeRows;
				for (let dataRegionColumn = 0; dataRegionColumn < numDataRegionsColumn; ++dataRegionColumn) {
					const dataRegionColumnOffset = dataRegionColumn * dataRegionSizeColumns;
					for (let i = 0; i < dataRegionSizeRows; ++i) {
						const readRowOffset = dataRegionRow * (dataRegionSizeRows + 2) + 1 + i;
						const writeRowOffset = dataRegionRowOffset + i;
						for (let j = 0; j < dataRegionSizeColumns; ++j) {
							const readColumnOffset = dataRegionColumn * (dataRegionSizeColumns + 2) + 1 + j;
							if (bitMatrix.get(readColumnOffset, readRowOffset)) {
								const writeColumnOffset = dataRegionColumnOffset + j;
								bitMatrixWithoutAlignment.set(writeColumnOffset, writeRowOffset);
							}
						}
					}
				}
			}
			return bitMatrixWithoutAlignment;
		}
<p>Extracts the data region from a {@link BitMatrix} that contains
alignment patterns.</p>

@param bitMatrix Original {@link BitMatrix} with alignment patterns
@return BitMatrix that has the alignment patterns removed