private void encodeExtraRanges(Encoder encoder, ElementId tag) throws IOException {
		if (extraRanges == null) {
			return;
		}
		for (Pair<String, Pair<Long, Long>> entry : extraRanges) {
			if (!entry.first.startsWith(tag.name())) {
				continue;
			}
			String spcName = entry.first.substring(entry.first.indexOf('_') + 1);
			long first = entry.second.first;
			long last = entry.second.second;
			boolean useFirst = (first != 0);
			boolean useLast = (last != -1);
			encoder.openElement(ELEM_RANGE);
			// Must use string encoding here, as address space may not exist
			encoder.writeString(ATTRIB_SPACE, spcName);
			if (useFirst) {
				encoder.writeUnsignedInteger(ATTRIB_FIRST, first);
			}
			if (useLast) {
				encoder.writeUnsignedInteger(ATTRIB_LAST, last);
			}
			encoder.closeElement(ELEM_RANGE);
		}
	}
Initialize this object from an XML stream.  A single {@code <compiler_spec>} tag is expected.
@param parser is the XML stream
@throws XmlParseException for badly formed XML
@throws DuplicateNameException if we parse more than one PrototypeModel with the same name
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/BasicCompilerSpec.java