private static FSRL fromPartString(FSRL containerFile, String partStr)
			throws MalformedURLException {
		partStr = partStr.trim();
		int colonSlashSlash = partStr.indexOf("://");
		if (colonSlashSlash <= 0) {
			throw new MalformedURLException("Missing protocol in " + partStr);
		}
		String proto = partStr.substring(0, colonSlashSlash);
		String path = partStr.substring(colonSlashSlash + 3);

		int paramStart = path.indexOf("?");
		String md5 = null;
		if (paramStart >= 0) {
			String params = path.substring(paramStart + 1);
			path = path.substring(0, paramStart);
			Map<String, String> paramMap = getParamMapFromString(params);
			md5 = paramMap.get(FSRL.PARAM_MD5);
		}

		FSRLRoot fsRoot = FSRLRoot.nestedFS(containerFile, proto);
		String decodedPath = FSUtilities.escapeDecode(path);
		if (decodedPath.isEmpty()) {
			decodedPath = null;
		}
		return new FSRL(fsRoot, decodedPath, md5);
	}
Creates a single {@link FSRL} from a FSRL-part string.
<p>
A FSRL-part string is defined as protocol_string + "://" + path_string + "?" + param_string.
<p>
There should be  no '|' separator characters present in the FSRL-part string.
<p>
Backslash characters in the path are normalized to forward slashes after decoding any
hex encoded character values (ie. %20 becomes ' ' (32) ).  See {@link FSUtilities#escapeEncode(String)}.

@param containerFile the parent container file that contains this filesystem's data
@param partStr the string that defines this portion of the FSRL
@return new FSRL instance, who's FSLRRoot is parented on containerFile.

@throws MalformedURLException if the partStr is formatted incorrectly
Ghidra/Features/Base/src/main/java/ghidra/formats/gfilesystem/FSRL.java