function squarify(node, options, hideChildren, depth) {
	        var width;
	        var height;

	        if (node.isRemoved()) {
	            return;
	        }

	        var thisLayout = node.getLayout();
	        width = thisLayout.width;
	        height = thisLayout.height;

	        // Considering border and gap
	        var nodeModel = node.getModel();
	        var borderWidth = nodeModel.get(PATH_BORDER_WIDTH);
	        var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2;
	        var upperLabelHeight = getUpperLabelHeight(nodeModel);
	        var upperHeight = Math.max(borderWidth, upperLabelHeight);
	        var layoutOffset = borderWidth - halfGapWidth;
	        var layoutOffsetUpper = upperHeight - halfGapWidth;
	        var nodeModel = node.getModel();

	        node.setLayout({
	            borderWidth: borderWidth,
	            upperHeight: upperHeight,
	            upperLabelHeight: upperLabelHeight
	        }, true);

	        width = mathMax(width - 2 * layoutOffset, 0);
	        height = mathMax(height - layoutOffset - layoutOffsetUpper, 0);

	        var totalArea = width * height;
	        var viewChildren = initChildren(
	            node, nodeModel, totalArea, options, hideChildren, depth
	        );

	        if (!viewChildren.length) {
	            return;
	        }

	        var rect = {x: layoutOffset, y: layoutOffsetUpper, width: width, height: height};
	        var rowFixedLength = mathMin(width, height);
	        var best = Infinity; // the best row score so far
	        var row = [];
	        row.area = 0;

	        for (var i = 0, len = viewChildren.length; i < len;) {
	            var child = viewChildren[i];

	            row.push(child);
	            row.area += child.getLayout().area;
	            var score = worst(row, rowFixedLength, options.squareRatio);

	            // continue with this orientation
	            if (score <= best) {
	                i++;
	                best = score;
	            }
	            // abort, and try a different orientation
	            else {
	                row.area -= row.pop().getLayout().area;
	                position(row, rowFixedLength, rect, halfGapWidth, false);
	                rowFixedLength = mathMin(rect.width, rect.height);
	                row.length = row.area = 0;
	                best = Infinity;
	            }
	        }

	        if (row.length) {
	            position(row, rowFixedLength, rect, halfGapWidth, true);
	        }

	        if (!hideChildren) {
	            var childrenVisibleMin = nodeModel.get('childrenVisibleMin');
	            if (childrenVisibleMin != null && totalArea < childrenVisibleMin) {
	                hideChildren = true;
	            }
	        }

	        for (var i = 0, len = viewChildren.length; i < len; i++) {
	            squarify(viewChildren[i], options, hideChildren, depth + 1);
	        }
	    }
Positions the specified row of nodes. Modifies `rect`.