import std.exception, std.stdio, std.traits;

T[][] multidup(T)(T[][] x)
	if(isMutable!T)
{
	T[][] tmp;
	foreach(row; x) {
		tmp ~= row.dup;
	}
	return tmp;
}

inout(T)[][] multidup(T)(T[][] x) inout
	if(!isMutable!T)
{
	Unqual!T[][] tmp;
	foreach(row; x) {
		tmp ~= row.dup;
	}
	return assumeUnique(tmp);
}

void main()
{
	immutable int[][] x = [[10, 0, 0, 0], [0, 10, 0, 0], [0, 0, 10, 0], [0, 0, 0, 10]];
	int[][] y = multidup(x);

	writeln("x = ", x);
	writeln("y = ", y);

	y[0][1] = 5;

	writeln("x = ", x);
	writeln("y = ", y);
}

