(function(){
    var Curve = function(stage, multipliers, baseAngle, growth){
	this.stage = stage;
	this.multipliers = multipliers;
	this.baseAngle = baseAngle;
	this.growth = growth;
	this.m = multipliers.length;
    }
    Curve.prototype.drawOn = function(context, options) {
	context.save();

	for(var key in (options || {})) {
	    context[key] = options[key];
	}

	context.beginPath();
	context.moveTo(0, 0);
	var unit = context.canvas.width/ Math.pow(this.growth, this.stage);
	for (var index = 0, total = Math.pow(this.m, this.stage); index < total; index++) {
	    var phase = index;
	    while (phase > 0 && phase % this.m == 0) {
		phase = phase / this.m;
	    }
	    var multiplier = this.multipliers[phase % this.m];
	    var angle = multiplier * this.baseAngle;
	    context.rotate(angle)
	    context.translate(unit, 0);
	    context.lineTo(0, 0);
	}

	context.stroke();

	context.restore();
    }

    var curves = {
	koch : function(stage){ return new Curve(stage, [0, 1, -2, 1], Math.PI/3, 3); },
	kochLike: function(stage, angle){ return new Curve(stage, [0, 1, -2, 1], angle, 2*(1 + Math.cos(angle))); }
    }

    var body = document.getElementsByTagName('body')[0];

    var canvas = document.createElement('canvas');
    canvas.width = 640;
    canvas.height= 640;
    body.appendChild(canvas);

    context = canvas.getContext('2d');
    context.translate(0, canvas.height);
    context.scale(1, -1);

    drawCurve = (function(){
	var start = (new Date()).getTime();
	var period = 12 * 1000;

	function number(t) {
	    return 1 + Math.floor((t - start)/period) % 6
	}

	return function drawCurve(t) {
	    context.save();
	    context.fillRect(0, 0, canvas.width, canvas.height);
	    var alpha = 2 * Math.PI * (t - start) / period;
	    context.translate(0, 10);

	    var koch = new curves.kochLike(number(t), 9*Math.PI/40 * (1 - Math.cos(alpha)));
	    koch.drawOn(context, { strokeStyle: 'white', lineWidth: 1 });
	    context.restore();
	}
    })();

    function continuous(){
	drawCurve((new Date()).getTime());
	requestAnimationFrame(continuous);
    }
    continuous();

})();

@@ -1115,32 +1115,840 @@
 le))); %7D%0A    %7D%0A%0A
+    var Paragraph = function(stage, messages, offsets)%7B%0A%09this.stage = stage;%0A%09this.messages = messages;%0A%09this.offsets = offsets;%0A    %7D%0A    Paragraph.prototype.drawOn = function(context, options)%7B%0A%09context.save();%0A%0A%09context.fillStyle = 'black';%0A%09context.fillRect(0, 0, canvas.width, canvas.height);%0A%0A%09context.restore();%0A%09context.save();%0A%0A%09for(var key in (options %7C%7C %7B%7D)) %7B%0A%09    context%5Bkey%5D = options%5Bkey%5D;%0A%09%7D%0A%0A%09for (var index = 0; index %3C this.messages.length; index++)%7B%0A%09    context.fillText(this.messages%5Bindex%5D, this.offsets.indent, (index + 1) * this.offsets.baseline);%0A%09%7D%0A%0A%09context.restore();%0A%09context.save();%0A%0A%09context.translate(0, canvas.height);%0A%09context.scale(1, -1);%0A%0A%09context.translate(0, 10);%0A%0A%09var koch = new curves.koch(this.stage);%0A%09koch.drawOn(context, options);%0A%0A%09context.restore();%0A    %7D;%0A%0A
     var body = d
@@ -2162,72 +2162,255 @@
 ');%0A
+%0A
     
-context.translate(0, canvas.height);%0A    context.scale(1, -1
+var paragraph = new Paragraph(1, %5B'Life...', 'like the undulations', 'of a river'%5D, %7B 'indent': 10, 'baseline': 60 %7D);%0A    paragraph.drawOn(context, %7B 'fillStyle': 'white', 'font': '50px sans-serif', 'strokeStyle': 'white', 'lineWidth': '1' %7D
 );%0A%0A
@@ -3070,24 +3070,26 @@
 ;%0A    %7D%0A    
+//
 continuous()
@@ -3090,15 +3090,14 @@
 uous();%0A
-%0A
 %7D)();%0A

create a paragraph to display