function str2multislice( str ) {
	var args;
	var arg;
	var n;
	var v;
	var i;
	if ( str.substring( 0, PREFIX.length ) !== PREFIX ) {
		return null;
	}
	n = str.length - 1;
	if ( str[ n ] !== ')' ) {
		return null;
	}
	str = trim( str.substring( PREFIX.length, n ) );
	str = str.split( RE_SEP );
	n = str.length;

	// Check for an empty slice (i.e., `MultiSlice()`)...
	if ( n === 1 && str[ 0 ] === '' ) {
		return new MultiSlice();
	}
	args = [];
	for ( i = 0; i < n; i++ ) {
		v = str[ i ];
		if ( v[ 0 ] === 'S' ) {
			v = str.slice( i, i+3 ).join( ',' );
			arg = str2slice( v );
			if ( arg === null ) {
				return null;
			}
			i += 2; // skip over the `Slice(...)` arguments
		} else if ( v === 'null' ) {
			arg = null;
		} else if ( RE_INTEGER.test( v ) ) {
			arg = parseInt( v, 10 );
		} else {
			return null;
		}
		args.push( arg );
	}
	return args2multislice( args );
}
Parses a string-serialized MultiSlice object.

## Notes

-   The function returns `null` if provided an invalid string.

@param {string} str - input string
@returns {(MultiSlice|null)} MultiSlice object (or null)

@example
var s = str2multislice( 'MultiSlice(null,null,null)' );
// returns <MultiSlice>

var v = s.data;
// returns [ null, null, null ]

@example
var s = str2multislice( 'MultiSlice(10,Slice(0,10,1),null)' );
// returns <MultiSlice>

var v = s.data;
// returns [ 10, <Slice>, null ]

@example
var s = str2multislice( 'MultiSlice(foo,bar)' );
// returns null