long getLastRelocationOffset(WrappedMemBuffer buf) {
		DataTypeComponent[] comps = getComps(buf);
		if ((comps == null) || (comps.length < 3)) {
			return -1;
		}

		// group_size component
		Scalar s = (Scalar) comps[0].getDataType().getValue(buf, null, comps[0].getLength());
		int groupSize = (int) s.getValue();

		DataTypeComponent lastDtc = comps[comps.length - 1];

		if ("group_offsetDelta".equals(comps[2].getFieldName())) {
			WrappedMemBuffer cbuf = new WrappedMemBuffer(buf, comps[2].getOffset());
			s = (Scalar) comps[2].getDataType().getValue(cbuf, null, comps[2].getLength());
			long groupOffsetDelta = s.getValue();
			return baseRelocOffset + (groupSize * groupOffsetDelta);
		}

		if (lastDtc.getFieldName().startsWith("group_")) {
			return -1; // unexpected
		}

		DataType dt = lastDtc.getDataType();
		if (dt instanceof AndroidElfRelocationOffset) {
			AndroidElfRelocationOffset d = (AndroidElfRelocationOffset) dt;
			return d.getRelocationOffset(); // return stashed offset
		}
		else if (dt instanceof AndroidElfRelocationData) {
			AndroidElfRelocationData d = (AndroidElfRelocationData) dt;
			return d.getRelocationOffset(); // return stashed offset
		}
		return -1; // unexpected
	}
<code>AndroidElfRelocationGroup</code> provides a dynamic substructure 
component for relocation groups within a packed Android ELF Relocation Table.
See {@link AndroidElfRelocationTableDataType}.
Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/elf/AndroidElfRelocationGroup.java