--- iolanguage-20080107.orig/libs/iovm/source/IoVMInit.c
+++ iolanguage-20080107/libs/iovm/source/IoVMInit.c
@@ -0,0 +1,3016 @@
+#include "IoState.h"
+#include "IoObject.h"
+
+void IoVMCodeInit(IoObject *context)
+{
+	IoState *self = IoObject_state((IoObject *)context);
+	char *s;
+
+	s = "Object do(\n"
+  	"	inlineMethod := method(call message argAt(0) setIsActivatable(true))\n"
+  	")\n"
+  	"\n"
+  	"List do(\n"
+  	"    unique := method(\n"
+  	"        u := List clone\n"
+  	"        self foreach(v, u appendIfAbsent(v))\n"
+  	"        u\n"
+  	"    )\n"
+  	"    \n"
+  	"	select := method(\n"
+  	"     	aList := List clone\n"
+  	"\n"
+  	"     	a1 := call argAt(0) \n"
+  	" 		if(a1 == nil, \n"
+  	" 			Exception raise(\"missing argument\")\n"
+  	" 			return \n"
+  	" 		)\n"
+  	"    	a2 := call argAt(1) \n"
+  	"     	a3 := call argAt(2)\n"
+  	"     	\n"
+  	"     	if(a3,\n"
+  	"     		a1 := a1 name\n"
+  	"     		a2 := a2 name\n"
+  	"			self foreach(i, v, \n"
+  	"				call sender setSlot(a1, i)\n"
+  	"				call sender setSlot(a2, getSlot(\"v\"))\n"
+  	"				ss := stopStatus(c := a3 doInContext(call sender, call sender))\n"
+  	"				if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"				if(ss stopLooping, break)\n"
+  	"				if(ss isContinue, continue)\n"
+  	"     			if(getSlot(\"c\"), aList append(getSlot(\"v\")))\n"
+  	"			)\n"
+  	"			return aList\n"
+  	"     	)\n"
+  	"     	\n"
+  	"     	if(a2,\n"
+  	"     		a1 := a1 name\n"
+  	"			self foreach(v, \n"
+  	"				call sender setSlot(a1, getSlot(\"v\"))\n"
+  	"				ss := stopStatus(c := a2 doInContext(call sender, call sender))\n"
+  	"				if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"				if(ss stopLooping, break)\n"
+  	"				if(ss isContinue, continue)\n"
+  	"     			if(getSlot(\"c\"), aList append(getSlot(\"v\")))\n"
+  	"			)\n"
+  	"			return aList     	\n"
+  	"     	)\n"
+  	"     	\n"
+  	"     	self foreach(v, \n"
+  	"			ss := stopStatus(c := a1 doInContext(getSlot(\"v\"), call sender))\n"
+  	"			if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"			if(ss stopLooping, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"			if(getSlot(\"c\"), aList append(getSlot(\"v\")))\n"
+  	"     	)\n"
+  	"     	aList     	\n"
+  	"	)\n"
+  	"	\n"
+  	"	detect := method(\n"
+  	"     	a1 := call argAt(0) \n"
+  	"		if(a1 == nil, Exception raise(\"missing argument\"))\n"
+  	"     	a2 := call argAt(1) \n"
+  	"     	a3 := call argAt(2)\n"
+  	"     	\n"
+  	"     	if(a3,\n"
+  	"     		a1 := a1 name\n"
+  	"     		a2 := a2 name\n"
+  	"			self foreach(i, v, \n"
+  	"				call sender setSlot(a1, i)\n"
+  	"				call sender setSlot(a2, getSlot(\"v\"))\n"
+  	"				ss := stopStatus(c := a3 doInContext(call sender, call sender))\n"
+  	"				if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"				if(ss stopLooping, break)\n"
+  	"				if(ss isContinue, continue)\n"
+  	"				if(getSlot(\"c\"), return getSlot(\"v\"))\n"
+  	"			)\n"
+  	"			return nil\n"
+  	"     	)\n"
+  	"     	\n"
+  	"     	if(a2,\n"
+  	"     		a1 := a1 name\n"
+  	"			self foreach(v, \n"
+  	"				call sender setSlot(a1, getSlot(\"v\"))\n"
+  	"				ss := stopStatus(c := a2 doInContext(call sender, call sender))\n"
+  	"				if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"				if(ss stopLooping, break)\n"
+  	"				if(ss isContinue, continue)\n"
+  	"				if(getSlot(\"c\"), return getSlot(\"v\"))\n"
+  	"			)\n"
+  	"			return nil     	\n"
+  	"     	)\n"
+  	"     	\n"
+  	"     	self foreach(v,\n"
+  	"			ss := stopStatus(c := a1 doInContext(getSlot(\"v\"), call sender))\n"
+  	"			if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"			if(ss stopLooping, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"			if(getSlot(\"c\"), return getSlot(\"v\"))\n"
+  	"     	)\n"
+  	"     	nil     	\n"
+  	"	)\n"
+  	"\n"
+  	"	map := method(\n"
+  	"		aList := List clone\n"
+  	"		\n"
+  	"     	a1 := call argAt(0) \n"
+  	"		if(a1 == nil, Exception raise(\"missing argument\"))\n"
+  	"     	a2 := call argAt(1) \n"
+  	"     	a3 := call argAt(2)\n"
+  	"     	\n"
+  	"     	if(a2 == nil,\n"
+  	"			self foreach(v, \n"
+  	"				ss := stopStatus(c := a1 doInContext(getSlot(\"v\"), call sender))\n"
+  	"				if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"				if(ss stopLooping, break)\n"
+  	"				if(ss isContinue, continue)\n"
+  	"				aList append(getSlot(\"c\"))\n"
+  	"     		)\n"
+  	"     		return aList\n"
+  	"     	)\n"
+  	"\n"
+  	"     	if(a3 == nil,\n"
+  	"     		a1 := a1 name\n"
+  	"			self foreach(v, \n"
+  	"				call sender setSlot(a1, getSlot(\"v\"))\n"
+  	"				ss := stopStatus(c := a2 doInContext(call sender, call sender))\n"
+  	"				if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"				if(ss stopLooping, break)\n"
+  	"				if(ss isContinue, continue)\n"
+  	"				aList append(getSlot(\"c\"))\n"
+  	"			)\n"
+  	"			return aList     	\n"
+  	"     	)\n"
+  	"     	     	\n"
+  	"		a1 := a1 name\n"
+  	"		a2 := a2 name\n"
+  	"		self foreach(i, v, \n"
+  	"			call sender setSlot(a1, i)\n"
+  	"			call sender setSlot(a2, getSlot(\"v\"))\n"
+  	"			ss := stopStatus(c := a3 doInContext(call sender, call sender))\n"
+  	"			if(ss isReturn, ss return getSlot(\"c\"))\n"
+  	"			if(ss stopLooping, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"			aList append(getSlot(\"c\"))\n"
+  	"		)\n"
+  	"		return aList     	\n"
+  	"	)\n"
+  	"	\n"
+  	"	copy := method(v, self empty; self appendSeq(v); self)\n"
+  	"	\n"
+  	"	mapInPlace := method(\n"
+  	"		self copy(self getSlot(\"map\") performOn(self, call sender, call message))\n"
+  	"	)\n"
+  	"	\n"
+  	"	selectInPlace := method(\n"
+  	"		self copy(self getSlot(\"select\") performOn(self, call sender, call message))\n"
+  	"	)  \n"
+  	"	\n"
+  	"	empty := method(self removeAll)\n"
+  	"\n"
+  	"    isEmpty := method(size == 0)\n"
+  	"    isNotEmpty := method(size > 0)\n"
+  	"\n"
+  	"    sort := method(self clone sortInPlace)\n"
+  	"    sortBy := method(b, self clone sortInPlaceBy(getSlot(\"b\")))\n"
+  	"    /*\n"
+  	"    print := method(\n"
+  	"        e := try(\n"
+  	"            s := Sequence clone \n"
+  	"            s appendSeq(\"list(\")\n"
+  	"            self foreach(i, v,\n"
+  	"                if(i != 0, s appendSeq(\", \"))\n"
+  	"                s appendSeq(getSlot(\"v\") asString)\n"
+  	"            )\n"
+  	"        )\n"
+  	"        \n"
+  	"        if(e,\n"
+  	"            s := Sequence clone \n"
+  	"            s appendSeq(\"list(\")\n"
+  	"            self foreach(i, v,\n"
+  	"                if(i != 0, s appendSeq(\", \"))\n"
+  	"                vs := \"[exception]\"\n"
+  	"                try(vs := getSlot(\"v\") asString)\n"
+  	"                s appendSeq(vs)\n"
+  	"            )        \n"
+  	"        \n"
+  	"        )\n"
+  	"        s appendSeq(\")\")\n"
+  	"        s print\n"
+  	"        self\n"
+  	"    )\n"
+  	"    */\n"
+  	"    \n"
+  	"    second := method(at(1))\n"
+  	"    third := method(at(2))\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/A0_List.io");
+
+	s = "OperatorTable do(\n"
+  	"	addOperator := method(symbol, precedence,\n"
+  	"		precedence = precedence ifNilEval(0)\n"
+  	"		operators atPut(symbol, precedence)\n"
+  	"		self\n"
+  	"	)\n"
+  	"\n"
+  	"	addAssignOperator := method(symbol, messageName,\n"
+  	"		assignOperators atPut(symbol, messageName)\n"
+  	"		self\n"
+  	"	)\n"
+  	"\n"
+  	"	asString := method(\n"
+  	"		s := Sequence clone appendSeq(OperatorTable asSimpleString, \":\\n\")\n"
+  	"\n"
+  	"		s appendSeq(\"Operators\")\n"
+  	"		OperatorTable operators values unique sort foreach(precedence,\n"
+  	"			s appendSeq(\"\\n  \", precedence asString alignLeft(4), OperatorTable operators select(k, v, v == precedence) keys sort join(\" \"))\n"
+  	"		)\n"
+  	"\n"
+  	"		s appendSeq(\"\\n\\nAssign Operators\")\n"
+  	"		OperatorTable assignOperators keys sort foreach(symbol,\n"
+  	"			name := OperatorTable assignOperators at(symbol)\n"
+  	"			s appendSeq(\"\\n  \", symbol alignLeft(4), name)\n"
+  	"		)\n"
+  	"\n"
+  	"		s appendSeq(\"\\n\\n\")\n"
+  	"		s appendSeq(\"To add a new operator: OperatorTable addOperator(\\\"+\\\", 4) and implement the + message.\\n\")\n"
+  	"		s appendSeq(\"To add a new assign operator: OperatorTable addAssignOperator(\\\"=\\\", \\\"updateSlot\\\") and implement the updateSlot message.\\n\")\n"
+  	"\n"
+  	"		s\n"
+  	"	)\n"
+  	"\n"
+  	"	reverseAssignOperators := method(assignOperators reverseMap)\n"
+  	")\n"
+  	"\n"
+  	"# Make the lookup path shorter for the opShuffle. IoMessage_opShuffle looks up\n"
+  	"# the OperatorTable object on the first message before starting shuffling.\n"
+  	"Message OperatorTable := OperatorTable\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/A1_OperatorTable.io");
+
+	s = "/*\n"
+  	"nil ioDoc(\n"
+  	"  docCopyright(\"Steve Dekorte\", 2002)\n"
+  	"  docLicense(\"BSD revised\")\n"
+  	"  docObject(\"nil\")\n"
+  	"  docDescription(\"nil is a singleton object that is used as a placeholder and to mean false in Io.\")\n"
+  	")\n"
+  	"\n"
+  	"nil do(\n"
+  	"    docSlot(\"clone\", \"returns self since nil is a singleton.\")\n"
+  	"	clone := nil\n"
+  	"\n"
+  	"	docSlot(\"and(expression)\", \"Returns nil without evaluating expression.\")\n"
+  	"	setSlot(\"and\", nil)\n"
+  	"\n"
+  	"	elseif := Object getSlot(\"if\")\n"
+  	"\n"
+  	"	docSlot(\"then(expression)\", \"Returns nil without evaluating expression.\")\n"
+  	"	setSlot(\"then\", nil)\n"
+  	"\n"
+  	"	docSlot(\"else(expression)\", \"Returns nil without evaluating expression.\")\n"
+  	"	setSlot(\"else\", method(v, v))\n"
+  	"\n"
+  	"	docSlot(\"or(anObject)\", \"Returns anObject if anObject is not nil. Otherwise returns nil.\")\n"
+  	"	setSlot(\"or\", method(v, if(v, v, nil)))\n"
+  	"\n"
+  	"	docSlot(\"print\", \"Prints 'nil'. Returns self.\")\n"
+  	"	print := method(write(\"nil\"))\n"
+  	"\n"
+  	"	setSlot(\"==\", method(v, self isIdenticalTo(v)))\n"
+  	"	setSlot(\"!=\", method(v, self isIdenticalTo(v) not))\n"
+  	"\n"
+  	"	docSlot(\"isNil\", \"Returns Lobby.\")\n"
+  	"	isNil := Lobby\n"
+  	"\n"
+  	"	docSlot(\"ifNil(expression)\", \"Evaluates message.\")\n"
+  	"	ifNil := method(v, v)  \n"
+  	")\n"
+  	"*/\n"
+  	"\n"
+  	"// if(a == 1) then(b) elseif(b == c) then(d) else(f)\n"
+  	"// (a == 1) ifTrue(b) ifFalse(c)\n"
+  	"\n"
+  	"true do(\n"
+  	"        then    := Object getSlot(\"evalArgAndReturnNil\")\n"
+  	"        elseif  := true\n"
+  	"        else    := true\n"
+  	"	ifTrue  := Object getSlot(\"evalArgAndReturnSelf\")\n"
+  	"	ifFalse := true\n"
+  	"	setSlot(\"and\", Object getSlot(\"evalArg\"))\n"
+  	"	setSlot(\"or\", true)\n"
+  	"	asString := \"true\"\n"
+  	"	asSimpleString := \"true\"\n"
+  	"	not := false\n"
+  	"	clone := true\n"
+  	")\n"
+  	"\n"
+  	"false do(\n"
+  	"        then    := false\n"
+  	"	ifTrue  := false\n"
+  	"	ifFalse := Object getSlot(\"evalArgAndReturnSelf\")\n"
+  	"        elseif  := Object getSlot(\"if\")\n"
+  	"        else := Object getSlot(\"evalArgAndReturnNil\")\n"
+  	"	setSlot(\"and\", false)\n"
+  	"	setSlot(\"or\", Object getSlot(\"evalArg\"))\n"
+  	"	\n"
+  	"	type := \"false\"\n"
+  	"	asString := \"false\"\n"
+  	"	asSimpleString := \"false\"\n"
+  	"	not := true\n"
+  	"	clone := false\n"
+  	")\n"
+  	"\n"
+  	"nil do(\n"
+  	"	not := true\n"
+  	"	isNil := true\n"
+  	"	\n"
+  	"	ifNonNil := Object getSlot(\"thisContext\")\n"
+  	"    ifNil := Object getSlot(\"evalArgAndReturnSelf\")\n"
+  	"	\n"
+  	"	ifNilEval    := Object getSlot(\"evalArg\")\n"
+  	"	ifNonNilEval := Object getSlot(\"thisContext\")	\n"
+  	"	\n"
+  	"	type := \"nil\"\n"
+  	"	asString := type\n"
+  	"	asSimpleString := type\n"
+  	"	\n"
+  	"	setSlot(\"and\", false)\n"
+  	"	setSlot(\"or\", Object getSlot(\"evalArg\"))\n"
+  	"        then := nil\n"
+  	"        else := nil\n"
+  	"        elseif := nil\n"
+  	"	clone := nil\n"
+  	")\n"
+  	"\n"
+  	"Call do(\n"
+  	"	relayStopStatus := method(\n"
+  	"		ss := stopStatus(r := call evalArgAt(0))\n"
+  	"		call sender call setStopStatus(ss)\n"
+  	"		getSlot(\"r\")\n"
+  	"	)\n"
+  	"\n"
+  	"	resetStopStatus := method(\n"
+  	"		setStopStatus(Normal)\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"Normal do(\n"
+  	"	stopLooping := false\n"
+  	"	isReturn := false\n"
+  	"	isBreak := false\n"
+  	"	isContinue := false\n"
+  	"\n"
+  	"	return := method(arg,\n"
+  	"		call setStopStatus(Return)\n"
+  	"		getSlot(\"arg\")\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"Eol appendProto(Normal)\n"
+  	"Continue appendProto(Normal) do(\n"
+  	"	isContinue := true\n"
+  	")\n"
+  	"\n"
+  	"Break appendProto(Normal) do(\n"
+  	"	stopLooping := true\n"
+  	"	isBreak := true\n"
+  	")\n"
+  	"\n"
+  	"Return appendProto(Normal) do(\n"
+  	"	stopLooping := true\n"
+  	"	isReturn := true\n"
+  	"\n"
+  	"	return := method(arg,\n"
+  	"		call setStopStatus(Return)\n"
+  	"		call sender call setStopStatus(Return)\n"
+  	"		getSlot(\"arg\")\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"Object do(\n"
+  	"	not := nil\n"
+  	"\n"
+  	"	isNil := false\n"
+  	"	\n"
+  	"	ifNil := Object getSlot(\"thisContext\")\n"
+  	"    ifNonNil := Object getSlot(\"evalArgAndReturnSelf\")\n"
+  	"	\n"
+  	"	ifNonNilEval := Object getSlot(\"evalArg\")\n"
+  	"	ifNilEval    := Object getSlot(\"thisContext\")	\n"
+  	"		\n"
+  	"	setSlot(\"and\", Object getSlot(\"evalArg\"))\n"
+  	"	setSlot(\"or\", true)\n"
+  	")\n"
+  	"\n"
+  	"Sequence do(\n"
+  	"    makeFirstCharacterLowercase := method(\n"
+  	"	   if(self size > 0, self atPut(0, self at(0) asLowercase))\n"
+  	"    )\n"
+  	"\n"
+  	"    makeFirstCharacterUppercase := method(\n"
+  	"	   if(self size > 0, self atPut(0, self at(0) asUppercase))\n"
+  	"    )\n"
+  	"\n"
+  	"    slicesBetween := method(startSeq, endSeq,\n"
+  	"        chunks := List clone\n"
+  	"        lastIndex := 0\n"
+  	"        while (startIndex := self findSeq(startSeq, lastIndex),\n"
+  	"            endIndex := self findSeq(endSeq, startIndex + startSeq size)\n"
+  	"            endIndex ifNil(break)\n"
+  	"            chunks append(self slice(startIndex + startSeq size, endIndex))\n"
+  	"            lastIndex := endIndex + endSeq size\n"
+  	"        )\n"
+  	"        chunks\n"
+  	"    )\n"
+  	")\n"
+  	"\n"
+  	"Object do(\n"
+  	"    hasSlot := method(n,\n"
+  	"        getSlot(\"self\") hasLocalSlot(n) or(getSlot(\"self\") ancestorWithSlot(n) != nil)\n"
+  	"    )\n"
+  	"\n"
+  	"    docsSlot := method(\n"
+  	"	   if(getSlot(\"self\") hasLocalSlot(\"docs\"), \n"
+  	"	   getSlot(\"self\") docs, \n"
+  	"	   getSlot(\"self\") docs := Object clone do(slots := Object clone)\n"
+  	"	   )\n"
+  	"    )\n"
+  	"    \n"
+  	"    \n"
+  	"    docSlot := method(k, v, \n"
+  	"        entry := Object clone \n"
+  	"        entry description := v asSymbol\n"
+  	"        if (k containsSeq(\"(\"), \n"
+  	"            entry args := k afterSeq(\"(\") beforeSeq(\")\") split(\",\") map(strip)\n"
+  	"        )	\n"
+  	"        getSlot(\"self\") docsSlot slots setSlot(k beforeSeq(\"(\"), entry)\n"
+  	"    )\n"
+  	"        \n"
+  	"    docCopyright := method(v, \n"
+  	"	   k := call message name asMutable removePrefix(\"doc\") makeFirstCharacterLowercase\n"
+  	"	   getSlot(\"self\") docsSlot setSlot(k, v)\n"
+  	"    )\n"
+  	"    //docCopyright := nil //    turnOffDocs\n"
+  	" \n"
+  	"    docLicense := getSlot(\"docCopyright\")\n"
+  	"    docObject := getSlot(\"docCopyright\")\n"
+  	"    docDescription := getSlot(\"docCopyright\")\n"
+  	"    docCredits := getSlot(\"docCopyright\")\n"
+  	"    docInclude := getSlot(\"docCopyright\")\n"
+  	"    docDependsOn := getSlot(\"docCopyright\")\n"
+  	"    docCategory := getSlot(\"docCopyright\")\n"
+  	"\n"
+  	"    ioDoc := method(\n"
+  	"	   if(call argAt(0), getSlot(\"self\") doMessage(call argAt(0)))\n"
+  	"    )\n"
+  	"    \n"
+  	"    ioDoc := nil\n"
+  	"    \n"
+  	"    docSlot(\"list(...)\", \"Returns a List containing the arguments.\")\n"
+  	"    list := method(call message argsEvaluatedIn(call sender))\n"
+  	"    \n"
+  	"    docSlot(\"..(arg)\", \".. is an alias for: method(arg, self asString append(arg asString))\")\n"
+  	"    setSlot(\"..\", method(arg, getSlot(\"self\") asString .. arg asString))\n"
+  	"    \n"
+  	"    Map addKeysAndValues := method(keys, values, keys foreach(i, k, self atPut(k, values at(i))); self)\n"
+  	"    \n"
+  	"    slotDescriptionMap := method(\n"
+  	"        slotNames := getSlot(\"self\") slotNames sort \n"
+  	"        slotDescs := slotNames map(name, getSlot(\"self\") getSlot(name) asSimpleString)\n"
+  	"        Map clone addKeysAndValues(slotNames, slotDescs) \n"
+  	"    )\n"
+  	"\n"
+  	"    apropos := method(keyword,\n"
+  	"        Protos Core foreachSlot(name, p,\n"
+  	"            slotDescriptions := getSlot(\"p\") slotDescriptionMap ?select(k, v, k asMutable lowercase containsSeq(keyword))\n"
+  	"\n"
+  	"            if(slotDescriptions and slotDescriptions size > 0,\n"
+  	"                s := Sequence clone\n"
+  	"                slotDescriptions keys sortInPlace foreach(k,\n"
+  	"                    s appendSeq(\"  \", k alignLeft(16), \" = \", slotDescriptions at(k), \"\\n\")\n"
+  	"                )\n"
+  	"\n"
+  	"                writeln(name)\n"
+  	"                writeln(s)\n"
+  	"            )\n"
+  	"        )\n"
+  	"        nil\n"
+  	"    )\n"
+  	"    \n"
+  	"    slotSummary := method(keyword,\n"
+  	"        if(getSlot(\"self\") type == \"Block\" and getSlot(\"self\") == getSlot(\"Block\"),\n"
+  	"            return getSlot(\"self\") asSimpleString\n"
+  	"        )\n"
+  	"        s := Sequence clone\n"
+  	"        s appendSeq(\" \", getSlot(\"self\") asSimpleString, \":\\n\")\n"
+  	"        slotDescriptions := slotDescriptionMap\n"
+  	"        if(keyword,\n"
+  	"            slotDescriptions = slotDescriptions select(k, v, k asMutable lowercase containsSeq(keyword))\n"
+  	"        )\n"
+  	"        slotDescriptions keys sortInPlace foreach(k,\n"
+  	"            s appendSeq(\"  \", k alignLeft(16), \" = \", slotDescriptions at(k), \"\\n\")\n"
+  	"        )\n"
+  	"        s\n"
+  	"    )\n"
+  	"    \n"
+  	"    asString := getSlot(\"slotSummary\")\n"
+  	"    \n"
+  	"    asSimpleString := method(getSlot(\"self\") type .. \"_\" .. getSlot(\"self\") uniqueHexId)\n"
+  	"    \n"
+  	"    docSlot(\"newSlot(slotName, aValue)\", \n"
+  	"    \"\"\"Creates a getter and setter for the slot with the name slotName \n"
+  	"    and sets it's default the value aValue. Returns self. For example, \n"
+  	"    newSlot(\"foo\", 1) would create slot named foo with the value 1 as well as a setter method setFoo().\"\"\")\n"
+  	"\n"
+  	"    newSlot := method(name, value, doc,\n"
+  	"		getSlot(\"self\") setSlot(name, getSlot(\"value\"))\n"
+  	"		getSlot(\"self\") setSlot(\"set\" .. name asCapitalized, \n"
+  	"			doString(\"method(\" .. name .. \" = call evalArgAt(0); self)\"))\n"
+  	"			if(doc, getSlot(\"self\") docSlot(name, doc))\n"
+  	"		value\n"
+  	"    )\n"
+  	"    \n"
+  	"    docSlot(\"launchFile(pathString)\", \n"
+  	"    \"Eval file at pathString as if from the command line in it's folder.\")\n"
+  	"    \n"
+  	"    launchFile := method(path, args,\n"
+  	"        args ifNil(args = List clone)\n"
+  	"        Lobby args := args\n"
+  	"        Lobby launchPath :=  path pathComponent\n"
+  	"        Directory setCurrentWorkingDirectory(Lobby launchPath)\n"
+  	"		System launchScript = path\n"
+  	"        self doFile(path)\n"
+  	"    )\n"
+  	"    \n"
+  	"    docSlot(\"println\", \"Same as print, but also prints a new line. Returns self.\")\n"
+  	"    println := method(getSlot(\"self\") print; write(\"\\n\"); self)\n"
+  	"\n"
+  	"    docSlot(\"?(aMessage)\", \"\"\"\n"
+  	"    description: Sends the message aMessage to the receiver if it can respond to it. Example:\n"
+  	"    <pre>\n"
+  	"    MyObject test // performs test\n"
+  	"    MyObject ?test // performs test if MyObject has a slot named test\n"
+  	"    </pre>\n"
+  	"    The search for the slot only follows the receivers proto chain. \n"
+  	"    \"\"\")\n"
+  	"\n"
+  	"    setSlot(\"?\",\n"
+  	"		method(\n"
+  	"			m := call argAt(0)\n"
+  	"			if (self getSlot(m name) != nil,\n"
+  	"				call relayStopStatus(m doInContext(self, call sender))\n"
+  	"			,\n"
+  	"				nil\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"    docSlot(\"ancestors\", \n"
+  	"    \"Returns a list of all of the receiver's ancestors as found by recursively following the protos links.\") \n"
+  	"\n"
+  	"    ancestors := method(a, \n"
+  	"        if(a, if(a detect(x, x isIdenticalTo(self)), return a), a = List clone)\n"
+  	"        a append(self)\n"
+  	"        self protos foreach(ancestors(a))\n"
+  	"        a\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"isKindOf(anObject)\", \"Returns true if anObject is in the receiver's ancestors.\") \n"
+  	"\n"
+  	"    isKindOf := method(anObject, getSlot(\"self\") ancestors contains(getSlot(\"anObject\")))\n"
+  	"    \n"
+  	"    docSlot(\"super(aMessage)\", \n"
+  	"    \"\"\"Sends the message aMessage to the receiver's proto with the context of self. Example:\n"
+  	"    <pre>\n"
+  	"    self test(1, 2)   // performs test(1, 2) on self\n"
+  	"    super(test(1, 2)) // performs test(1, 2) on self proto but with the context of self\n"
+  	"    </pre>\n"
+  	"    \"\"\")\n"
+  	"\n"
+  	"	setSlot(\"super\", method(\n"
+  	"		senderSlotContext := call sender call slotContext\n"
+  	"		m := call argAt(0)\n"
+  	"		m ifNil(Exception raise(\"Object super requires an argument\"))\n"
+  	"		senderSlotContext ifNil(Exception raise(\"Object super called outside of block context\"))\n"
+  	"		slotName := m name\n"
+  	"		ancestor := senderSlotContext ancestorWithSlot(slotName)\n"
+  	"		if(ancestor == nil,\n"
+  	"			slotName = \"forward\"\n"
+  	"			ancestor = senderSlotContext ancestorWithSlot(slotName)\n"
+  	"		)\n"
+  	"		if(ancestor isIdenticalTo(senderSlotContext), Exception raise(\"Object super slot \" .. slotName .. \" not found\"))\n"
+  	"		b := ancestor getSlot(slotName)\n"
+  	"		if(getSlot(\"b\") isActivatable == false, \n"
+  	"			b\n"
+  	"		, \n"
+  	"			getSlot(\"b\") performOn(call sender call target, call sender, m, ancestor)\n"
+  	"		)\n"
+  	"	))\n"
+  	"\n"
+  	"    docSlot(\"resend\", \n"
+  	"    \"\"\"Send the message used to activate the current method to the Object's proto.\n"
+  	"    For example;\n"
+  	"    <pre>\n"
+  	"    Dog := Mammal clone do(\n"
+  	"	init := method(\n"
+  	"	    resend\n"
+  	"	)\n"
+  	"    )\n"
+  	"    </pre>\n"
+  	"    calling Dog init will send an init method to Mammal, but using the Dog's context.\n"
+  	"    \"\"\")\n"
+  	"\n"
+  	"	setSlot(\"resend\", method(\n"
+  	"		senderSlotContext := call sender call slotContext\n"
+  	"		senderSlotContext ifNil(Exception raise(\"Object resend called outside of block context\"))\n"
+  	"		m := call sender call message\n"
+  	"		slotName := m name\n"
+  	"		ancestor := senderSlotContext ancestorWithSlot(slotName)\n"
+  	"		\n"
+  	"        if(ancestor isIdenticalTo(nil),\n"
+  	"            slotName = \"forward\"\n"
+  	"            ancestor = senderSlotContext ancestorWithSlot(slotName)\n"
+  	"        )\n"
+  	"\n"
+  	"        if(ancestor isIdenticalTo(senderSlotContext),\n"
+  	"            Exception raise(\"Object resend slot \" .. slotName .. \" not found\")\n"
+  	"        )\n"
+  	"        \n"
+  	"        b := ancestor getSlot(slotName) \n"
+  	"        if(getSlot(\"b\") != nil, \n"
+  	"            getSlot(\"b\") performOn(call sender getSlot(\"self\"), call sender call sender, m, ancestor)\n"
+  	"        , \n"
+  	"            getSlot(\"b\")\n"
+  	"        )\n"
+  	"    ))\n"
+  	"\n"
+  	"\n"
+  	"    docSlot(\"list(...)\", \"Returns a List containing the arguments.\")\n"
+  	"    list := method(call message argsEvaluatedIn(call sender))\n"
+  	"\n"
+  	"    Object print := method(write(getSlot(\"self\") asString); getSlot(\"self\"))\n"
+  	"\n"
+  	"    docSlot(\"println\", \"Same as print, but also prints a new line. Returns self.\")\n"
+  	"    println := method(getSlot(\"self\") print; write(\"\\n\"); getSlot(\"self\"))\n"
+  	"\n"
+  	"    docSlot(\"in(aList)\", \"Same as: aList contains(self)\")\n"
+  	"    in := method(aList, aList contains(self)) \n"
+  	"\n"
+  	"	uniqueHexId := method(\"0x\" .. getSlot(\"self\") uniqueId asString toBase(16))\n"
+  	"	\n"
+  	"	lazySlot := method(\n"
+  	"		if(call argCount == 1,\n"
+  	"			m := method(\n"
+  	"				self setSlot(call message name, nil)\n"
+  	"			)\n"
+  	"\n"
+  	"			args := getSlot(\"m\") message next arguments\n"
+  	"			args atPut(1, call argAt(0) clone)\n"
+  	"			getSlot(\"m\") message next setArguments(args)\n"
+  	"\n"
+  	"			getSlot(\"m\") clone\n"
+  	"		,\n"
+  	"			name := call evalArgAt(0)\n"
+  	"			m := (\"self setSlot(\\\"\" .. name .. \"\\\", \" .. call argAt(1) code .. \")\") asMessage\n"
+  	"			self setSlot(name, method() setMessage(m))\n"
+  	"			nil\n"
+  	"		)\n"
+  	"	)\n"
+  	"	\n"
+  	"	foreachSlot := method(\n"
+  	"		self slotNames sort foreach(n,\n"
+  	"			call sender setSlot(call message argAt(0) name, n)\n"
+  	"			call sender setSlot(call message argAt(1) name, getSlot(\"self\") getSlot(n))\n"
+  	"			r := call relayStopStatus(call evalArgAt(2))\n"
+  	"			if(call stopStatus isReturn, return getSlot(\"r\"))\n"
+  	"			if(call stopStatus stopLooping,\n"
+  	"				call resetStopStatus\n"
+  	"				break\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"switch\", \"\"\"\n"
+  	"	Execute an expression depending on the value of the caller. (This is an equivalent to C switch/case)\n"
+  	"	<pre>\n"
+  	"	hour := Date hour switch(\n"
+  	"		12, \"midday\",\n"
+  	"		0, \"midnight\",\n"
+  	"		17, \"teatime\",\n"
+  	"		Date hour asString\n"
+  	"	)\n"
+  	"	</pre>\n"
+  	"	\"\"\")\n"
+  	"	switch := method(\n"
+  	"		for(couple, 0, call argCount - 2, 2, \n"
+  	"			if(call evalArgAt(couple) == self, \n"
+  	"				return call relayStopStatus(call evalArgAt(couple + 1))\n"
+  	"			)\n"
+  	"		)\n"
+  	"		if(call argCount isOdd,\n"
+  	"			call relayStopStatus(call evalArgAt(call argCount - 1))\n"
+  	"		,\n"
+  	"			nil\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"isLaunchScript\", \"Returns true if the current file was run on the command line. Io's version of Python's __file__ == \\\"__main__\\\"\")\n"
+  	"	isLaunchScript := method(\n"
+  	"		call message label == System launchScript\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"doRelativeFile(pathString)\",\n"
+  	"			\"Evaluates the File in the context of the receiver. Returns the result. pathString is relative to the file calling doRelativeFile. (Duplicate of relativeDoFile)\")\n"
+  	"	doRelativeFile := method(path,\n"
+  	"		self doFile(Path with(call message label pathComponent, path))\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"relativeDoFile(pathString)\",\n"
+  	"			\"Evaluates the File in the context of the receiver. Returns the result. pathString is relative to the file calling doRelativeFile. (Duplicate of doRelativeFile)\")\n"
+  	"	relativeDoFile := getSlot(\"doRelativeFile\")\n"
+  	")\n"
+  	"\n"
+  	"Lobby args := method(System args)\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/A2_Object.io");
+
+	s = "\n"
+  	"List do(\n"
+  	"    docSlot(\"sum\", \"Returns the sum of the items.\")\n"
+  	"    sum := method(s := 0; self foreach(v, s = s + v); s)\n"
+  	"\n"
+  	"    docSlot(\"average\", \"Returns the average of the items.\")\n"
+  	"    average := method(self sum / self size)\n"
+  	"\n"
+  	"    docSlot(\"shuffle\", \"Randomizes the order of the elements in the receiver. Returns self.\")\n"
+  	"    shuffle := method(for(i, 0, size - 1, swapIndices(i, Random value(i, size) floor)))\n"
+  	"\n"
+  	"    docSlot(\"anyOne\", \"Returns a random element of the receiver or nil if the receiver is empty.\")\n"
+  	"    anyOne := method(at(Random value(0, size) floor))\n"
+  	" \n"
+  	"    docSlot(\"removeFirst\", \"Returns the first item and removes it from the list. nil is returned if the list is empty.\")\n"
+  	"    removeFirst := method(if(self size != 0, removeAt(0), nil))\n"
+  	"\n"
+  	"    docSlot(\"removeLast\", \"Returns the last item and removes it from the list. nil is returned if the list is empty.\")\n"
+  	"    removeLast := method(self pop)\n"
+  	"\n"
+  	"    docSlot(\"removeSeq\", \"Removes each of the items from the current list which are contained in the sequence passed in.\")\n"
+  	"    removeSeq := method(seq,\n"
+  	"	    seq foreach(x, self remove(x))\n"
+  	"	    self\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"join(optionalString)\", \"Returns a Sequence of the concatenated items with optionalString between each item or simply the concatenation of the items if no optionalString is supplied.\")\n"
+  	"    join := method(arg,\n"
+  	"        s := if(self first type == \"List\", List clone, Sequence clone)\n"
+  	"\n"
+  	"		if(arg,\n"
+  	"			max := self size - 1\n"
+  	"			self foreach(i, v, s appendSeq(v); if(i != max, s appendSeq(arg)))\n"
+  	"		,\n"
+  	"			self foreach(v, s appendSeq(v))\n"
+  	"		)\n"
+  	"		\n"
+  	"		s\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"insertAfter(item, afterItem)\", \"Inserts item after first occurance of afterItem and returns self. If afterItem is not found, item is appended to the end of the list.\")\n"
+  	"    insertAfter := method(item, afterItem,\n"
+  	"       i := self indexOf(afterItem) \n"
+  	"       if(i, self atInsert(i + 1, item), self append(item))\n"
+  	"       self\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"insertBefore(item, beforeItem)\", \"Inserts item before first occurance of beforeItem or to the end of the list if beforeItem is not found. Returns self.\")\n"
+  	"    insertBefore := method(item, beforeItem,\n"
+  	"       i := self indexOf(beforeItem)\n"
+  	"       if(i, self atInsert(i, item), self append(item))\n"
+  	"       self\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"insertAt(item, index)\", \"Inserts item at the specified index. Raises an exception if the index is out of bounds. Returns self.\")\n"
+  	"    insertAt := method(item, index, self atInsert(index, item))\n"
+  	"    \n"
+  	"    asString := method(\n"
+  	"    	s := \"list(\" asMutable\n"
+  	"    	self foreach(i, v, \n"
+  	"    		s appendSeq(getSlot(\"v\") asSimpleString)\n"
+  	"    		if (i != self size - 1, s appendSeq(\", \"))\n"
+  	"    	)\n"
+  	"     	s appendSeq(\")\")\n"
+  	"     )\n"
+  	"     \n"
+  	"     max := method(\n"
+  	"     	m := call argAt(0) \n"
+  	"     	obj := self first\n"
+  	"     	self foreach(o, \n"
+  	"     		v1 := if(m, o doMessage(m, call sender), o)\n"
+  	"     		v2 := if(m, obj doMessage(m, call sender), obj)\n"
+  	"     		if(v1 > v2, obj := o)\n"
+  	"     	)\n"
+  	"     	obj\n"
+  	"     )\n"
+  	"     \n"
+  	"     min := method(\n"
+  	"     	m := call argAt(0) \n"
+  	"     	obj := self first\n"
+  	"     	self foreach(o, \n"
+  	"     		v1 := if(m, o doMessage(m, call sender), o)\n"
+  	"     		v2 := if(m, obj doMessage(m, call sender), obj)\n"
+  	"     		if(v1 < v2, obj := o)\n"
+  	"     	)\n"
+  	"     	obj\n"
+  	"     )\n"
+  	"     \n"
+  	"  docSlot(\"flatten\", \"\"\"Creates a new list, with all contained lists flattened into the new list. For example:\n"
+  	"<pre>\n"
+  	"list(1,2,list(3,4,list(5))) flatten\n"
+  	"==> list(1, 2, 3, 4, 5)\n"
+  	"</pre>\n"
+  	"  \"\"\")\n"
+  	"  List flatten := method(\n"
+  	"    l := List clone\n"
+  	"    self foreach(v,\n"
+  	"      if(getSlot(\"v\") type == \"List\",\n"
+  	"        l appendSeq(getSlot(\"v\") flatten)\n"
+  	"      ,\n"
+  	"        l append(getSlot(\"v\")))\n"
+  	"      )\n"
+  	"    l\n"
+  	"  )\n"
+  	"\n"
+  	"	docSlot(\"asMessage\", \"Converts each element in the list to unnamed messages with their cached result set to the value of the element (without activating). Returns an unnamed message whose arguments map 1:1 with the elements (after being converted to messages themselves).\")\n"
+  	"	asMessage := method(\n"
+  	"		m := Message clone\n"
+  	"		foreach(elem,\n"
+  	"			m setArguments(\n"
+  	"				m arguments append(Message clone setCachedResult(getSlot(\"elem\")))\n"
+  	"			)\n"
+  	"		)\n"
+  	"		m\n"
+  	"	)\n"
+  	"     \n"
+  	"	docSlot(\"select(optionalIndex, value, message)\", \n"
+  	"		   \"Like foreach, but the values for which the result of \n"
+  	"message are non-nil are returned in a new List. Example:\n"
+  	"<pre>list(1, 5, 7, 2) select(i, v, v > 3) print\n"
+  	"==> 5, 7\n"
+  	"\n"
+  	"list(1, 5, 7, 2) select(v, v > 3) print\n"
+  	"==> 5, 7</pre>\")     \n"
+  	"     \n"
+  	"	docSlot(\"detect(optionalIndex, value, message)\", \n"
+  	"		   \"Returns the first value for which the message evaluates to a non-nil. Example:\n"
+  	"<pre>list(1, 2, 3, 4) detect(i, v, v > 2)\n"
+  	"==> 3\n"
+  	"\n"
+  	"list(1, 2, 3, 4) detect(v, v > 2)\n"
+  	"==> 3</pre>\")\n"
+  	"\n"
+  	"	docSlot(\"map(optionalIndex, value, message)\", \"Same as calling mapInPlace() on a clone of the receiver, but more efficient.\")\n"
+  	"	\n"
+  	"	docSlot(\"cusor\", \"Returns a ListCursor for the receiver.\")\n"
+  	"	cursor := method(ListCursor clone setCollection(self)) \n"
+  	"\n"
+  	"    docSlot(\"containsAll(list)\", \"Returns true the target contains all of the items in the argument list.\")\n"
+  	"    containsAll := method(c, c detect(i, contains(i) not) == nil) \n"
+  	"\n"
+  	"    docSlot(\"containsAny(list)\", \"Returns true the target contains any of the items in the argument list.\")\n"
+  	"    containsAny := method(c, c detect(i, contains(i)) != nil) \n"
+  	"\n"
+  	"    docSlot(\"intersect(list)\", \"Returns a new list containing the common values from the target and argument lists.\")\n"
+  	"    intersect := method(c, c select(i, contains(i)))\n"
+  	"\n"
+  	"    docSlot(\"difference(list)\", \"Returns a new list containing items from the target list which aren't in the argument list.\")\n"
+  	"    difference := method(c, select(i, c contains(i) not))\n"
+  	"\n"
+  	"    docSlot(\"union(list)\", \"Returns a new list containing items from the target and items which are only in the argument list.\")\n"
+  	"    union := method(c, self clone appendSeq(c difference(self)))\n"
+  	"\n"
+  	"    docSlot(\"unique\", \"Returns a new list containing all the values in the target, but no duplicates.\")\n"
+  	"    unique := method(a := list; self foreach(v, a appendIfAbsent(v)); a)\n"
+  	"\n"
+  	"	docSlot(\"asMap\", \"The reverse of Map asList: converts a list of lists (key-value pairs) into a Map. The first item of each pair list must be a sequence. The second item is the value.\")\n"
+  	"	asMap := method(\n"
+  	"		m := Map clone\n"
+  	"		self foreach(pair, m atPut(pair at(0), pair at(1)))\n"
+  	"	)\n"
+  	"\n"
+  	"		docSlot(\"reduce\", \"Also known as foldl or inject. Combines values in target start on the left. reduce(+) or reduce(x, y, x + y).\")\n"
+  	"		reduce := method(\n"
+  	"			accu := first\n"
+  	"			if(call message arguments size == 1,\n"
+  	"				args := list(nil)\n"
+  	"				meth := call argAt(0) name\n"
+  	"				slice(1) foreach(x, accu = accu performWithArgList(meth, args atPut(0, x)))\n"
+  	"			,\n"
+  	"				aName := call argAt(0) name\n"
+  	"				bName := call argAt(1) name\n"
+  	"				body := call argAt(2)\n"
+  	"				slice(1) foreach(x,\n"
+  	"					call sender setSlot(aName, accu)\n"
+  	"					call sender setSlot(bName, x)\n"
+  	"					accu = call sender doMessage(body, call sender)\n"
+  	"				)\n"
+  	"			)\n"
+  	"			accu\n"
+  	"		)\n"
+  	"\n"
+  	"		docSlot(\"reverseReduce\", \"Also known as foldr and inject. Combines values in target starting on the right. reverseReduce(+) or reverseReduce(x, y, x + y).\")\n"
+  	"		reverseReduce := method(\n"
+  	"			accu := last\n"
+  	"			if(call message arguments size == 1,\n"
+  	"				args := list(nil)\n"
+  	"				meth := call argAt(0) name\n"
+  	"				slice(0, -1) reverseForeach(x, accu = x performWithArgList(meth, args atPut(0, accu)))\n"
+  	"			,\n"
+  	"				aName := call argAt(0) name\n"
+  	"				bName := call argAt(1) name\n"
+  	"				body := call argAt(2)\n"
+  	"				slice(0, -1) reverseForeach(x,\n"
+  	"					call sender setSlot(aName, x)\n"
+  	"					call sender setSlot(bName, accu)\n"
+  	"					accu = call sender doMessage(body, call sender)\n"
+  	"				)\n"
+  	"			)\n"
+  	"			accu\n"
+  	"		)\n"
+  	"		\n"
+  	"		\n"
+  	"		mapFromKey := method(key,\n"
+  	"		  e := key asMessage\n"
+  	"		  m := Map clone\n"
+  	"		  self foreach(v,		      \n"
+  	"		      k := getSlot(\"v\") doMessage(e) \n"
+  	"		      l := m at(k) \n"
+  	"		      if(l, l append(getSlot(\"v\")), m atPut(k, list(getSlot(\"v\"))))\n"
+  	"		  )\n"
+  	"		  m\n"
+  	"		)\n"
+  	"\n"
+  	"        docSlot(\"uniqueCount\", \"Returns a list of list(value, count) for each unique value in self.\")\n"
+  	"        uniqueCount := method(self unique map(item, list(item, self select(== item) size)))\n"
+  	")\n"
+  	"\n"
+  	"List ListCursor := Object clone do(\n"
+  	"	newSlot(\"index\", 0)\n"
+  	"	newSlot(\"collection\")\n"
+  	"	next := method(index = index + 1; max := (collection size - 1); if(index > max, index = max; false, true))\n"
+  	"	previous := method(index = index - 1; if(index < 0, index = 0; false, true))\n"
+  	"	value := method(collection at(index))\n"
+  	"	insert := method(v, collection atInsert(index, getSlot(\"v\")))\n"
+  	"	remove := method(v, collection removeAt(index))\n"
+  	")\n"
+  	"\n"
+  	"List asSimpleString := method(\n"
+  	"    r := self slice(0, 30) asString\n"
+  	"	//r := self asString\n"
+  	"	if(r size > 40,\n"
+  	"		r slice(0, 37) .. \"...\"\n"
+  	"	,\n"
+  	"		r\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/A3_List.io");
+
+	s = "\n"
+  	"Call do(\n"
+  	"	docSlot(\"description\", \"Returns a description of the receiver as a String.\")\n"
+  	"\n"
+  	"	description := method(\n"
+  	"		m := self message\n"
+  	"		s := self target type .. \" \" .. m name\n"
+  	"        s alignLeft(36) .. \" \" .. m label lastPathComponent .. \" \" .. m lineNumber\n"
+  	"	)\n"
+  	"\n"
+  	"	delegateTo := method(target, altSender,\n"
+  	"		call relayStopStatus(target doMessage(self message clone setNext, altSender ifNilEval(self sender)))\n"
+  	"	)\n"
+  	"\n"
+  	"    delegateToMethod := method(target, methodName,\n"
+  	"        call relayStopStatus(target doMessage(self message clone setNext setName(methodName), self sender))\n"
+  	"    )\n"
+  	"\n"
+  	"	evalArgs := method(self message argsEvaluatedIn(sender))\n"
+  	"    hasArgs  := method(argCount > 0)\n"
+  	"    argCount := method(self message argCount)\n"
+  	")\n"
+  	"\n"
+  	"Message description := method(\n"
+  	"	self name alignLeft(36) .. self label lastPathComponent .. \" \" .. self lineNumber	\n"
+  	")\n"
+  	"	\n"
+  	"Scheduler := Object clone do(\n"
+  	"	newSlot(\"yieldingCoros\", List clone)\n"
+  	"	newSlot(\"timers\", List clone)\n"
+  	"	currentCoroutine := method(Coroutine currentCoroutine)\n"
+  	")\n"
+  	"\n"
+  	"Coroutine do(\n"
+  	"	newSlot(\"stackSize\", 128000) // PPC needs 128k for current parser\n"
+  	"	newSlot(\"exception\")\n"
+  	"	newSlot(\"parentCoroutine\")\n"
+  	"	newSlot(\"runTarget\")\n"
+  	"	newSlot(\"runLocals\")\n"
+  	"	newSlot(\"runMessage\")\n"
+  	"	newSlot(\"result\")\n"
+  	"	newSlot(\"label\", \"\")\n"
+  	"	newSlot(\"inException\", false)\n"
+  	"	newSlot(\"yieldingCoros\", Scheduler yieldingCoros)\n"
+  	"	debugWriteln := nil\n"
+  	"	\n"
+  	"	label := method(self uniqueId)\n"
+  	"	setLabel := method(s, self label = s .. \"_\" .. self uniqueId)\n"
+  	"	\n"
+  	"	showYielding := method(s,\n"
+  	"		writeln(\"   \", label, \" \", s)\n"
+  	"		yieldingCoros foreach(v, writeln(\"    \", v uniqueId))\n"
+  	"	)\n"
+  	"\n"
+  	"    isYielding := method(yieldingCoros contains(self))\n"
+  	"    \n"
+  	"	yield := method(\n"
+  	"		//showYielding(\"yield\")\n"
+  	"		//writeln(\"Coro \", self uniqueId, \" yielding - yieldingCoros = \", yieldingCoros size)\n"
+  	"		if(yieldingCoros isEmpty, return)\n"
+  	"		yieldingCoros append(self)\n"
+  	"		next := yieldingCoros removeFirst\n"
+  	"		if(next == self, return)\n"
+  	"		//writeln(Scheduler currentCoroutine label, \" yield - \", next label, \" resume\")\n"
+  	"		if(next, next resume)	\n"
+  	"	)\n"
+  	"	\n"
+  	"    resumeLater := method(\n"
+  	"        yieldingCoros remove(self)\n"
+  	"		yieldingCoros atInsert(0, self)\n"
+  	"		//writeln(self label, \" resumeLater\")\n"
+  	"	)\n"
+  	"		\n"
+  	"	pause := method(\n"
+  	"		yieldingCoros remove(self)\n"
+  	"		if(isCurrent,\n"
+  	"			next := yieldingCoros removeFirst \n"
+  	"			if(next, \n"
+  	"                next resume, \n"
+  	"				//Exception raise(\"Scheduler: nothing left to resume so we are exiting\")\n"
+  	"				writeln(\"Scheduler: nothing left to resume so we are exiting\")\n"
+  	"                self showStack\n"
+  	"				System exit\n"
+  	"			)\n"
+  	"			,\n"
+  	"			yieldingCoros remove(self)\n"
+  	"		)\n"
+  	"	)\n"
+  	"		\n"
+  	"	yieldCurrentAndResumeSelf := method(\n"
+  	"		//showYielding(\"yieldCurrentAndResumeSelf\")\n"
+  	"		yieldingCoros remove(self)\n"
+  	"		isCurrent ifFalse(resume)\n"
+  	"	)\n"
+  	"	\n"
+  	"	pauseCurrentAndResumeSelf := method(\n"
+  	"		//showYielding(\"pauseCurrentAndResumeSelf\")\n"
+  	"		yieldingCoros remove(self)\n"
+  	"		isCurrent ifFalse(resume)\n"
+  	"	)\n"
+  	"\n"
+  	"	typeId := method(self type .. \"_0x\" .. self uniqueId asString toBase(16))\n"
+  	"\n"
+  	"	ignoredCoroutineMethodNames := list(\"setResult\", \"main\", \"pauseCurrentAndResumeSelf\", \"resumeParentCoroutine\", \"raiseException\")\n"
+  	"\n"
+  	"	callStack := method(\n"
+  	"		stack := ioStack\n"
+  	"		stack selectInPlace(v, Object argIsCall(getSlot(\"v\"))) reverse \n"
+  	"		stack selectInPlace(v,\n"
+  	"			(v target type == \"Coroutine\" and ignoredCoroutineMethodNames contains(v message name)) not\n"
+  	"		)\n"
+  	"		stack foreach(i, v, if(v target type == \"Importer\" and v message name == \"import\", stack sliceInPlace(i+1); break) )\n"
+  	"		stack := stack unique\n"
+  	"		stack\n"
+  	"	)\n"
+  	"	\n"
+  	"	backTraceString := method(\n"
+  	"		if(Coroutine inException, \n"
+  	"			writeln(\"\\n\", exception type, \": \", exception error, \"\\n\\n\")\n"
+  	"			writeln(\"Coroutine Exception loop detected\"); \n"
+  	"			System exit\n"
+  	"		)\n"
+  	"		Coroutine setInException(true)\n"
+  	"		buf := Sequence clone\n"
+  	"		\n"
+  	"		if(getSlot(\"CGI\") != nil and CGI isInWebScript, buf appendSeq(\"<pre>\"))\n"
+  	"		\n"
+  	"		if(exception, buf appendSeq(\"\\n  \", exception type, \": \", exception error, \"\\n\"))\n"
+  	"		\n"
+  	"		if(callStack size > 0) then(\n"
+  	"			buf appendSeq(\"  ---------\\n\")\n"
+  	"			\n"
+  	"			if(exception and exception caughtMessage, \n"
+  	"				buf appendSeq(\"  \", exception caughtMessage description, \"\\n\")\n"
+  	"			)\n"
+  	"\n"
+  	"			frames := callStack\n"
+  	"\n"
+  	"			if(exception and exception originalCall,\n"
+  	"				index := frames indexOf(exception originalCall)\n"
+  	"				if(index,\n"
+  	"					frames sliceInPlace(index)\n"
+  	"				)\n"
+  	"			)\n"
+  	"\n"
+  	"			frames foreach(v,\n"
+  	"				buf appendSeq(\"  \", v description, \"\\n\")\n"
+  	"			)\n"
+  	"			buf appendSeq(\"\\n\")\n"
+  	"		) else(\n"
+  	"			buf appendSeq(\"  ---------\\n\")\n"
+  	"		    m := exception caughtMessage\n"
+  	"			buf appendSeq(\"  message '\" .. m name .. \"' in '\" .. m label .. \"' on line \" .. m lineNumber .. \"\\n\")\n"
+  	"			buf appendSeq(\"\\n\")\n"
+  	"		)\n"
+  	"\n"
+  	"		Coroutine setInException(false)\n"
+  	"		buf\n"
+  	"	)\n"
+  	"	\n"
+  	"	showStack := method(write(backTraceString))\n"
+  	"\n"
+  	"	resumeParentCoroutine := method(\n"
+  	"		if(parentCoroutine, parentCoroutine pauseCurrentAndResumeSelf)\n"
+  	"	)\n"
+  	"\n"
+  	"	main := method(\n"
+  	"		setResult(self getSlot(\"runTarget\") doMessage(runMessage, self getSlot(\"runLocals\")))\n"
+  	"		resumeParentCoroutine\n"
+  	"	    pause\n"
+  	"	)\n"
+  	"\n"
+  	"	raiseException := method(e, \n"
+  	"		self setException(e)\n"
+  	"		resumeParentCoroutine\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"Object wait := method(s, \n"
+  	"	endDate := Date clone now + Duration clone setSeconds(s)\n"
+  	"	loop(endDate isPast ifTrue(break); yield)\n"
+  	")\n"
+  	"\n"
+  	"Message do(\n"
+  	"	codeOfLength := method(length,\n"
+  	"		c := self code\n"
+  	"		if (c size < length, c, c slice(0, length) .. \"...\") asMutable replaceSeq(\"\\n\", \";\")\n"
+  	"	)\n"
+  	"\n"
+  	"	asStackEntry := method(\n"
+  	"		label := label lastPathComponent fileName\n"
+  	"        label alignLeft(19) .. lineNumber asString alignLeft(7) .. name\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"Object do(\n"
+  	"	try := method(\n"
+  	"		coro := Coroutine clone\n"
+  	"		coro setParentCoroutine(Scheduler currentCoroutine) \n"
+  	"		coro setRunTarget(call sender) \n"
+  	"		coro setRunLocals(call sender)\n"
+  	"		coro setRunMessage(call argAt(0)) \n"
+  	"		coro run\n"
+  	"		if(coro exception, coro exception, nil)\n"
+  	"	)\n"
+  	"\n"
+  	"	coroFor := method(\n"
+  	"		coro := Coroutine clone\n"
+  	"		coro setRunTarget(call sender) \n"
+  	"		coro setRunLocals(call sender)\n"
+  	"		coro setRunMessage(call argAt(0)) \n"
+  	"		coro\n"
+  	"	)\n"
+  	"		\n"
+  	"	coroDo := method(\n"
+  	"		coro := Coroutine clone\n"
+  	"		coro setRunTarget(call sender) \n"
+  	"		coro setRunLocals(call sender)\n"
+  	"		coro setRunMessage(call argAt(0)) \n"
+  	"		Coroutine yieldingCoros atInsert(0, Scheduler currentCoroutine)\n"
+  	"		coro run\n"
+  	"		coro\n"
+  	"	)\n"
+  	"	\n"
+  	"    coroDoLater := method(\n"
+  	"		coro := Coroutine clone\n"
+  	"		coro setRunTarget(self) \n"
+  	"		coro setRunLocals(call sender)\n"
+  	"		coro setRunMessage(call argAt(0)) \n"
+  	"		Coroutine yieldingCoros atInsert(0, coro)\n"
+  	"		coro\n"
+  	"	)\n"
+  	"	\n"
+  	"    coroWith := method(\n"
+  	"		coro := Coroutine clone\n"
+  	"		coro setRunTarget(self) \n"
+  	"		coro setRunLocals(call sender)\n"
+  	"		coro setRunMessage(call argAt(0)) \n"
+  	"		coro\n"
+  	"	)\n"
+  	"	\n"
+  	"	currentCoro := method(Coroutine currentCoroutine)\n"
+  	")\n"
+  	"\n"
+  	"nil do(\n"
+  	"	catch := nil\n"
+  	"	pass := nil\n"
+  	")\n"
+  	"\n"
+  	"Protos Exception do(\n"
+  	"	type := \"Exception\"\n"
+  	"	newSlot(\"error\")\n"
+  	"	newSlot(\"coroutine\")\n"
+  	"	newSlot(\"caughtMessage\")\n"
+  	"    newSlot(\"nestedException\")\n"
+  	"	newSlot(\"originalCall\")\n"
+  	"	\n"
+  	"	raise := method(error, nestedException,\n"
+  	"		coro := Scheduler currentCoroutine\n"
+  	"		coro raiseException(self clone setError(error) setCoroutine(coro) setNestedException(nestedException))\n"
+  	"	)\n"
+  	"\n"
+  	"	raiseFrom := method(originalCall, error, nestedException,\n"
+  	"		coro := Scheduler currentCoroutine\n"
+  	"		coro raiseException(self clone setError(error) setCoroutine(coro) setNestedException(nestedException) setOriginalCall(originalCall))\n"
+  	"	)\n"
+  	"	\n"
+  	"	catch := method(exceptionProto,\n"
+  	"		if (self isKindOf(exceptionProto), call evalArgAt(1); nil, self)\n"
+  	"	)\n"
+  	"\n"
+  	"	pass := method(Scheduler currentCoroutine raiseException(self)) \n"
+  	"\n"
+  	"	showStack := method(\n"
+  	"        coroutine showStack\n"
+  	"        if(nestedException,\n"
+  	"                writeln(\"Nested Exception: '\", nestedException,  \"'\")\n"
+  	"                nestedException showStack\n"
+  	"        )\n"
+  	"    )\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/A4_Exception.io");
+
+	s = "\n"
+  	"Notifier := Object clone do(\n"
+  	"	addListener := method(listener, \n"
+  	"		if(self getSlot(\"listeners\") == nil, self listeners := List clone)\n"
+  	"		listeners append(listener); \n"
+  	"		self\n"
+  	"	)\n"
+  	"	\n"
+  	"	removeListener := method(obj,\n"
+  	"		if(?listeners, listeners remove(obj))\n"
+  	"	)\n"
+  	"	\n"
+  	"	notifyListeners := method(\n"
+  	"		if(?listeners, \n"
+  	"			listeners foreach(l,\n"
+  	"				if(l hasSlot(call argAt(0) name), \n"
+  	"					stopStatus(l doMessage(call argAt(0), call sender))\n"
+  	"				)\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"FutureProxy := Object clone do(    \n"
+  	"    with := method(future,\n"
+  	"        p := self clone\n"
+  	"        p _future := future\n"
+  	"        p forward := self getSlot(\"_forward\")\n"
+  	"        p _become := self getSlot(\"become\")\n"
+  	"        //p xyz := method(_future writeln(\"XYZ!\"))\n"
+  	"        p type := \"FutureProxy\"\n"
+  	"        p removeAllProtos\n"
+  	"        p\n"
+  	"    )\n"
+  	"        \n"
+  	"    _forward := method(\n"
+  	"		//_future writeln(\"FutureProxy forward \", call message)\n"
+  	"		_future waitOnResult\n"
+  	"		self doMessage(call message, call sender)\n"
+  	"    )\n"
+  	")\n"
+  	"\n"
+  	"Future := Object clone do(\n"
+  	"    newSlot(\"runTarget\")\n"
+  	"    newSlot(\"runMessage\")\n"
+  	"    newSlot(\"waitingCoros\")\n"
+  	"    \n"
+  	"    futureProxy := method(\n"
+  	"    	self waitingCoros := List clone\n"
+  	"    	self proxy := FutureProxy with(self)\n"
+  	"     	proxy\n"
+  	"    )\n"
+  	"        \n"
+  	"    setResult := method(r,\n"
+  	"		if(self hasSlot(\"proxy\"),\n"
+  	"			proxy _become(getSlot(\"r\"))\n"
+  	"			if(waitingCoros, waitingCoros foreach(resumeLater))\n"
+  	"			//notifyListeners(futureReady(self))\n"
+  	"		)\n"
+  	"    )\n"
+  	"    \n"
+  	"    waitOnResult := method(\n"
+  	" 		waitingCoros append(Scheduler currentCoroutine)\n"
+  	"    	Scheduler currentCoroutine pause\n"
+  	"    )\n"
+  	")\n"
+  	"\n"
+  	"/*\n"
+  	"Object do(\n"
+  	"    actorIsRunning := method(\n"
+  	"        //writeln(\"self hasLocalSlot(actorCoroutine) = \", self hasLocalSlot(\"actorCoroutine\"))\n"
+  	"        if(self hasLocalSlot(\"actorCoroutine\"),\n"
+  	"            writeln(\"actorQueue size = \", actorQueue size)\n"
+  	"            writeln(\"Coroutine yieldingCoros contains(actorCoroutine) = \", Coroutine yieldingCoros contains(actorCoroutine))\n"
+  	"            writeln(\"Coroutine currentCoroutine == actorCoroutine = \", Coroutine currentCoroutine == actorCoroutine)\n"
+  	"        )\n"
+  	"        \n"
+  	"        self hasLocalSlot(\"actorCoroutine\") and(actorQueue size > 0) and(\n"
+  	"            Coroutine yieldingCoros contains(actorCoroutine) or(Coroutine currentCoroutine == actorCoroutine)\n"
+  	"        )\n"
+  	"    )\n"
+  	"    actorIsPaused := method(self hasLocalSlot(\"actorCoroutine\") and(actorQueue size > 0))\n"
+  	"    actorPause := method(if(actorIsPaused, actorCoroutine pause))\n"
+  	"    actorResume := method(if(actorIsPaused, actorCoroutine resumeLater))\n"
+  	")\n"
+  	"*/\n"
+  	"\n"
+  	"Object do(\n"
+  	"	yield := method(Coroutine currentCoroutine yield)\n"
+  	"	pause := method(Coroutine currentCoroutine pause)\n"
+  	"	\n"
+  	"	actorRun := method(\n"
+  	"		if(self hasLocalSlot(\"actorCoroutine\"),\n"
+  	"        	if(actorQueue size == 0, self actorCoroutine resumeLater)\n"
+  	"		,\n"
+  	"			self actorQueue := List clone\n"
+  	"			// need to yield in coroDo to allow future to be added to queue\n"
+  	"        	//self actorCoroutine := self coroDo(yield; actorProcessQueue) // coroDo refs stack!\n"
+  	"			self actorCoroutine := Coroutine clone //setStackSize(20000)\n"
+  	"			actorCoroutine setRunTarget(self) \n"
+  	"			actorCoroutine setRunLocals(self)\n"
+  	"			actorCoroutine setRunMessage(message(actorProcessQueue))\n"
+  	"			Coroutine yieldingCoros atInsert(0, actorCoroutine)\n"
+  	"			//Coroutine yieldingCoros append(actorCoroutine)\n"
+  	"        )\n"
+  	"	)\n"
+  	"     \n"
+  	" 	actorProcessQueue := method(\n"
+  	"        //writeln(self type, \"_\", self uniqueId, \" actorProcessQueue\")\n"
+  	"        \n"
+  	"        /*\n"
+  	"		if(Coroutine currentCoroutine isIdenticalTo(self actorCoroutine) not, \n"
+  	"			writeln(\"actorProcessQueue called from coro \", Coroutine currentCoroutine uniqueId, \" instead of \", actorCoroutine uniqueId)\n"
+  	"			System exit\n"
+  	"		)\n"
+  	"		*/\n"
+  	"            		\n"
+  	"		loop(\n"
+  	"			while(future := actorQueue first,			    \n"
+  	"				e := try(\n"
+  	"				    future setResult(self doMessage(future runMessage))\n"
+  	"				    //stopStatus(future setResult(self doMessage(future runMessage)))\n"
+  	"				)\n"
+  	"				actorQueue removeFirst\n"
+  	"				if(e, handleActorException(e))\n"
+  	"				if(actorQueue first, yield)\n"
+  	"            )\n"
+  	"\n"
+  	"/*\n"
+  	"            if(Coroutine currentCoroutine isIdenticalTo(self actorCoroutine) not, \n"
+  	"                writeln(\"actorProcessQueue1 called from coro \", Coroutine currentCoroutine uniqueId, \" instead of \", self actorCoroutine uniqueId)\n"
+  	"                System exit\n"
+  	"            )\n"
+  	"*/\n"
+  	"			self actorCoroutine pause\n"
+  	"        )\n"
+  	"	)\n"
+  	"	\n"
+  	"	handleActorException := method(e, e showStack)\n"
+  	"	\n"
+  	"	setSlot(\"@\", method(\n"
+  	"	    //writeln(\"@ \", call argAt(0))\n"
+  	"        m := call argAt(0) asMessageWithEvaluatedArgs(call sender)\n"
+  	"        f := Future clone setRunTarget(self) setRunMessage(m)\n"
+  	"		self actorRun\n"
+  	"        self actorQueue append(f)\n"
+  	"        f futureProxy\n"
+  	"	))\n"
+  	" \n"
+  	"	setSlot(\"@@\", method(\n"
+  	"	    //writeln(self type , \"_\", self uniqueId, \" @@\", call argAt(0)) //, \" \", call argAt(0) label)\n"
+  	"        m := call argAt(0) asMessageWithEvaluatedArgs(call sender)\n"
+  	"        f := Future clone setRunTarget(self) setRunMessage(m) \n"
+  	"		self actorRun\n"
+  	"        self actorQueue append(f)\n"
+  	"        nil\n"
+  	"	))\n"
+  	")\n"
+  	"\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Actor.io");
+
+	s = "Addon := Object clone do(\n"
+  	"    newSlot(\"rootPath\")\n"
+  	"    newSlot(\"name\")\n"
+  	"\n"
+  	"    platform := System platform split at(0) asLowercase\n"
+  	"    dllSuffix := method(\n"
+  	"      if(list(\"cygwin\", \"mingw\", \"windows\") contains(platform), return \"dll\")\n"
+  	"      if(platform == \"darwin\", return \"dylib\")\n"
+  	"      \"so\"\n"
+  	"    )\n"
+  	"\n"
+  	"    dllName := method(\"libIo\" .. name .. \".\" .. dllSuffix)\n"
+  	"\n"
+  	"    addonPath := method(Path with(rootPath, name))\n"
+  	"\n"
+  	"    dllPath := method(Path with(addonPath, \"_build/dll\", dllName))\n"
+  	"    sourcePath := method(Path with(addonPath, \"source\"))\n"
+  	"\n"
+  	"    ioFiles := method(\n"
+  	"        d := Directory with(addonPath) folderNamed(\"io\")\n"
+  	"        if(d == nil, return list())\n"
+  	"        files := d files select(path endsWithSeq(\".io\"))\n"
+  	"        files map(name) sort map(name, d fileNamed(name))\n"
+  	"    )\n"
+  	"\n"
+  	"    dependencies := method(\n"
+  	"        File with(Path with(addonPath, \"depends\")) contents split(\" \")\n"
+  	"    )\n"
+  	"\n"
+  	"    loadDependencies := method(\n"
+  	"        //writeln(name, \" depends on \", dependencies)\n"
+  	"        dependencies foreach(d,\n"
+  	"            if(Lobby getSlot(d) == nil, \n"
+  	"                //writeln(\"loading dependency \", d)\n"
+  	"                AddonLoader loadAddonNamed(d)\n"
+  	"            )\n"
+  	"        )\n"
+  	"    )\n"
+  	"\n"
+  	"    load := method(\n"
+  	"        //writeln(\"Addon \", name, \" loading from \", addonPath)\n"
+  	"        loadDependencies\n"
+  	"        context := Object clone\n"
+  	"        Protos Addons setSlot(name, context)\n"
+  	"        Protos appendProto(context)\n"
+  	"        //writeln(dllPath)\n"
+  	"        if(File with(dllPath) exists, \n"
+  	"            DynLib clone setPath(dllPath) open call(\"Io\" .. name .. \"Init\", context)\n"
+  	"        ,\n"
+  	"            // check for C files, if found then addon didn't compile\n"
+  	"						sourceDirectory := Directory with(sourcePath)\n"
+  	"            if(sourceDirectory exists and sourceDirectory size > 1,\n"
+  	"                Exception raise(\"Failed to load Addon \" .. name .. \" - it appears that the addon exists but was not compiled. You might try running 'make \" .. name .. \"' in the Io source folder.\")\n"
+  	"            )\n"
+  	"        )\n"
+  	"        //ioFiles foreach(f, writeln(\"loading \", f path))\n"
+  	"        ioFiles foreach(file, context doFile(file path))\n"
+  	"        Lobby getSlot(name)\n"
+  	"    )\n"
+  	"\n"
+  	"    exists := method(Directory with(addonPath) exists)\n"
+  	"    \n"
+  	"    addonProtos := method(\n"
+  	"        f := File with(Path with(addonPath, \"protos\")) \n"
+  	"        if(f exists, f contents split, list())\n"
+  	"    )\n"
+  	")\n"
+  	"\n"
+  	"AddonLoader := Object clone do(\n"
+  	"    searchPaths := list(\"io/addons\", System installPrefix .. \"/lib/io/addons\")\n"
+  	"    appendSearchPath := method(p, searchPaths appendIfAbsent(p); self)\n"
+  	"\n"
+  	"    addons := method(\n"
+  	"        searchFolders := searchPaths map(path, Directory with(path)) select(exists)\n"
+  	"        addonFolders := searchFolders map(folders) flatten select(isAccessible) select(fileNames contains(\"build.io\"))\n"
+  	"        addons := addonFolders map(f, Addon clone setRootPath(f path pathComponent) setName(f path lastPathComponent))\n"
+  	"        addons\n"
+  	"    )\n"
+  	"\n"
+  	"    addonFor := method(name, \n"
+  	"        r := addons detect(name == name)\n"
+  	"        if(r, return r)\n"
+  	"        addons detect(addonProtos contains(name))\n"
+  	"    )\n"
+  	"\n"
+  	"    hasAddonNamed := method(name, addonFor(name) != nil)\n"
+  	"\n"
+  	"    loadAddonNamed := method(name,\n"
+  	"        //writeln(\"loadAddonNamed(\", name, \")\")\n"
+  	"        addon := addonFor(name)\n"
+  	"        if(addon, addon load, nil)\n"
+  	"        Lobby getSlot(name)\n"
+  	"    )\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/AddonLoader.io");
+
+	s = "getSlot(\"Block\") do(\n"
+  	"	\n"
+  	"	docSlot(\"asSimpleString\", \"Returns a short description of the receiver.\")\n"
+  	"	asSimpleString := method(\n"
+  	"		if(scope, \"block\", \"method\") .. \"(\" .. argumentNames append(\"...\") join(\", \") .. \")\"\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"asString\", \"Returns a full description of the receiver with decompiled code.\")\n"
+  	"	asString := method(\n"
+  	"		Formatter clone formatBlock(getSlot(\"self\")) buffer\n"
+  	"	)\n"
+  	"\n"
+  	"	print := method(\n"
+  	"		writeln\n"
+  	"		writeln(asString)\n"
+  	"	)\n"
+  	"\n"
+  	"	println := getSlot(\"print\")\n"
+  	"\n"
+  	"	Formatter := Object clone do(\n"
+  	"		newSlot(\"lineNumber\", 0)\n"
+  	"		newSlot(\"isLineEmpty\", true)\n"
+  	"		newSlot(\"depth\", 0)\n"
+  	"		newSlot(\"buffer\")\n"
+  	"\n"
+  	"		newSlot(\"operators\")\n"
+  	"		newSlot(\"reverseAssignOperators\")\n"
+  	"\n"
+  	"		init := method(\n"
+  	"			buffer = Sequence clone\n"
+  	"			operators = OperatorTable operators\n"
+  	"			reverseAssignOperators = OperatorTable reverseAssignOperators\n"
+  	"			reverseAssignOperators atPut(\"setSlotWithType\", \":=\")\n"
+  	"		)\n"
+  	"\n"
+  	"		appendSeq := method(\n"
+  	"			call delegateTo(buffer)\n"
+  	"			isLineEmpty = false\n"
+  	"		)\n"
+  	"\n"
+  	"		newLine := method(\n"
+  	"			buffer appendSeq(\"\\n\")\n"
+  	"			lineNumber = lineNumber + 1\n"
+  	"			isLineEmpty = true\n"
+  	"		)\n"
+  	"\n"
+  	"		newLinesTo := method(msg,\n"
+  	"			(msg lineNumber - lineNumber) minMax(0, 2) repeat(newLine)\n"
+  	"			lineNumber = msg lineNumber\n"
+  	"		)\n"
+  	"\n"
+  	"		indent := method(\n"
+  	"			depth repeat(appendSeq(\"    \"))\n"
+  	"		)\n"
+  	"\n"
+  	"		formatBlock := method(theBlock,\n"
+  	"			msg := getSlot(\"theBlock\") message\n"
+  	"\n"
+  	"			if(msg label != CLI commandLineLabel,\n"
+  	"				appendSeq(\"# \" .. msg label .. \":\" .. msg lineNumber, \"\\n\")\n"
+  	"			)\n"
+  	"			appendSeq(\"method(\")\n"
+  	"			if(getSlot(\"theBlock\") argumentNames size > 0,\n"
+  	"				getSlot(\"theBlock\") argumentNames foreach(i, name,\n"
+  	"					if(i > 0,\n"
+  	"						appendSeq(\", \")\n"
+  	"					)\n"
+  	"\n"
+  	"					appendSeq(name)\n"
+  	"				)\n"
+  	"\n"
+  	"				appendSeq(\", \")\n"
+  	"			)\n"
+  	"\n"
+  	"			newLine\n"
+  	"			lineNumber = msg lineNumber\n"
+  	"			formatIndentedMessage(msg)\n"
+  	"			newLine\n"
+  	"			appendSeq(\")\")\n"
+  	"			self\n"
+  	"		)\n"
+  	"\n"
+  	"		formatIndentedMessage := method(msg,\n"
+  	"			depth = depth + 1\n"
+  	"			formatMessage(msg)\n"
+  	"			depth = depth - 1\n"
+  	"		)\n"
+  	"\n"
+  	"		formatMessage := method(msg,\n"
+  	"			m := msg\n"
+  	"			while(m,\n"
+  	"				if(m isEndOfLine,\n"
+  	"					if(lineNumber == m next ?lineNumber,\n"
+  	"						appendSeq(m name)\n"
+  	"					)\n"
+  	"					m = m next\n"
+  	"					continue\n"
+  	"				)\n"
+  	"\n"
+  	"				newLinesTo(m)\n"
+  	"\n"
+  	"				if(isLineEmpty,\n"
+  	"					indent\n"
+  	"				,\n"
+  	"					if(m != msg,\n"
+  	"						appendSeq(\" \")\n"
+  	"					)\n"
+  	"				)\n"
+  	"\n"
+  	"				if(reverseAssignOperators hasKey(m name)) then(\n"
+  	"					args := m arguments\n"
+  	"\n"
+  	"					if(args first cachedResult,\n"
+  	"						appendSeq(args first cachedResult, \" \")\n"
+  	"\n"
+  	"						appendSeq(reverseAssignOperators at(m name))\n"
+  	"\n"
+  	"						appendSeq(\" \")\n"
+  	"						if(args at(1),\n"
+  	"							formatMessage(args at(1))\n"
+  	"						)\n"
+  	"					,\n"
+  	"						appendSeq(m name)\n"
+  	"						if(m argCount > 0,\n"
+  	"							formatArguments(m)\n"
+  	"						)\n"
+  	"					)\n"
+  	"				) elseif(operators hasKey(m name)) then(\n"
+  	"					appendSeq(m name)\n"
+  	"\n"
+  	"					appendSeq(\" \")\n"
+  	"					if(m arguments first,\n"
+  	"						formatMessage(m arguments first)\n"
+  	"					)\n"
+  	"				) else(\n"
+  	"					appendSeq(m name)\n"
+  	"					if(m argCount > 0,\n"
+  	"						formatArguments(m)\n"
+  	"					)\n"
+  	"				)\n"
+  	"\n"
+  	"				m = m next\n"
+  	"			)\n"
+  	"		)\n"
+  	"\n"
+  	"		formatArguments := method(msg,\n"
+  	"			appendSeq(\"(\")\n"
+  	"\n"
+  	"			startingLineNumber := lineNumber\n"
+  	"			msg arguments foreach(i, arg,\n"
+  	"				# Insert separator between arguments\n"
+  	"				if(i > 0,\n"
+  	"					# Still on the same line as the \"(\"\n"
+  	"					if(startingLineNumber == lineNumber,\n"
+  	"						appendSeq(\", \")\n"
+  	"					,\n"
+  	"						newLine; indent; appendSeq(\",\"); newLine\n"
+  	"					)\n"
+  	"				)\n"
+  	"\n"
+  	"				# Format the argument\n"
+  	"				formatIndentedMessage(arg)\n"
+  	"			)\n"
+  	"\n"
+  	"			if(startingLineNumber != lineNumber,\n"
+  	"				newLine\n"
+  	"				indent\n"
+  	"			)\n"
+  	"			appendSeq(\")\")\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Block.io");
+
+	s = "\n"
+  	"Vector := Sequence clone setItemType(\"float32\") setEncoding(\"number\")\n"
+  	"vector := method(v := Vector clone; call evalArgs foreach(n, v append(n)); v)\n"
+  	"\n"
+  	"Lobby Protos Core do(\n"
+  	"	ImmutableSequence := \"\"\n"
+  	"	String := ImmutableSequence\n"
+  	")\n"
+  	"\n"
+  	"Sequence do(\n"
+  	"	setSlot(\"..\", method(arg, self asString cloneAppendSeq(arg asString)))\n"
+  	"\n"
+  	"    docSlot(\"repeated(n)\", \"Returns a new sequence containing the receiver repeated n number of times.\")\n"
+  	"    repeated := method(n,\n"
+  	"        s := Sequence clone\n"
+  	"        n repeat(s appendSeq(self))\n"
+  	"        s \n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"alignLeftInPlace(width, [padding])\", \"Same as align left but operation is performed on the receiver.\")\n"
+  	"    alignLeftInPlace := method(width, padding,\n"
+  	"        originalSize := size\n"
+  	"		if(padding isNil or padding size == 0,\n"
+  	"			padding = \" \"\n"
+  	"		)\n"
+  	"        ((width - size) / padding size) ceil repeat(appendSeq(padding))\n"
+  	"        setSize(width max(originalSize))\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"alignLeft(width, [padding])\", \"\"\"\n"
+  	"    Example:\n"
+  	"    <pre>\n"
+  	"    Io> \"abc\" alignLeft(10, \"-\")\n"
+  	"    ==> abc-------\n"
+  	"    Io> \"abc\" alignLeft(10, \"-=\")\n"
+  	"    ==> abc-=-=-=-\n"
+  	"    </pre>\n"
+  	"    \"\"\")\n"
+  	"    alignLeft := method(width, padding, asMutable alignLeftInPlace(width, padding))\n"
+  	"\n"
+  	"    docSlot(\"alignRight(width, [padding])\", \"\"\"\n"
+  	"    Example:\n"
+  	"    <pre>\n"
+  	"    Io> \"abc\" alignRight(10, \"-\")\n"
+  	"    ==> -------abc\n"
+  	"    Io> \"abc\" alignRight(10, \"-=\")\n"
+  	"    ==> -=-=-=-abc\n"
+  	"    </pre>\n"
+  	"    \"\"\")\n"
+  	"    alignRight := method(width, padding,\n"
+  	"        Sequence clone alignLeftInPlace(width - size, padding) appendSeq(self)\n"
+  	"    )\n"
+  	"\n"
+  	"    docSlot(\"alignCenter(width, [padding])\", \"\"\"\n"
+  	"    Example:\n"
+  	"    <pre>\n"
+  	"    Io> \"abc\" alignCenter(10, \"-\")\n"
+  	"    ==> ---abc----\n"
+  	"    Io> \"abc\" alignCenter(10, \"-=\")\n"
+  	"    ==> -=-abc-=-=\n"
+  	"    </pre>\n"
+  	"    \"\"\")\n"
+  	"    alignCenter := method(width, padding,\n"
+  	"        alignRight(((size + width) / 2) floor, padding) alignLeftInPlace(width, padding)\n"
+  	"    )\n"
+  	"    \n"
+  	"    asSimpleString := method(\"\\\"\" .. self asString .. \"\\\"\")\n"
+  	"\n"
+  	"	docSlot(\"split(optionalArg1, optionalArg2, ...)\", \"\"\"\n"
+  	"		Returns a list containing the non-empty sub-sequences of the receiver divided by the given arguments.\n"
+  	"		If no arguments are given the sequence is split on white space.\n"
+  	"		Examples:\n"
+  	"		<pre>\n"
+  	"		\"a   b  c d\" splitNoEmpties => list(\"a\", \"b\", \"c\", \"d\")\n"
+  	"		\"a***b**c*d\" splitNoEmpties(\"*\") => list(\"a\", \"b\", \"c\", \"d\")\n"
+  	"		\"a***b||c,d\" splitNoEmpties(\"*\", \"|\", \",\") => list(\"a\", \"b\", \"c\", \"d\")\n"
+  	"		</pre>\n"
+  	"		\"\"\")\n"
+  	"		\n"
+  	"	splitNoEmpties := method(\n"
+  	"		self performWithArgList(\"split\", call evalArgs) selectInPlace(size != 0)\n"
+  	"	)\n"
+  	"\n"
+  	"  docSlot(\"findNthSeq(aSequence, n)\", \"Returns a number with the nth occurence of aSequence\")\n"
+  	"  findNthSeq := method(str, n,\n"
+  	"    num := self findSeq(str)\n"
+  	"    if(num isNil, return nil)\n"
+  	"    if(n == 1, return num)\n"
+  	"    num + self slice(num + 1, self size) findNthSeq(str, n - 1)\n"
+  	"  ) \n"
+  	"\n"
+  	"	\n"
+  	"	orderedSplit := method(\n"
+  	"            separators := call evalArgs\n"
+  	"            if(separators size == 0, return list(self))\n"
+  	"            i := 0\n"
+  	"            skipped := 0\n"
+  	"            r := list\n"
+  	"            separators foreach(separator,\n"
+  	"                j := findSeq(separator, i) ifNil(\n"
+  	"                    skipped = skipped + 1\n"
+  	"                    continue\n"
+  	"                )\n"
+  	"                r append(slice(i, j))\n"
+  	"                if(skipped > 0,\n"
+  	"                    skipped repeat(r append(nil))\n"
+  	"                    skipped = 0\n"
+  	"                )\n"
+  	"                i = j + separator size\n"
+  	"            )\n"
+  	"            if(size == 0,\n"
+  	"                r append(nil)\n"
+  	"            ,\n"
+  	"                r append(slice(i))\n"
+  	"            )\n"
+  	"            skipped repeat(r append(nil))\n"
+  	"            r\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"prependSeq(object1, object2, ...)\", \"Prepends given objects asString in reverse order to the receiver.  Returns self.\")\n"
+  	"	prependSeq := method(self atInsertSeq(0, call evalArgs join); self)\n"
+  	"\n"
+  	"	sequenceSets := Map clone do(\n"
+  	"		atPut(\"lowercaseSequence\",\n"
+  	"			lst := list\n"
+  	"			\"abcdefghijklmnopqrstuvwxyz\" foreach(v, lst append(v))\n"
+  	"			lst\n"
+  	"		)\n"
+  	"		atPut(\"uppercaseSequence\",\n"
+  	"			lst := list\n"
+  	"			at(\"lowercaseSequence\") foreach(v, lst append(v asUppercase))\n"
+  	"			lst\n"
+  	"		)\n"
+  	"		atPut(\"digitSequence\",\n"
+  	"			lst := list\n"
+  	"			\"0123456789\" foreach(v, lst append(v))\n"
+  	"			lst\n"
+  	"		)\n"
+  	"		removeSlot(\"lst\")\n"
+  	"		removeSlot(\"v\")\n"
+  	"	)\n"
+  	"\n"
+  	"	docSlot(\"asHex\", \"Returns a hex string for the receiving sequence, e.g., \\\"abc\\\" asHex -> \\\"616263\\\".\")\n"
+  	"	asHex := method(\n"
+  	"		r := Sequence clone\n"
+  	"		self foreach(c, r appendSeq(c asHex alignRight(2, \"00\")))\n"
+  	"		r\n"
+  	"	)\n"
+  	"\n"
+  	"	cPrint := getSlot(\"print\")\n"
+  	"	print := method(\n"
+  	"		self asUTF8 cPrint\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/B_Sequence.io");
+
+	s = "getSlot(\"CFunction\") do(\n"
+  	"\n"
+  	"    docSlot(\"name\", \"Returns the CFunction name in the form CFunction_Pointer.\")\n"
+  	"    name := method(typeName ifNilEval(\"Object\") .. \"_\" .. uniqueName ifNilEval(\"<unnamed>\") .. \"()\")\n"
+  	"    \n"
+  	"    docSlot(\"asSimpleString\", \"Returns the CFunction name.\")\n"
+  	"    asSimpleString := method(name)\n"
+  	"\n"
+  	"    docSlot(\"asString\", \"Same as asSimpleString.\")\n"
+  	"    asString := getSlot(\"asSimpleString\")\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/CFunction.io");
+
+	s = "Date do(\n"
+  	"	docSlot(\"today\", \"Set the receiver to the current date, no time information\n"
+  	"is included. See `now' for the current date and time.\")\n"
+  	"	today := method(Date now setHour(0) setMinute(0) setSecond(0))\n"
+  	"	\n"
+  	"	docSlot(\"isToday\", \"Returns true if the receiver's date is today's date.\")\n"
+  	"	isToday := method(\n"
+  	"		now := Date clone now\n"
+  	"		now year == year and now month == month and now day == day\n"
+  	"	)\n"
+  	"	\n"
+  	"	docSlot(\"secondsToRun(expression)\", \"Evaluates message and returns a Number\n"
+  	"whose value is the number of seconds taken to do the evaluation\")\n"
+  	"	secondsToRun := method(\n"
+  	"		t1 := Date clone now\n"
+  	"		call relayStopStatus(call evalArgAt(0))\n"
+  	"		dt := Date clone now secondsSince(t1)\n"
+  	"	)\n"
+  	"\n"
+  	"        docSlot(\"asAtomDate\", \"Returns the date formatted as a valid atom date (rfc4287) in the system's timezone.\")\n"
+  	"        Date asAtomDate := method(\n"
+  	"                asString(\"%Y-%m-%dT%H:%M:%S\") .. gmtOffset asMutable atInsertSeq(3, \":\")\n"
+  	"        )\n"
+  	"    justSerialized := method(stream,\n"
+  	"        stream write(\"Date clone do(\",\n"
+  	"            \"setYear(\", self year, \") \",\n"
+  	"            \"setMonth(\", self month, \") \",\n"
+  	"            \"setDay(\", self day, \") \",\n"
+  	"            \"setHour(\", self hour, \") \",\n"
+  	"            \"setMinute(\", self minute, \") \",\n"
+  	"            \"setSecond(\", self second, \")\",\n"
+  	"            \");\")\n"
+  	"    )\n"
+  	")\n"
+  	"\n"
+  	"Number do(\n"
+  	"	docSlot(\"years\", \"Returns Duration of receiver's years.\n"
+  	"\n"
+  	"Example:\n"
+  	"<pre>\n"
+  	"Io> 1 years\n"
+  	"==> 1 years 00 days 00:00:0.000000\n"
+  	"Io> 20 years\n"
+  	"==> 20 years 00 days 00:00:0.000000\n"
+  	"</pre>\n"
+  	"\n"
+  	"With this, you can do things such as:\n"
+  	"<pre>\n"
+  	"Io> Date clone now + 5 years\n"
+  	"==> 2011-11-14 18:44:33 EST\n"
+  	"Io> Date clone now + 2 years + 3 days + 22 minutes\n"
+  	"==> 2008-11-17 19:06:54 EST\n"
+  	"</pre>\n"
+  	"\")\n"
+  	"	years := method(Duration clone setYears(self))\n"
+  	"	\n"
+  	"	docSlot(\"days\", \"Returns Duration of receiver's days. See `years' for a\n"
+  	"few examples.\")\n"
+  	"	days := method(Duration clone setDays(self))\n"
+  	"	\n"
+  	"	docSlot(\"hours\", \"Returns Duration of receiver's hours. See `years' for a\n"
+  	"few examples.\")\n"
+  	"	hours := method(Duration clone setHours(self))\n"
+  	"	\n"
+  	"	docSlot(\"minutes\", \"Returns Duration of receiver's minutes. See `years' for\n"
+  	"a few examples.\")\n"
+  	"	minutes := method(Duration clone setMinutes(self))\n"
+  	"	\n"
+  	"	docSlot(\"seconds\", \"Returns Duration of receiver's seconds. See `years' for\n"
+  	"a few examples.\")\n"
+  	"	seconds := method(Duration clone setSeconds(self))\n"
+  	")\n"
+  	"\n"
+  	"Duration do(\n"
+  	"	docSlot(\"+\", \"Returns a new Duration of the two added.\")\n"
+  	"	setSlot(\"+\", method(d, self clone += d))\n"
+  	"	\n"
+  	"	docSlot(\"-\", \"Returns a new Duration of the two subtracted.\")\n"
+  	"	setSlot(\"-\", method(d, self clone -= d))\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Date.io");
+
+	s = "Debugger do(\n"
+  	"    docDescription(\"To start debugging a coroutine, call \n"
+  	"    <pre>\n"
+  	"    Coroutine currentCoroutine setMessageDebugging(true)\n"
+  	"    </pre>\n"
+  	"    Then each message sent within that coroutine will cause the Debugger vmWillSendMessage slot to be activated and the Debugger slots: messageCoroutine, messageSelf, messageLocals, and message will be set with the values related to the current message send. You can override vmWillSendMessage to implement your own debugging mechanisms.\")\n"
+  	"\n"
+  	"	start := method(\n"
+  	"		loop(\n"
+  	"			self vmWillSendMessage(self message name)\n"
+  	"			messageCoroutine resume\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"    docSlot(\"vmWillSendMessage\", \"Override this method to implement your own debugging mechanisms.\")\n"
+  	"    	\n"
+  	"	vmWillSendMessage := method(\n"
+  	"		writeln(\"Debugger vmWillSendMessage(\", self message name, \")\")\n"
+  	"	)\n"
+  	"	\n"
+  	"	debuggerCoroutine := coroFor(start)\n"
+  	"	yield\n"
+  	")\n"
+  	"\n"
+  	"\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Debugger.io");
+
+	s = "\n"
+  	"Directory do(\n"
+  	"    docSlot(\"with(aPath)\", \"Returns a new instance with the provided path.\")\n"
+  	"    with := method(path, self clone setPath(path))\n"
+  	"\n"
+  	"	createIfAbsent := method(if(self exists not, self create); self)\n"
+  	"\n"
+  	"    parentDirectory := method(\n"
+  	"		if(path == \".\", return nil)\n"
+  	"		p := self path pathComponent	\n"
+  	"		if(p == \"\", p = \".\")\n"
+  	"		Directory clone setPath(p)\n"
+  	"    )\n"
+  	"\n"
+  	"    folders := method(\n"
+  	"		items select(item, item type ==(\"Directory\") and(item name != \".\") and(item name != \"..\"))\n"
+  	"    )\n"
+  	"\n"
+  	"    isAccessible := method(\n"
+  	"		r := true\n"
+  	"		e := try(items)\n"
+  	"		e catch(Exception, r = false)\n"
+  	"		r\n"
+  	"    )\n"
+  	"\n"
+  	"    parents := method(\n"
+  	"		list := List clone\n"
+  	"		d := self\n"
+  	"		while(d = d parentDirectory, list append(d))\n"
+  	"		list reverse\n"
+  	"    )\n"
+  	"\n"
+  	"    accessibleParents := method(parents select(isAccessible))\n"
+  	"    \n"
+  	"    files := method(items select(type == \"File\"))\n"
+  	"    \n"
+  	"    fileNames := method(files mapInPlace(name))\n"
+  	"    \n"
+  	"    fileNamed := method(name,\n"
+  	"		//files detect(i, v, v name == name)\n"
+  	"		File clone setPath(Path with(path, name))\n"
+  	"    )\n"
+  	"\n"
+  	"    filesWithExtension := method(ext,\n"
+  	"		if(ext containsSeq(\".\") not, ext = \".\" .. ext)\n"
+  	"		files select(f, f name endsWithSeq(ext))\n"
+  	"    )\n"
+  	"\n"
+  	"    folderNamed := method(name,\n"
+  	"		folders detect(i, v, v name == name)\n"
+  	"    )\n"
+  	"\n"
+  	"    remove := method(\n"
+  	"        File clone setPath(self path) remove\n"
+  	"    )\n"
+  	"\n"
+  	"    folderNamedCreateIfAbsent := method(name,\n"
+  	"		f := folderNamed(name)\n"
+  	"		if(f, return f)\n"
+  	"		createSubdirectory(name)\n"
+  	"		folderNamed(name)\n"
+  	"    )\n"
+  	"\n"
+  	"    createFileNamed := method(name,\n"
+  	"		f := fileNamed(name)\n"
+  	"		if(f, return f)\n"
+  	"		return File clone setPath(Path with(path, name))\n"
+  	"    )\n"
+  	"\n"
+  	"	moveTo := method(path,\n"
+  	"		File with(self path) moveTo(path)\n"
+  	"		self\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Directory.io");
+
+	s = "DynLib do(\n"
+  	"	init := method(\n"
+  	"		self forward := method(\n"
+  	"			self performWithArgList(\"call\", list(call message name, call message arguments map(x, self doMessage(x))) flatten)\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/DynLib.io");
+
+	s = "File do(\n"
+  	"	docSlot(\"with(aPath)\", \"Returns a new instance with the provided path.\")\n"
+  	"	with := method(path, self clone setPath(path))\n"
+  	"\n"
+  	"	newSlot(\"streamDestination\")\n"
+  	"	newSlot(\"streamReadSize\", 1024*64)\n"
+  	"	startStreaming := method(streamTo(streamDestination))\n"
+  	"\n"
+  	"	streamTo := method(streamDestination,\n"
+  	"		b := Sequence clone\n"
+  	"		self open\n"
+  	"		while(isAtEnd not, \n"
+  	"			b empty\n"
+  	"			readToBufferLength(b, streamReadSize)\n"
+  	"			streamDestination write(b)\n"
+  	"			yield\n"
+  	"		)\n"
+  	"	)\n"
+  	"	\n"
+  	"	copyToPath := method(dstPath,\n"
+  	"		dst := File with(dstPath) open\n"
+  	"		self open streamTo(dst)\n"
+  	"		dst close\n"
+  	"		self close\n"
+  	"	)\n"
+  	"	\n"
+  	"	lockFile := method(File clone setPath(path .. \".lock\"))\n"
+  	"	\n"
+  	"	lock := method(timeout,\n"
+  	"		if(timeout == nil, timeout = 10)\n"
+  	"		lockFile := lockFile\n"
+  	"		waitTime := .1\n"
+  	"		waited := 0\n"
+  	"		while(lockFile exists,\n"
+  	"			wait(waitTime)\n"
+  	"			waited = waited + waitTime\n"
+  	"			if(waited > timeout, Exception raise(\"unable to acquire lock on \" .. path))\n"
+  	"		)\n"
+  	"		lockFile open close\n"
+  	"	)\n"
+  	"	\n"
+  	"	unlock := method(lockFile remove)\n"
+  	")\n"
+  	"\n"
+  	"Sequence asFile := method(File with(self))\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/File.io");
+
+	s = "/*\n"
+  	"http://www.quag.geek.nz/io/schwartzian/\n"
+  	"\n"
+  	"A decorate-sort-undecorate operation for Io\n"
+  	"\n"
+  	"Specify a key for each item, and control how the keys are compared.\n"
+  	"\n"
+  	"Io> Range\n"
+  	"Io> 0 to(10) asList sortByKey(x, (-1)**x * x)\n"
+  	"==> list(9, 7, 5, 3, 1, 0, 2, 4, 6, 8, 10)\n"
+  	"\n"
+  	"Io> Directory with(\".\") files sortKey(lastInfoChangeDate) sort map(name)\n"
+  	"==> ... listing of directory sorted by date\n"
+  	"\n"
+  	"Two forms of sortKey are supported:\n"
+  	"\n"
+  	"    * files sortKey(lastInfoChangeDate)\n"
+  	"    * files sortKey(file, file lastInfoChangeDate)\n"
+  	"\n"
+  	"Three forms of sort are supported:\n"
+  	"\n"
+  	"    * files sortKey(...) sort\n"
+  	"    * files sortKey(...) sort(<)\n"
+  	"    * files sortKey(...) sort(x, y, x < y)\n"
+  	"*/\n"
+  	"\n"
+  	"List sortByKey := method(\n"
+  	"    call delegateToMethod(self, \"sortKey\") sort\n"
+  	")\n"
+  	"\n"
+  	"List sortKey := method(\n"
+  	"    schwart := call activated SchwartzianList clone\n"
+  	"    if(call argCount == 1,\n"
+  	"        body := call argAt(0)\n"
+  	"        foreach(value,\n"
+  	"			ss := stopStatus(k := value doMessage(body, call sender))\n"
+  	"			if(ss isReturn, ss return(k))\n"
+  	"			if(ss isBreak, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"            schwart addPair(k, value)\n"
+  	"        )\n"
+  	"    ,\n"
+  	"        valueName := call argAt(0) name\n"
+  	"        foreach(value,\n"
+  	"            call sender setSlot(valueName, value)\n"
+  	"			ss := stopStatus(k := call evalArgAt(1))\n"
+  	"			if(ss isReturn, ss return(k))\n"
+  	"			if(ss isBreak, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"            schwart addPair(k, value)\n"
+  	"        )\n"
+  	"    )\n"
+  	"    schwart\n"
+  	") do(\n"
+  	"    SchwartzianList := Object clone do(\n"
+  	"        newSlot(\"pairs\")\n"
+  	"\n"
+  	"        init := method(\n"
+  	"            pairs = list\n"
+  	"        )\n"
+  	"\n"
+  	"        SchwartzianPair := Object clone do(\n"
+  	"            newSlot(\"key\")\n"
+  	"            newSlot(\"value\")\n"
+  	"\n"
+  	"            asSimpleString := method(\n"
+  	"                \"(\" .. key asSimpleString .. \": \" .. value asSimpleString .. \")\"\n"
+  	"            )\n"
+  	"        )\n"
+  	"\n"
+  	"        addPair := method(key, value,\n"
+  	"            pairs append(SchwartzianPair clone setKey(key) setValue(value))\n"
+  	"        )\n"
+  	"\n"
+  	"        sort := method(\n"
+  	"            if(call argCount == 0,\n"
+  	"                pairs sortBy(block(x, y, x key < y key))\n"
+  	"            ,\n"
+  	"                if(call argCount == 1,\n"
+  	"                    opName := call argAt(0) name\n"
+  	"                    args := list(nil)\n"
+  	"                    pairs sortBy(\n"
+  	"                        block(x, y,\n"
+  	"                            x key performWithArgList(opName, args atPut(0, y key))\n"
+  	"                        )\n"
+  	"                    )\n"
+  	"                ,\n"
+  	"                    sortCall := call\n"
+  	"                    xName := sortCall argAt(0) name\n"
+  	"                    yName := sortCall argAt(1) name\n"
+  	"                    pairs sortBy(\n"
+  	"                        block(x, y,\n"
+  	"                            sortCall sender setSlot(xName, x key)\n"
+  	"                            sortCall sender setSlot(yName, y key)\n"
+  	"                            sortCall evalArgAt(2)\n"
+  	"                        )\n"
+  	"                    )\n"
+  	"                )\n"
+  	"            ) mapInPlace(p, p value)\n"
+  	"        )\n"
+  	"    )\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/List_schwartzian.io");
+
+	s = "Map do(\n"
+  	"	docSlot(\"asList\", \"Converts a Map to a list of lists. Each element in the returned list will be a list of two elements: the key, and the value.\")\n"
+  	"	asList := method(\n"
+  	"		l := list\n"
+  	"		foreach(k, v, l append(list(k, v)))\n"
+  	"		l\n"
+  	"	)\n"
+  	"	\n"
+  	"	map := method(\n"
+  	"        result := List clone\n"
+  	"        key := call argAt(0)\n"
+  	"        value := call argAt(1)\n"
+  	"        body := call argAt(2)\n"
+  	"        self foreach(k, v,\n"
+  	"            call sender setSlot(key name, k)\n"
+  	"            call sender setSlot(value name, v)\n"
+  	"			ss := stopStatus(r := call sender doMessage(body))\n"
+  	"			if(ss isReturn, call setStopStatus(ss); return getSlot(\"v\"))\n"
+  	"			if(ss isBreak, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"            result append(getSlot(\"r\"))\n"
+  	"        )\n"
+  	"        result\n"
+  	"    )\n"
+  	"\n"
+  	"	\n"
+  	"	select := method(\n"
+  	"		result := Map clone\n"
+  	"		self keys foreach(key,\n"
+  	"			if(call argCount > 1,\n"
+  	"				call sender setSlot(call argAt(0) name, key)\n"
+  	"				if(call argCount == 3,\n"
+  	"					call sender setSlot(call argAt(1) name, self at(key))\n"
+  	"				)\n"
+  	"			)\n"
+  	"			ss := stopStatus(v := call evalArgAt(call argCount - 1))\n"
+  	"			if(ss isReturn, call setStopStatus(ss); return getSlot(\"v\"))\n"
+  	"			if(ss isBreak, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"			if(getSlot(\"v\"),\n"
+  	"				result atPut(key, self at(key))\n"
+  	"			)\n"
+  	"		)\n"
+  	"		result\n"
+  	"	)\n"
+  	"\n"
+  	"	detect := method(\n"
+  	"		self keys foreach(key,\n"
+  	"			if(call argCount > 1,\n"
+  	"				call sender setSlot(call argAt(0) name, key)\n"
+  	"				if(call argCount == 3,\n"
+  	"					call sender setSlot(call argAt(1) name, self at(key))\n"
+  	"				)\n"
+  	"			)\n"
+  	"			ss := stopStatus(v := call evalArgAt(call argCount - 1))\n"
+  	"			if(ss isReturn, call setStopStatus(ss); return getSlot(\"v\"))\n"
+  	"			if(ss isBreak, break)\n"
+  	"			if(ss isContinue, continue)\n"
+  	"			if(getSlot(\"v\"),\n"
+  	"				return list(key, self at(key))\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	reverseMap := method(\n"
+  	"		Map clone addKeysAndValues(values, keys)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Map.io");
+
+	s = "Message do(\n"
+  	"	docSlot(\"union(other)\", \"Creates a union of the receiver and the other parameter. Returns a new message object with the receivers message as the first argument of the returned message, and the other parameter's arguments as each successive argument to the new message.\")\n"
+  	"	union := method(\n"
+  	"		r := Message clone\n"
+  	"		l := list(self)\n"
+  	"		call message argAt(0) arguments foreach(arg, l append(arg))\n"
+  	"		r setArguments(l)\n"
+  	"	)\n"
+  	"\n"
+  	"	asSimpleString := method(\n"
+  	"		s := self asString asMutable replaceSeq(\" ;\\n\", \"; \")\n"
+  	"		if(s size > 40,\n"
+  	"			s slice(0, 37) .. \"...\"\n"
+  	"		,\n"
+  	"			s\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Message.io");
+
+	s = "Number do(\n"
+  	"	docSlot(\"isInASequenceSet\", \"Return true if receiver is in one of the Sequence sequenceSets, otherwise false.\")\n"
+  	"	isInASequenceSet := method(\n"
+  	"		Sequence sequenceSets foreach(set,\n"
+  	"			if(in(set), return true)\n"
+  	"		)\n"
+  	"		false\n"
+  	"	)\n"
+  	"\n"
+  	"  docSlot(\"constants\", \"Object containing number constants e, inf, nan and pi.\")\n"
+  	"	\n"
+  	"  constants := Object clone do(\n"
+  	"    docSlot(\"nan\", \"Returns a infinity constant.\")    \n"
+  	"    nan := 0/0\n"
+  	"\n"
+  	"    docSlot(\"inf\", \"Returns a not-a-number constant.\")    \n"
+  	"    inf := 1/0\n"
+  	"        \n"
+  	"    docSlot(\"e\", \"Returns the constant e.\")\n"
+  	"    e  := 2.71828182845904523536028747135266249\n"
+  	"    \n"
+  	"	docSlot(\"pi\", \"Returns the constant pi.\")\n"
+  	"	pi := 3.14159265358979323846264338327950288\n"
+  	"  )\n"
+  	"\n"
+  	"  asSimpleString := method(self asString)\n"
+  	"\n"
+  	"  docSlot(\"asHex\", \"Returns the number as hex digits inside a string. 97 asHex -> \\\"61\\\"\")\n"
+  	"  asHex := method(self asString toBase(16))\n"
+  	"\n"
+  	"  docSlot(\"asBinary\", \"Returns the number as binary digits inside a string. 42 asBinary -> \\\"101010\\\"\")\n"
+  	"  asBinary := method(self asString toBase(2))\n"
+  	"\n"
+  	"  docSlot(\"asOctal\", \"Returns the number as octal digits inside a string. 436 asOctal -> \\\"664\\\"\")\n"
+  	"  asOctal := method(self asString toBase(8))\n"
+  	"\n"
+  	"  docSlot(\"combinations(size)\", \"Returns the combinations where the receiver is the number of different objects and size is the number to be arranged.\")\n"
+  	"  combinations := method(r, self factorial /(r factorial *((self - r) factorial)))\n"
+  	"\n"
+  	"  docSlot(\"permutations(size)\", \"Returns the permutations where the receiver is the number of different objects and size is the number to be arranged.\")\n"
+  	"  permutations := method(r, self factorial /((self - r) factorial))\n"
+  	"\n"
+  	"  docSlot(\"minMax(low, high)\", \"Returns a number between or equal to low and high. If the receiver is equal to or between low and high, the reciever is returned. If the reciever is less than low, low is returned. If the receiver is greater than high, high is returned.\")\n"
+  	"  minMax := method(low, high, min(high) max(low))\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Number.io");
+
+	s = "Sandbox do(\n"
+  	"    docSlot(\"printCallback(string)\", \n"
+  	"     \"default implementation is; method(string, string print)\")\n"
+  	"    printCallback := method(string, string print)\n"
+  	")";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Sandbox.io");
+
+	s = "\n"
+  	"nil   justSerialized := method(stream, stream write(\"nil\"))\n"
+  	"true  justSerialized := method(stream, stream write(\"true\"))\n"
+  	"false justSerialized := method(stream, stream write(\"false\"))\n"
+  	"\n"
+  	"Number justSerialized := method(stream,\n"
+  	"	stream write(self asSimpleString)\n"
+  	")\n"
+  	"\n"
+  	"Sequence justSerialized := method(stream,\n"
+  	"	stream write(self asMutable escape asSimpleString)\n"
+  	")\n"
+  	"\n"
+  	"List justSerialized := method(stream,\n"
+  	"	stream write(\"list(\")\n"
+  	"	stream write(self map(serialized) join(\", \"))\n"
+  	"	stream write(\");\")\n"
+  	")\n"
+  	"\n"
+  	"Map justSerialized := method(stream,\n"
+  	"	stream write(\"Map clone do(\")\n"
+  	"	self foreach(k, v,\n"
+  	"		stream write(\"atPut(\" .. k serialized .. \", \" .. getSlot(\"v\") serialized .. \");\")\n"
+  	"	)\n"
+  	"	stream write(\");\")\n"
+  	")\n"
+  	"\n"
+  	"Block docSlot(\"justSerialized(stream)\", \"Write's the receivers code into the stream.\")\n"
+  	"\n"
+  	"\n"
+  	"Block justSerialized := method(stream,\n"
+  	"		stream write(code, \"\\n\")\n"
+  	")\n"
+  	"\n"
+  	"SerializationStream := Object clone do(\n"
+  	"	init := method(\n"
+  	"		self seen := Map clone\n"
+  	"		self output := Sequence clone	\n"
+  	"	)\n"
+  	"	\n"
+  	"	write := method(\n"
+  	"		for(i, 0, call argCount - 1,\n"
+  	"			//super(writeln(i, call argAt(i)))\n"
+  	"			output appendSeq(call evalArgAt(i))\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"Object do(\n"
+  	"	serialized := method(stream,\n"
+  	"		if(stream == nil, stream := SerializationStream clone)\n"
+  	"		justSerialized(stream)\n"
+  	"		stream output\n"
+  	"	)\n"
+  	"	\n"
+  	"	justSerialized := method(stream,\n"
+  	"		stream write(getSlot(\"self\") type, \" clone do(\\n\") \n"
+  	"		self serializedSlots(stream)\n"
+  	"		stream write(\")\\n\")\n"
+  	"	)\n"
+  	"\n"
+  	"	serializedSlots := method(stream,\n"
+  	"		self serializedSlotsWithNames(self slotNames, stream)\n"
+  	"	)\n"
+  	"	\n"
+  	"	serializedSlotsWithNames := method(names, stream,\n"
+  	"		names foreach(slotName, \n"
+  	"			stream write(\"\\t\", slotName, \" := \")\n"
+  	"			self getSlot(slotName) serialized(stream)\n"
+  	"			stream write(\"\\n\")\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Serialize.io");
+
+	s = "System do(\n"
+  	"	launchScript := nil\n"
+  	"	docSlot(\"launchScript\", \"Returns the path of the io file run on the command line. Returns nil if no file was run.\")\n"
+  	"\n"
+  	"	ioPath := \"/usr/local/lib/io\"\n"
+  	"	docSlot(\"ioPath\", \"Returns the path of io installation. The default is /usr/local/lib/io.\")\n"
+  	"	\n"
+  	"	docSlot(\"getOptions(args)\", \"\n"
+  	"	This primitive is used to get command line options similar to Cs getopt(). \n"
+  	"	It returns a map in containing the left side of the argument, with the \n"
+  	"	value of the right side. (The key will not contain\n"
+  	"	the beginning dashes (--).\n"
+  	"	<p>\n"
+  	"	Example:\n"
+  	"	<pre>\n"
+  	"	options := System getOptions(args)\n"
+  	"	options foreach(k, v,\n"
+  	"	  if(v type == List type,\n"
+  	"		v foreach(i, j, writeln(\\\"Got unnamed argument with value: \\\" .. j))\n"
+  	"		continue\n"
+  	"	  )\n"
+  	"	  writeln(\\\"Got option: \\\" .. k .. \\\" with value: \\\" .. v)\n"
+  	"	)\n"
+  	"	</pre>\n"
+  	"	\")\n"
+  	"	\n"
+  	"	getOptions := method(arguments,\n"
+  	"		opts := Map clone\n"
+  	"		optname := Sequence clone\n"
+  	"		optvalue := Sequence clone\n"
+  	"		optsNoKey := List clone\n"
+  	"		\n"
+  	"		arguments foreach(i, arg,\n"
+  	"			if(arg beginsWithSeq(\"--\") isNil,\n"
+  	"				optsNoKey append(arg)\n"
+  	"				continue\n"
+  	"			)\n"
+  	"			\n"
+  	"			if(arg containsSeq(\"=\")) then(\n"
+  	"				optname := arg clone asMutable\n"
+  	"				optname clipAfterStartOfSeq(\"=\")\n"
+  	"				optname clipBeforeEndOfSeq(\"--\")\n"
+  	"				optvalue := arg clone asMutable\n"
+  	"				optvalue clipBeforeEndOfSeq(\"=\")\n"
+  	"			) else(\n"
+  	"				optname := arg clone asMutable\n"
+  	"				optname clipBeforeEndOfSeq(\"--\")\n"
+  	"				optvalue = \"\"\n"
+  	"			)\n"
+  	"			opts atPut(optname, optvalue)\n"
+  	"		)\n"
+  	"		\n"
+  	"		if(optsNoKey last != nil, opts atPut(\"\", optsNoKey))\n"
+  	"		opts\n"
+  	"	)\n"
+  	"	\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/System.io");
+
+	s = "UnitTest := Object clone do(\n"
+  	"	verbose := method(s,\n"
+  	"		nil\n"
+  	"		//writeln(s)\n"
+  	"	)\n"
+  	"	\n"
+  	"	docCategory(\"Testing\")\n"
+  	"	setUp := method(nil)\n"
+  	"	tearDown := method(nil)\n"
+  	"	init := method(self exceptions := List clone)\n"
+  	"	testSlotNames := method(\n"
+  	"		names := self slotNames select(name, name beginsWithSeq(\"test\"))\n"
+  	"		names sortByKey(name, self getSlot(name) message lineNumber)\n"
+  	"	)\n"
+  	"	\n"
+  	"	testCount := method(testSlotNames size)\n"
+  	"	\n"
+  	"	run := method(		\n"
+  	"		testSlotNames foreach(n, \n"
+  	"			self setUp\n"
+  	"			verbose(\"    \" .. n)\n"
+  	"			e := try(stopStatus(self doString(n)))\n"
+  	"			if(e, \n"
+  	"				write(\"    \", n, \" - failed\")\n"
+  	"				exceptions append(e)\n"
+  	"				write(\"\\n\")\n"
+  	"				writeln(e showStack)\n"
+  	"				//System exit\n"
+  	"			)\n"
+  	"			//Scheduler currentCoroutine yield\n"
+  	"			self tearDown\n"
+  	"			//Collector collect\n"
+  	"		)\n"
+  	"		self ?cleanUp\n"
+  	"	)\n"
+  	"    \n"
+  	"    fail := method(Exception raise(\"fail\"))\n"
+  	"    \n"
+  	"	assertEquals := method(a, b, m,\n"
+  	"		//writeln(\"assertEquals1 call message = \", call message type)\n"
+  	"		mm := call message\n"
+  	"		if(m == nil, m = mm)\n"
+  	"		d := m argAt(0) code .. \" != \" .. call argAt(1) code\n"
+  	"		if(a != b, Exception raise(\"[\" .. d .. \"] [\" .. a .. \" != \" .. b .. \"]\"))\n"
+  	"		//writeln(\"assertEquals2\")\n"
+  	"	)\n"
+  	"\n"
+  	"	assertNotEquals := method(a, b, if(a == b, Exception raise(a .. \" == \" .. b)))\n"
+  	"\n"
+  	"    assertSame    := method(a, b, assertEquals(a uniqueId, b uniqueId, call message))\n"
+  	"    assertNotSame := method(a, b, assertNotEquals(a uniqueId, b uniqueId, call message))\n"
+  	"    assertNil     := method(a, assertEquals(a, nil, call message))\n"
+  	"    assertNotNil  := method(a, assertNotEquals(a, nil, call message))\n"
+  	"    assertTrue    := method(a, assertEquals(a, true, call message))\n"
+  	"    assertFalse   := method(a, assertEquals(a, false, call message))\n"
+  	"\n"
+  	"	assertRaisesException := method(\n"
+  	"		e := try(\n"
+  	"			stopStatus(call evalArgAt(0))\n"
+  	"			writeln(\"Should have raised Exception\")\n"
+  	"		)\n"
+  	"		e ifNil(Exception raise(\"Should have raised Exception\"))\n"
+  	"	)\n"
+  	"    \n"
+  	"	knownBug := method(\n"
+  	"		//writeln(\"  [known bug: \", call argAt(0) code, \"]\")\n"
+  	"	)\n"
+  	"  \n"
+  	"	assertEqualsWithinDelta := method(expected, actual, delta,\n"
+  	"		if(((expected - actual) abs > delta),\n"
+  	"			Exception raise(\"expected \" .. expected .. \" but was \" .. actual .. \" (allowed delta: \" .. delta .. \")\")\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"TestSuite := Object clone do(\n"
+  	"	verbose := method(s,\n"
+  	"		nil\n"
+  	"		//writeln(s)\n"
+  	"	)\n"
+  	"	\n"
+  	"	docCategory(\"Testing\")\n"
+  	"	\n"
+  	"	name := method(\n"
+  	"		path asMutable pathComponent lastPathComponent\n"
+  	"	)\n"
+  	"	\n"
+  	"	newSlot(\"path\", \".\")\n"
+  	"	\n"
+  	"	run := method(\n"
+  	"		verbose(\"\\n\" .. name)\n"
+  	"		unitTestFiles := Directory with(launchPath) files select(f, f name endsWithSeq(\"Test.io\"))\n"
+  	"		exceptions := List clone\n"
+  	"		testCount := 0\n"
+  	"				\n"
+  	"		unitTestFiles foreach(f, \n"
+  	"			1 repeat(\n"
+  	"				verbose(\"  \" .. f name fileName)\n"
+  	"				test := Lobby doString(f contents, f path)\n"
+  	"				//Collector collect\n"
+  	"				test run\n"
+  	"			)\n"
+  	"			testCount = testCount + test testCount\n"
+  	"			exceptions appendSeq(test exceptions)\n"
+  	"		)\n"
+  	"		\n"
+  	"		verbose(\"  ---------------\")\n"
+  	"		//Collector collect\n"
+  	"		//if(testCount == 0, write(\"(no tests)\"); File standardOutput flush; return(0))\n"
+  	"		if(exceptions size > 0) then(\n"
+  	"			//writeln(\"	FAILED \", testCount, \" tests, \", exceptions size, \" failures\\n\")\n"
+  	"			return(exceptions size)\n"
+  	"		) else(\n"
+  	"			//writeln(\"	PASSED \", testCount, \" tests\\n\")\n"
+  	"			return(0)\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/UnitTest.io");
+
+	s = "Sequence do(\n"
+  	"	x := method(at(0))\n"
+  	"	y := method(at(1))\n"
+  	"	z := method(at(2))\n"
+  	"	setX := method(a, atPut(0, a); self)\n"
+  	"	setY := method(a, atPut(1, a); self)\n"
+  	"	setZ := method(a, atPut(2, a); self)\n"
+  	"	set := method(call evalArgs foreach(i, v, atPut(i, v)))\n"
+  	"	rootMeanSquare := method(meanSquare sqrt)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Vector.io");
+
+	s = "Path := Object clone do(\n"
+  	"	docCategory(\"FileSystem\")\n"
+  	"\n"
+  	"	hasDriveLetters := System platform containsAnyCaseSeq(\"Windows\") or System platform containsAnyCaseSeq(\"Cygwin\")\n"
+  	"\n"
+  	"	with := method(\n"
+  	"		s := Sequence clone\n"
+  	"		call message arguments foreach(arg,\n"
+  	"            v := call sender doMessage(arg)\n"
+  	"            //writeln(\"appendPathSeq(\", v type, \")\")\n"
+  	"            if(v == nil, v = \"\")\n"
+  	"            s appendPathSeq(v)\n"
+  	"		)\n"
+  	"		s asSymbol\n"
+  	"	)\n"
+  	"\n"
+  	"    isPathAbsolute := method(p,\n"
+  	"        absolute := false\n"
+  	"        try (\n"
+  	"            if (hasDriveLetters,\n"
+  	"                absolute = p at(0) isLetter and p at(1) asCharacter == \":\" or p at(0) asCharacter == \"/\" or p at(0) asCharacter == \"\\\\\"\n"
+  	"            ,\n"
+  	"                absolute = p at(0) asCharacter == \"/\"\n"
+  	"            )\n"
+  	"        )\n"
+  	"        absolute\n"
+  	"    )        \n"
+  	"        \n"
+  	"	absolute := method(path,\n"
+  	"		if(isPathAbsolute(path),\n"
+  	"			path\n"
+  	"		,\n"
+  	"			with(Directory currentWorkingDirectory, path)\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Y_Path.io");
+
+	s = "CLI := Object clone do(\n"
+  	"	newSlot(\"prompt\", \"Io> \")\n"
+  	"	newSlot(\"outPrompt\", \"==> \")\n"
+  	"	newSlot(\"continuedLinePrompt\", \"    \")\n"
+  	"\n"
+  	"	newSlot(\"context\", method(Lobby))\n"
+  	"	newSlot(\"isRunning\", true)\n"
+  	"\n"
+  	"	newSlot(\"commandLineLabel\", \"Command Line\")\n"
+  	"	\n"
+  	"	newSlot(\"lineReader\" , nil)\n"
+  	"	\n"
+  	"	stop := method(setIsRunning(false))\n"
+  	"	\n"
+  	"	runFile := method(path,\n"
+  	"		Lobby launchPath := if(Path isPathAbsolute(path),\n"
+  	"			path\n"
+  	"		,\n"
+  	"			Directory currentWorkingDirectory asMutable appendPathSeq(path)\n"
+  	"		) pathComponent\n"
+  	"\n"
+  	"		System launchScript = path\n"
+  	"\n"
+  	"		try(context doFile(path)) ?showStack\n"
+  	"	)\n"
+  	"\n"
+  	"	runIorc := method(\n"
+  	"		home := System getenv(\"HOME\")\n"
+  	"		if(home,\n"
+  	"			path := Path with(home, \".iorc\")\n"
+  	"			if(File with(path) exists,\n"
+  	"				context doFile(path)\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	run := method(\n"
+  	"		// Move Lobby launchPath to System launchPath?\n"
+  	"		Lobby launchPath := Directory currentWorkingDirectory\n"
+  	"		Importer addSearchPath(Lobby launchPath)\n"
+  	"		context exit := method(System exit)\n"
+  	"\n"
+  	"		runIorc\n"
+  	"\n"
+  	"		if(?args first == \"-e\", \n"
+  	"			writeln(context doString(args slice(1) map(asUTF8) join(\" \")))\n"
+  	"			return\n"
+  	"		)\n"
+  	"        \n"
+  	"		if(?args and args size > 0,\n"
+  	"			\n"
+  	"			if(args first == \"-i\",\n"
+  	"				if(args size >= 2,\n"
+  	"					runFile(args at(1))\n"
+  	"				,\n"
+  	"					if(File clone setPath(\"main.io\") exists, runFile(\"main.io\"))\n"
+  	"				)\n"
+  	"				return interactiveMultiline\n"
+  	"			)\n"
+  	"			\n"
+  	"			runFile(args first)\n"
+  	"		,\n"
+  	"			if(File clone setPath(\"main.io\") exists,\n"
+  	"				runFile(\"main.io\")\n"
+  	"			,\n"
+  	"				interactiveMultiline\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	"	\n"
+  	"	interactiveMultiline := method(\n"
+  	"		writeln(\"Io \", System version)\n"
+  	"		\n"
+  	"		/* Use GNU Readline as the default line reader. Fall back to Editline */\n"
+  	"		try(setLineReader(ReadLine))\n"
+  	"		try(lineReader ifNil( setLineReader(EditLine)))\n"
+  	"\n"
+  	"		while(isRunning,\n"
+  	"			if(lineReader isNil not,\n"
+  	"				handleInteractiveMultiline\n"
+  	"			,\n"
+  	"				interactiveNoLineReader\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	"	\n"
+  	"	interactive := method(\n"
+  	"		writeln(\"Io \", System version)\n"
+  	"		while(isRunning,\n"
+  	"			handleInteractiveSingleLine\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	writeCommandResult := method(result, \n"
+  	"		e := try(string := getSlot(\"result\") asString)\n"
+  	"		if(e not,\n"
+  	"			writeln(outPrompt, string)\n"
+  	"		,\n"
+  	"			writeln(outPrompt, \"<exception while dislaying result>\")\n"
+  	"			e showStack\n"
+  	"		)\n"
+  	"	)\n"
+  	"	\n"
+  	"	/*\n"
+  	"	handleInteractiveSingleLine := method(\n"
+  	"		line := EditLine readLine(prompt)\n"
+  	"		line ifNil(\n"
+  	"			writeln\n"
+  	"			context exit\n"
+  	"		)\n"
+  	"\n"
+  	"		EditLine addHistory(line)\n"
+  	"\n"
+  	"		e := try(result := context doMessage(line asMessage(commandLineLabel)))\n"
+  	"		if(e,\n"
+  	"			e showStack\n"
+  	"		,\n"
+  	"			writeCommandResult(getSlot(\"result\"))\n"
+  	"		)\n"
+  	"	)\n"
+  	"	*/\n"
+  	"	\n"
+  	"	interactiveNoLineReader := method(\n"
+  	"		write(prompt)\n"
+  	"		File standardOutput flush\n"
+  	"		\n"
+  	"		line := File standardInput readLine\n"
+  	"		\n"
+  	"		line ifNil(\n"
+  	"			writeln\n"
+  	"			context exit\n"
+  	"		)\n"
+  	"\n"
+  	"		e := try(result := context doMessage(line asMessage(commandLineLabel)))\n"
+  	"		if(e,\n"
+  	"			e showStack\n"
+  	"		,\n"
+  	"			writeCommandResult(getSlot(\"result\"))\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	errorMessage := method(error,\n"
+  	"		error beforeSeq(\" on line\")\n"
+  	"	)\n"
+  	"\n"
+  	"	# Find error messages for the errors we understand\n"
+  	"	lazySlot(\"knownErrors\",\n"
+  	"		m := Map clone\n"
+  	"		m atPut(compileErrorMessage(\"(\"), \")-> \")\n"
+  	"		m atPut(compileErrorMessage(\"[\"), \"]-> \")\n"
+  	"		m atPut(compileErrorMessage(\"{\"), \"}-> \")\n"
+  	"		m atPut(compileErrorMessage(\"\\\"\\\"\\\"\"), \"\\\"-> \")\n"
+  	"		m atPut(knownErrorMissingArgument, \")-> \")\n"
+  	"	)\n"
+  	"\n"
+  	"	lazySlot(\"knownErrorMissingArgument\",\n"
+  	"		compileErrorMessage(\"(x,\")\n"
+  	"	)\n"
+  	"\n"
+  	"	compileErrorMessage := method(source,\n"
+  	"		errorMessage(try(source asMessage) error)\n"
+  	"	)\n"
+  	"\n"
+  	"	handleInteractiveMultiline := method(\n"
+  	"		# Start with the default prompt. The prompt is changed for continued lines, and errors.\n"
+  	"		nextPrompt := prompt\n"
+  	"		line := \"\"\n"
+  	"\n"
+  	"		# If there are unmatched ( or the command ends with a \\ then we'll need to read multiple lines\n"
+  	"		loop(\n"
+  	"			# Write out prompt and read line\n"
+  	"			nextLine := lineReader readLine(nextPrompt)\n"
+  	"			\n"
+  	"			# If there was no line, exit\n"
+  	"			nextLine ifNil(context exit)\n"
+  	"\n"
+  	"			# Add what we read to the line we've been building up\n"
+  	"			if(nextLine size > 0,\n"
+  	"				if(line size > 0,\n"
+  	"					line = line .. nextLine\n"
+  	"				,\n"
+  	"					line = nextLine\n"
+  	"				)\n"
+  	"			)\n"
+  	"\n"
+  	"			# If there is a \\ on the end of the line, then keep building up the line\n"
+  	"			if(line endsWithSeq(\"\"\"\\\\\"\"\"),\n"
+  	"				nextPrompt = continuedLinePrompt\n"
+  	"				continue\n"
+  	"			)\n"
+  	"\n"
+  	"			compileError := try(lineAsMessage := line asMessage(commandLineLabel))\n"
+  	"			if(compileError,\n"
+  	"				if(nextLine size > 0,\n"
+  	"					# If they're missing the end of the line, then let them finish it\n"
+  	"					error := compileError error\n"
+  	"					continuePrompt := knownErrors at(errorMessage(error))\n"
+  	"					if(error == knownErrorMissingArgument and line asMutable strip endsWithSeq(\",\") not,\n"
+  	"						continuePrompt = nil\n"
+  	"					)\n"
+  	"					if(continuePrompt,\n"
+  	"						nextPrompt = continuePrompt\n"
+  	"						continue\n"
+  	"					)\n"
+  	"				)\n"
+  	"\n"
+  	"				# If the error can't be fixed by continuing the line, report the error.\n"
+  	"				compileError showStack\n"
+  	"				return\n"
+  	"			)\n"
+  	"\n"
+  	"			lineReader addHistory(line)\n"
+  	"\n"
+  	"			# Execute the line and report any exceptions which happen\n"
+  	"			executionError := try(result := context doMessage(lineAsMessage, context))\n"
+  	"			if(executionError,\n"
+  	"				executionError showStack\n"
+  	"				return\n"
+  	"			,\n"
+  	"				# Write out the command's result\n"
+  	"				writeCommandResult(getSlot(\"result\"))\n"
+  	"				return\n"
+  	"			)\n"
+  	"		)\n"
+  	"	)\n"
+  	")\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Z_CLI.io");
+
+	s = "Importer := Object clone do(\n"
+  	"    docDescription(\"A simple search path based auto-importer.\")\n"
+  	"\n"
+  	"    docSlot(\"paths\", \"List of paths the proto importer will check while searching for protos to load.\")\n"
+  	"	paths := method(FileImporter folders)\n"
+  	"\n"
+  	"    docSlot(\"addSearchPath(path)\", \"Add a search path to the auto importer. Relative paths are made absolute before adding.\")\n"
+  	"    addSearchPath    := method(p, paths appendIfAbsent(Path absolute(p) asSymbol))\n"
+  	"\n"
+  	"    docSlot(\"removeSearchPath(path)\", \"Removes a search path from the auto importer. Relative paths should be removed from the same working directory as they were added.\")\n"
+  	"    removeSearchPath := method(p, paths remove(Path absolute(p) asSymbol))\n"
+  	"\n"
+  	"	FileImporter := Object clone do(\n"
+  	"		importsFrom := \"file\"\n"
+  	"\n"
+  	"		folders := list(\"\")\n"
+  	"\n"
+  	"		import := method(protoName,\n"
+  	"			if(?launchPath, folders appendIfAbsent(launchPath))\n"
+  	"\n"
+  	"			folders foreach(folder,\n"
+  	"				path := Path with(folder, protoName .. \".io\") asSymbol\n"
+  	"				if(File with(path) exists,\n"
+  	"					Lobby doFile(path)\n"
+  	"					return true\n"
+  	"				)\n"
+  	"			)\n"
+  	"			false\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	AddonImporter := Object clone do(\n"
+  	"		importsFrom := \"dll\"\n"
+  	"\n"
+  	"		import := method(protoName,\n"
+  	"			if(hasAddon := AddonLoader hasAddonNamed(protoName),\n"
+  	"                AddonLoader loadAddonNamed(protoName)\n"
+  	"			)\n"
+  	"			hasAddon\n"
+  	"		)\n"
+  	"	)\n"
+  	"\n"
+  	"	importers := list(FileImporter, AddonImporter)\n"
+  	"\n"
+  	"    import := method(originalCall,\n"
+  	"		protoName := originalCall message name\n"
+  	"\n"
+  	"		if(protoName at(0) isUppercase and(importer := importers detect(import(protoName))),\n"
+  	"			if(Lobby hasSlot(protoName) not,\n"
+  	"				Exception raiseFrom(originalCall, \"Importer slot '\" .. protoName .. \"' missing after \" .. importer importsFrom .. \" load\")\n"
+  	"			)\n"
+  	"			Lobby getSlot(protoName)\n"
+  	"		,\n"
+  	"			targetType := originalCall target type\n"
+  	"			Exception raiseFrom(originalCall, targetType .. \" does not respond to '\" .. protoName .. \"'\")\n"
+  	"		)\n"
+  	"    )\n"
+  	"\n"
+  	"	autoImportingForward := method(\n"
+  	"		Importer import(call)\n"
+  	"	)\n"
+  	"\n"
+  	"    docSlot(\"turnOn\", \"Turns on the Importer. Returns self.\")\n"
+  	"    turnOn := method(\n"
+  	"		Lobby forward := self getSlot(\"autoImportingForward\")\n"
+  	"		self\n"
+  	"	)\n"
+  	"\n"
+  	"    docSlot(\"turnOff\", \"Turns off the Importer. Returns self.\")\n"
+  	"    turnOff := method(\n"
+  	"		Lobby removeSlot(\"forward\")\n"
+  	"		self\n"
+  	"	)\n"
+  	"\n"
+  	"	# Auto Importer is on by default\n"
+  	"    turnOn\n"
+  	")\n"
+  	"\n"
+  	"";
+
+	IoState_rawOn_doCString_withLabel_(self, context, s, "io/Z_Importer.io");
+
+}
+
--- iolanguage-20080107.orig/debian/patches/00list
+++ iolanguage-20080107/debian/patches/00list
@@ -0,0 +1,10 @@
+01_fine-grained-installation.dpatch
+04_AsyncRequest-depends-on-librt.dpatch
+05_addonloader.dpatch
+AVCodec-needs-errno-header.dpatch
+QDBM-needs-include-directory.dpatch
+SoundTouch-remove-dependency.dpatch
+HDB-has-interpreter-in-usr-local.dpatch
+remove-configure-generated-file-in-libsgml-source.dpatch
+use-relative-RPATH.dpatch
+add-strict-mode-option-to-build.io.dpatch
--- iolanguage-20080107.orig/debian/patches/04_AsyncRequest-depends-on-librt.dpatch
+++ iolanguage-20080107/debian/patches/04_AsyncRequest-depends-on-librt.dpatch
@@ -0,0 +1,15 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 04_AsyncRequest-depends-on-librt.dpatch by  <jonas@Athlon>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad Io-2007-12-12~/addons/AsyncRequest/build.io Io-2007-12-12/addons/AsyncRequest/build.io
+--- Io-2007-12-12~/addons/AsyncRequest/build.io	2007-12-10 07:35:50.000000000 +0100
++++ Io-2007-12-12/addons/AsyncRequest/build.io	2007-12-16 21:35:57.000000000 +0100
+@@ -1,3 +1,4 @@
+ AddonBuilder clone do(
+ 	dependsOnHeader("aio.h")
++	dependsOnLib("rt")
+ )
--- iolanguage-20080107.orig/debian/patches/01_fine-grained-installation.dpatch
+++ iolanguage-20080107/debian/patches/01_fine-grained-installation.dpatch
@@ -0,0 +1,100 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 01_fine-grained-installation.dpatch by  <indyjo@gmx.de>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad Io-2007-12-12~/Makefile Io-2007-12-12/Makefile
+--- Io-2007-12-12~/Makefile	2007-12-10 07:35:50.000000000 +0100
++++ Io-2007-12-12/Makefile	2008-01-05 22:14:03.000000000 +0100
+@@ -19,7 +19,9 @@
+ #endif
+ 
+ DLL_SUFFIX := so
+-DLL_COMMAND := -shared -Wl,-soname="libiovmall.so"
++DLL_SOVERSION := .0
++DLL_FULLVERSION := .0.0.0
++DLL_COMMAND := -shared -Wl,-soname="libiovmall.so$(DLL_SOVERSION)"
+ FLAT_NAMESPACE :=
+ 
+ LINKDLL := $(CC)
+@@ -33,6 +35,16 @@
+ AR     ?= ar
+ ARFLAGS := rcu 
+ 
++INSTALL_USER = root
++INSTALL_GROUP = root
++INSTALL	= install -o $(INSTALL_USER) -g $(INSTALL_GROUP)
++INSTALL_DIR_MODE = 755
++INSTALL_DIR = $(INSTALL) -d -m $(INSTALL_DIR_MODE)
++INSTALL_FILE_MODE = 644
++INSTALL_FILE = $(INSTALL) -m $(INSTALL_FILE_MODE)
++INSTALL_XFILE_MODE = 755
++INSTALL_XFILE = $(INSTALL) -m $(INSTALL_XFILE_MODE)
++
+ ifeq ($(SYS),Darwin)
+ DLL_SUFFIX := dylib
+ DLL_COMMAND := -dynamiclib
+@@ -129,6 +141,61 @@
+ 	cp -fR addons $(INSTALL_PREFIX)/lib/io
+ 	chmod -R ugo+rX $(INSTALL_PREFIX)/lib/io
+ 
++installDirs:
++	-$(INSTALL_DIR) $(INSTALL_PREFIX)/bin $(INSTALL_PREFIX)/lib/io
++
++installInterpreter: installDirs
++	$(INSTALL_XFILE) _build/binaries/io$(BINARY_SUFFIX) $(INSTALL_PREFIX)/bin
++
++installStandaloneInterpreter: installDirs
++	$(INSTALL_XFILE) _build/binaries/io_static$(BINARY_SUFFIX) $(INSTALL_PREFIX)/bin
++
++installStaticLibrary: installDirs
++	$(INSTALL_FILE) _build/lib/libiovmall.a $(INSTALL_PREFIX)/lib
++
++installSharedLibrary: installDirs
++	$(INSTALL_XFILE) _build/dll/libiovmall.$(DLL_SUFFIX) $(INSTALL_PREFIX)/lib/libiovmall.$(DLL_SUFFIX)$(DLL_FULLVERSION)
++	ln -sf libiovmall.$(DLL_SUFFIX)$(DLL_FULLVERSION) $(INSTALL_PREFIX)/lib/libiovmall.$(DLL_SUFFIX)$(DLL_SOVERSION)
++
++installDevelopmentFiles: installStaticLibrary
++	-$(INSTALL_DIR) $(INSTALL_PREFIX)/include/iolanguage
++	$(INSTALL_FILE) _build/headers/* $(INSTALL_PREFIX)/include/iolanguage
++	ln -sf libiovmall.$(DLL_SUFFIX)$(DLL_FULLVERSION) $(INSTALL_PREFIX)/lib/libiovmall.$(DLL_SUFFIX)
++
++buildAddon:
++	./_build/binaries/io_static$(BINARY_SUFFIX) build.io -s -a $(ADDON_NAME)
++
++installAddon:
++	$(INSTALL_DIR) $(INSTALL_PREFIX)/lib/io/addons/$(ADDON_NAME)
++	# NOT INSTALLED: source, Makefile, _build/headers, _build/objs, _build/lib
++	# protos, depends, frameworks, build.io, _build/dll, io/ -> /usr/lib/io
++	# tests/, samples/, docs/, license -> /usr/share/doc
++	-$(INSTALL_FILE) \
++		addons/$(ADDON_NAME)/{protos,depends,build.io,frameworks} \
++		$(INSTALL_PREFIX)/lib/io/addons/$(ADDON_NAME)
++	-for DIR in "addons/$(ADDON_NAME)"/*; do \
++		BASE="`basename "$$DIR"`"; \
++		if [ "_build" = "$$BASE" ]; then DIR="$$DIR/dll"; BASE=_build/dll; fi; \
++		[ -d "$$DIR" -a "`echo "$$DIR"/*`" != "$$DIR/*" ] || continue; \
++		case "$$BASE" in \
++			source|Makefile) continue;; \
++			protos|depends|frameworks|build.io|io|_build/dll|resources) \
++				DEST="$(INSTALL_PREFIX)/lib/io/addons/$(ADDON_NAME)/$$BASE";; \
++			tests|samples) \
++				DEST="$(INSTALL_PREFIX)/share/doc/$(ADDON_NAME)/$$BASE";; \
++			docs) \
++				DEST="$(INSTALL_PREFIX)/share/doc/$(ADDON_NAME)";; \
++			*) echo "=== WARNING: $$DIR not installed ==="; continue ;; \
++		esac; \
++		$(INSTALL_DIR) "$$DEST"; \
++		cp -r "$$DIR"/* "$$DEST"; \
++		chown -R "$(INSTALL_USER):$(INSTALL_GROUP)" "$$DEST"; \
++		find "$$DEST" -type f -print0 | xargs -0 chmod "$(INSTALL_FILE_MODE)"; \
++		find "$$DEST" -type d -print0 | xargs -0 chmod "$(INSTALL_DIR_MODE)"; \
++	done
++	@echo "=== Addon $(ADDON_NAME) installed. ==="
++
++
+ linkInstall:
+ 	mkdir -p $(INSTALL_PREFIX)/bin || true
+ 	mkdir -p $(INSTALL_PREFIX)/lib || true
--- iolanguage-20080107.orig/debian/patches/QDBM-needs-include-directory.dpatch
+++ iolanguage-20080107/debian/patches/QDBM-needs-include-directory.dpatch
@@ -0,0 +1,16 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## QDBM-needs-include-directory.dpatch by  <jonas@Athlon>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad Io-2007-12-12~/addons/QDBM/build.io Io-2007-12-12/addons/QDBM/build.io
+--- Io-2007-12-12~/addons/QDBM/build.io	2007-12-17 00:38:27.000000000 +0100
++++ Io-2007-12-12/addons/QDBM/build.io	2007-12-17 00:40:20.000000000 +0100
+@@ -1,3 +1,5 @@
+ AddonBuilder clone do(
++	appendHeaderSearchPath("/usr/include/qdbm")
++	dependsOnHeader("villa.h")
+ 	dependsOnLib("qdbm")
+ )
--- iolanguage-20080107.orig/debian/patches/AVCodec-needs-errno-header.dpatch
+++ iolanguage-20080107/debian/patches/AVCodec-needs-errno-header.dpatch
@@ -0,0 +1,18 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## AVCodec-needs-errno-header.dpatch by  <jonas@Athlon>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad Io-2007-12-12~/addons/AVCodec/source/IoAVCodec.h Io-2007-12-12/addons/AVCodec/source/IoAVCodec.h
+--- Io-2007-12-12~/addons/AVCodec/source/IoAVCodec.h	2007-12-10 07:35:50.000000000 +0100
++++ Io-2007-12-12/addons/AVCodec/source/IoAVCodec.h	2007-12-16 22:59:47.000000000 +0100
+@@ -8,6 +8,7 @@
+ #include "IoObject.h"
+ #include "IoSeq.h"
+ #include "IoList.h"
++#include <errno.h>
+ #include <ffmpeg/avcodec.h>
+ #include <ffmpeg/avformat.h>
+ 
--- iolanguage-20080107.orig/debian/patches/HDB-has-interpreter-in-usr-local.dpatch
+++ iolanguage-20080107/debian/patches/HDB-has-interpreter-in-usr-local.dpatch
@@ -0,0 +1,16 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## HDB-has-interpreter-in-usr-local.dpatch by  <jonas@Athlon>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad iolanguage-20071212~/addons/HDB/io/HDB.io iolanguage-20071212/addons/HDB/io/HDB.io
+--- iolanguage-20071212~/addons/HDB/io/HDB.io	2007-12-10 07:35:50.000000000 +0100
++++ iolanguage-20071212/addons/HDB/io/HDB.io	2007-12-23 16:31:10.000000000 +0100
+@@ -1,5 +1,3 @@
+-#!/usr/local/bin/io
+-
+ HDBModule := Object clone do(
+     pathSeparator := "/" //0 asCharacter
+     keyFromPathList := method(pathList, pathList join(pathSeparator))
--- iolanguage-20080107.orig/debian/patches/SoundTouch-remove-dependency.dpatch
+++ iolanguage-20080107/debian/patches/SoundTouch-remove-dependency.dpatch
@@ -0,0 +1,16 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## SoundTouch-remove-dependency.dpatch by  <jonas@Athlon>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad Io-2007-12-12~/addons/SoundTouch/build.io Io-2007-12-12/addons/SoundTouch/build.io
+--- Io-2007-12-12~/addons/SoundTouch/build.io	2007-12-10 07:35:50.000000000 +0100
++++ Io-2007-12-12/addons/SoundTouch/build.io	2007-12-16 23:39:44.000000000 +0100
+@@ -1,5 +1,4 @@
+ AddonBuilder clone do(
+-	dependsOnLib("stdc++")
+ 	dependsOnLib("SoundTouch")
+ 	dependsOnHeader("soundtouch/SoundTouch.h")
+ 
--- iolanguage-20080107.orig/debian/patches/remove-configure-generated-file-in-libsgml-source.dpatch
+++ iolanguage-20080107/debian/patches/remove-configure-generated-file-in-libsgml-source.dpatch
@@ -0,0 +1,31 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## remove-configure-generated-file-in-libsgml-source.dpatch by Jonas Eschenburg <indyjo@gmx.de>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Remove configure-generated file "config.cache" from libsgml sources to make lintian happy.
+
+@DPATCH@
+diff -urNad iolanguage-20071212~/addons/SGML/source/libsgml/config.cache iolanguage-20071212/addons/SGML/source/libsgml/config.cache
+--- iolanguage-20071212~/addons/SGML/source/libsgml/config.cache	2007-12-10 07:35:50.000000000 +0100
++++ iolanguage-20071212/addons/SGML/source/libsgml/config.cache	1970-01-01 01:00:00.000000000 +0100
+@@ -1,20 +0,0 @@
+-# This file is a shell script that caches the results of configure
+-# tests run on this system so they can be shared between configure
+-# scripts and configure runs.  It is not useful on other systems.
+-# If it contains results you don't want to keep, you may remove or edit it.
+-#
+-# By default, configure uses ./config.cache as the cache file,
+-# creating it if it does not exist already.  You can give configure
+-# the --cache-file=FILE option to use a different cache file; that is
+-# what configure does when it calls configure scripts in
+-# subdirectories, so they share the cache.
+-# Giving --cache-file=/dev/null disables caching, for debugging configure.
+-# config.status only pays attention to the cache file if you give it the
+-# --recheck option to rerun configure.
+-#
+-ac_cv_prog_CC=${ac_cv_prog_CC=gcc}
+-ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross=no}
+-ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes}
+-ac_cv_prog_cc_works=${ac_cv_prog_cc_works=yes}
+-ac_cv_prog_gcc=${ac_cv_prog_gcc=yes}
+-ac_cv_prog_make_make_set=${ac_cv_prog_make_make_set=yes}
--- iolanguage-20080107.orig/debian/patches/use-relative-RPATH.dpatch
+++ iolanguage-20080107/debian/patches/use-relative-RPATH.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## use-relative-RPATH.dpatch by  <jonas@Athlon>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad Io-2007-12-12~/build/AddonBuilder.io Io-2007-12-12/build/AddonBuilder.io
+--- Io-2007-12-12~/build/AddonBuilder.io	2007-12-30 01:17:45.000000000 +0100
++++ Io-2007-12-12/build/AddonBuilder.io	2007-12-30 01:19:11.000000000 +0100
+@@ -304,7 +304,7 @@
+ 			links appendSeq(depends syslibs map(v, v .. ".lib"))
+ 		)
+ 		if(platform != "darwin" and platform != "windows",
+-			links appendSeq(depends addons map(v, "-Wl,--rpath -Wl," .. System installPrefix .. "/lib/io/addons/" .. v .. "/_build/dll/"))
++			links appendSeq(depends addons map(v, "-Wl,--rpath -Wl,\\$ORIGIN/../../../" .. v .. "/_build/dll/"))
+ 		)
+ 		links appendSeq(libSearchPaths map(v, linkDirPathFlag .. v))
+ 		links appendSeq(depends libs map(v, linkLibFlag .. v .. linkLibSuffix))
--- iolanguage-20080107.orig/debian/patches/add-strict-mode-option-to-build.io.dpatch
+++ iolanguage-20080107/debian/patches/add-strict-mode-option-to-build.io.dpatch
@@ -0,0 +1,156 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 05_addonloader.dpatch by Jonas Eschenburg <indyjo@gmx.de>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Running build.io with the -s option will cause addon building to abort.
+
+@DPATCH@
+diff -urNad a/build.io b/build.io
+--- a/build.io
++++ b/build.io
+@@ -7,11 +7,35 @@ Directory fileNamedOrNil := method(path,
+ 
+ Directory setCurrentWorkingDirectory(launchPath)
+ 
++arguments := args slice(1)
++
++strictMode := false
++addonToBuild := nil
++command := nil
++
++while(arguments isNotEmpty,
++    if(arguments at(0) == "-s") then(
++        strictMode = true
++        arguments removeFirst
++    ) elseif (arguments at(0) == "-a") then(
++        addonToBuild = arguments at(1)
++        arguments = arguments slice(2)
++    ) else(
++        command = arguments at(0)
++        break
++    )
++)
++
+ project := Project clone
+-if(args at(1) == "-a") then(
+-    project buildAddon(args at(2))
+-) elseif (args at(1)) then(
+-	project clone doString(args at(1))
+-) else (
+-	project clone build
++project setStrictMode(strictMode)
++
++if (addonToBuild isNil) then(
++    if (command isNil) then(
++        project build
++    ) else(
++        project doString(command)
++    )
++) else(
++    project buildAddon(addonToBuild)
+ )
++
+diff -urNad a/build/AddonBuilder.io b/build/AddonBuilder.io
+--- a/build/AddonBuilder.io
++++ b/build/AddonBuilder.io
+@@ -189,8 +189,14 @@ AddonBuilder := Object clone do(
+ 		module
+ 	)
+ 
+-	systemCall := method(s,
+-		if(trySystemCall(s) == 256, System exit(1))
++	systemCall := method(s, strictMode,
++		retval := trySystemCall(s)
++		if(retval == 256, System exit(1))
++		if(strictMode and retval != 0,
++			"Error while executing '#{s}': exit code was #{retval}." interpolate println
++			"Aborting because strict mode is set." println
++			System exit(1)
++		)
+ 	)
+ 
+ 	trySystemCall := method(s,
+@@ -231,7 +237,7 @@ AddonBuilder := Object clone do(
+ 		includePaths
+ 	)
+ 
+-	build := method(options,
++	build := method(options, strictMode,
+ 		writeln(("--- " .. folder name .. " ") alignLeft(79, "-"))
+ 		writeln("build.io: Entering directory `", folder path, "'")
+ 		mkdir("_build/headers")
+@@ -259,21 +265,21 @@ AddonBuilder := Object clone do(
+                                     s = s .. "_ADDON "
+                                 )
+ 				s = s .. "-c " .. ccOutFlag .. "_build/objs/" .. obj .. " source/" .. f name
+-				systemCall(s)
++				systemCall(s, strictMode)
+ 			)
+ 		)
+ 
+-		buildLib
+-		buildDynLib
++		buildLib(strictMode)
++		buildDynLib(strictMode)
+ 		if(platform == "windows", embedManifest)
+ 		writeln("build.io: Leaving directory `", folder path, "'")
+ 		writeln
+ 	)
+ 	
+-	buildLib := method(
++	buildLib := method(strictMode,
+ 		mkdir("_build/lib")
+-		systemCall(ar .. " " .. arFlags ..  "_build/lib/" .. libName .. " _build/objs/*.o")
+-                if (ranlib != nil, systemCall(ranlib .. " _build/lib/" .. libName))
++		systemCall(ar .. " " .. arFlags ..  "_build/lib/" .. libName .. " _build/objs/*.o", strictMode)
++		if (ranlib != nil, systemCall(ranlib .. " _build/lib/" .. libName, strictMode))
+ 	)
+ 
+ 	dllSuffix := method(
+@@ -296,7 +302,7 @@ AddonBuilder := Object clone do(
+             )
+         )
+ 
+-	buildDynLib := method(
++	buildDynLib := method(strictMode,
+ 		mkdir("_build/dll")
+ 
+ 		links := depends addons map(b, linkDirPathFlag .. "../" .. b .. "/_build/dll")
+@@ -323,7 +329,8 @@ AddonBuilder := Object clone do(
+ 			s := " -install_name " .. System installPrefix .. "/lib/io/addons/" .. self name .. "/_build/dll/" .. libname
+ 		)
+ 
+-		systemCall(linkdll .. " " .. cflags .. " " .. dllCommand .. " " .. s .. " " .. linkOutFlag .. "_build/dll/" .. libname .. " _build/objs/*.o" .. " " .. links join(" "))
++		command := linkdll .. " " .. cflags .. " " .. dllCommand .. " " .. s .. " " .. linkOutFlag .. "_build/dll/" .. libname .. " _build/objs/*.o" .. " " .. links join(" ")
++		systemCall(command, strictMode)
+ 	)
+ 
+ 	embedManifest := method(
+diff -urNad a/build/Project.io b/build/Project.io
+--- a/build/Project.io
++++ b/build/Project.io
+@@ -2,6 +2,7 @@ Project := Object clone do(
+ 	cc  := method(System getenv("CC")  ifNilEval(return "cc"))
+ 	cxx := method(System getenv("CXX") ifNilEval(return "g++"))
+ 	platform := System platform split at(0) asLowercase
++	newSlot("strictMode", false)
+ 
+ 	systemCall := method(s,
+ 		r := trySystemCall(s)
+@@ -31,7 +32,7 @@ Project := Object clone do(
+ 	)
+ 
+     buildAddon := method(name,
+-        addons detect(addon, addon name == name) build(options)
++        addons detect(addon, addon name == name) build(options, strictMode)
+     )
+ 
+ 	availableAddon := method(addon,
+@@ -97,7 +98,7 @@ Project := Object clone do(
+ 	buildAddons := method(
+ 		writeln("\n--- building addons ---\n")
+ 
+-		orderedAddons foreach(build(options))
++		orderedAddons foreach(build(options, strictMode))
+ 		self
+ 	)
--- iolanguage-20080107.orig/debian/patches/05_addonloader.dpatch
+++ iolanguage-20080107/debian/patches/05_addonloader.dpatch
@@ -0,0 +1,20 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 05_addonloader.dpatch by  <dendik@dendik>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad iolanguage-20071212~/libs/iovm/io/AddonLoader.io iolanguage-20071212/libs/iovm/io/AddonLoader.io
+--- iolanguage-20071212~/libs/iovm/io/AddonLoader.io	2007-12-10 09:35:50.000000000 +0300
++++ iolanguage-20071212/libs/iovm/io/AddonLoader.io	2007-12-30 08:11:57.000000000 +0300
+@@ -48,7 +48,8 @@
+             DynLib clone setPath(dllPath) open call("Io" .. name .. "Init", context)
+         ,
+             // check for C files, if found then addon didn't compile
+-            if(Directory with(sourcePath) size > 1,
++						sourceDirectory := Directory with(sourcePath)
++            if(sourceDirectory exists and sourceDirectory size > 1,
+                 Exception raise("Failed to load Addon " .. name .. " - it appears that the addon exists but was not compiled. You might try running 'make " .. name .. "' in the Io source folder.")
+             )
+         )
--- iolanguage-20080107.orig/debian/README.Debian
+++ iolanguage-20080107/debian/README.Debian
@@ -0,0 +1,27 @@
+iolanguage for Debian
+---------------------
+
+Some addons from Io's main distribution were not included for the following
+reasons:
+- AppleExtras is not supported on Linux
+- AVCodec: depends on PortAudio
+- Cairo: no work done so far
+- CFFI is outdated and dies with
+  "libIoCFFI.so: undefined symbol: IoCFFIDataType_rawClone"
+- Contracts is outdated and was disabled in upstream
+- GLFW is missing a library "glfw" which doesnt seem to be available in Debian
+- Loki fails with Exception "unable to read file 'x86opcodes.io'"
+- NetworkAdapter is not supported on Linux
+- ObjcBridge is missing gnustep-gui library
+  (couldn't install needed packages due to conflicts at the time of compilation)
+- ODE Disabled in upstream (needs to be ported to the new Vector code)
+- PortAudio dies with
+  "Exception: Importer slot 'PortAudio' missing after dll load"
+- SGML is missing sgml library which does not yet exist in debian. The source code
+  of libsgml is included in Io's sources.
+- SkipDB is outdated and disabled in upstream
+- TagDB needs library tagdb which isn't yet in Debian
+- TagLib has undefined symbol: taglib_file_newTag
+
+--- Jonas Eschenburg <indyjo@gmx.de> (maintainer of iolanguage packages)
+
--- iolanguage-20080107.orig/debian/changelog
+++ iolanguage-20080107/debian/changelog
@@ -0,0 +1,88 @@
+iolanguage (20080107-1) UNRELEASED; urgency=low
+
+  [ Jonas Eschenburg ]
+  * New upstream release
+  * removed 03_post-20071212.dpatch
+
+ -- Jonas Eschenburg <indyjo@gmx.de>  Mon, 07 Jan 2008 21:01:10 +0100
+
+iolanguage (20071212-3) UNRELEASED; urgency=low+
+
+  [ Danya Alexeyevsky ]
+  * Do not compile with -O2 and -g simultanously
+  * Renamed iolanguage-docs to iolanguage-doc
+  * Some cleanup
+
+  [ Jonas Eschenburg ]
+  * Made RPATH entries of addon libraries relative
+  * Fixed man page generation
+  * Added debian/shlibs.local to override libdbi dependency
+  * Abort build when addon compilation fails
+  * Compile Python addon against Python 2.5
+
+ -- Jonas Eschenburg <indyjo@gmx.de>  Sun, 30 Dec 2007 00:15:04 +0100
+
+iolanguage (20071212-2) unstable; urgency=low
+
+  * Fixed Lintian/Linda errors
+
+ -- Jonas Eschenburg <indyjo@gmx.de>  Sun, 23 Dec 2007 16:29:45 +0100
+
+iolanguage (20071212-1) unstable; urgency=low
+
+  * New upstream Io version 2007-12-12
+  * Include ReadLine support which didn't make it into the release
+  * Almost all addons packaged
+  * Included documentation
+
+ -- Jonas Eschenburg <indyjo@gmx.de>  Fri, 14 Dec 2007 21:52:27 +0100
+ 
+iolanguage (20071010-2) unstable; urgency=low
+
+  * Use original source tarball (not repackaged)
+  * Patch Makefile using dpatch
+  * Updated manpages
+
+ -- Jonas Eschenburg <indyjo@gmx.de>  Sat, 08 Dec 2007 19:17:23 +0100
+
+iolanguage (20071010-1) feisty unstable; urgency=low
+
+  * New upstream Io version 07-10-10
+  * New package structure with a meta-package iolanguage, a library package
+    libiovmall0 (-dev) and the interpreter in iolanguage-interpreter
+  * Removed addon Vector
+  * Added shlibs.libiovm0
+  * Using makefile patch from Danya
+  * New maintainer
+  * Made this a debian (unstable) package, too
+
+ -- Jonas Eschenburg <indyjo@gmx.de>  Sat, 24 Nov 2007 15:53:09 +0100
+
+iolanguage (20070226-3) feisty; urgency=low
+
+  * Now packaging static binary in the iolanguage package
+  * Restored Flux addon from orig source.
+  * Placed exact versioning for iolanguage in control file.
+  * Fixed BigNum <-> Vector switch.
+  * Moved to prefix /usr
+  * Fixed runtime addon searchpath problem
+
+ -- A. Bram Neijt <bneijt@gmail.com>  Tue, 27 Mar 2007 12:02:57 +0200
+
+iolanguage (20070226-2) feisty; urgency=low
+
+  * Bug fixed the core package, where the binary was not proporly installed.
+  * Removed the duplicate font files mentioned by Linda
+  * Added usr/man/man1 to dirs
+  * Removed the addons rule, to keep from calling dh_clean twice.
+  * Changed sections from "interperter" to "interpreters"
+  * Fixed lintian: extended-description-line-too-long
+
+ -- A. Bram Neijt <bneijt@gmail.com>  Mon, 26 Mar 2007 08:42:35 +0200
+
+iolanguage (20070226-1) feisty; urgency=low
+
+  * Initial release, doesn't close any ITP because I didn't create one.
+
+ -- A. Bram Neijt <bneijt@gmail.com>  Sun, 11 Mar 2007 15:44:19 +0100
+
--- iolanguage-20080107.orig/debian/compat
+++ iolanguage-20080107/debian/compat
@@ -0,0 +1 @@
+5
--- iolanguage-20080107.orig/debian/control
+++ iolanguage-20080107/debian/control
@@ -0,0 +1,352 @@
+Source: iolanguage
+Section: interpreters
+Priority: optional
+Maintainer: Jonas Eschenburg <indyjo@gmx.de>
+Build-Depends: debhelper (>= 5), dpatch, libpcre3-dev, libgmp3-dev, libpng12-dev, libtiff4-dev, libjpeg62-dev, freeglut3-dev, libgl1-mesa-dev | libgl1-dev, libglu1-mesa-dev | libglu1-dev, libsqlite0-dev, libsqlite3-dev, libxml2-dev, libevent-dev, libncurses5-dev, docbook-to-man, libedit-dev, libdbi0-dev, libsndfile1-dev, libflac-dev, libmysqlclient15-dev, portaudio19-dev, libqdbm-dev, libsamplerate0-dev, libavcodec-dev, libsoundtouch1-dev, libtagc0-dev, uuid-dev, zlib1g-dev, libreadline5-dev, libffi4-dev, libfreetype6-dev, libode0-dev, python2.5-dev
+Standards-Version: 3.7.2
+
+Package: iolanguage-interpreter
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Io programming language interpreter
+ This is the Io interpreter necessary for running .io files.
+
+Package: iolanguage-standalone
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Io programming language interpreter (standalone version)
+ This is the standalone version of the Io interpreter. It is limited in
+ functionality but it requires fewer dependencies.
+
+Package: iolanguage
+Architecture: all
+Depends: iolanguage-interpreter, iolanguage-regex, iolanguage-random, iolanguage-range, iolanguage-bignum, iolanguage-socket, iolanguage-curses, iolanguage-libxml2, iolanguage-editline, iolanguage-syslog, iolanguage-systemcall, iolanguage-user, iolanguage-uuid, iolanguage-zlib
+Recommends: iolanguage-doc
+Description: The Io programming language
+ Io is a small, prototype-based programming language. The ideas in Io are
+ mostly inspired by Smalltalk (all values are objects), Self
+ (prototype-based), NewtonScript (differential inheritance), Act1 (actors 
+ and futures for concurrency), LISP (code is a runtime 
+ inspectable/modifiable tree) and Lua (small, embeddable).
+ .
+ This is a metapackage that depends on the Io interpreter and a selection
+ of basic addons.
+
+Package: iolanguage-doc
+Replaces: iolanguage-docs
+Architecture: all
+Section: doc
+Depends: 
+Description: Documentation for Io programming language
+ This package contains documentation for the Io programming language.
+
+Package: libiovmall0
+Architecture: any
+Section: libs
+Depends: ${shlibs:Depends}
+Description: The Io programming language virtual machine library
+ This is the Io virtual machine library used by the interpreter and all
+ applications which embed Io as a scripting language.
+
+Package: libiovmall0-dev
+Architecture: any
+Section: libs
+Depends: libiovmall0
+Provides: libiovmall-dev
+Description: Development file for the Io programming language
+ This package contains files needed for linking against the Io virtual
+ machine.
+
+Package: iolanguage-asyncrequest
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The AsyncRequest addon for the Io language
+ An addon for the Io programming language providing
+ support for efficient asynchronous input/output.
+
+Package: iolanguage-bignum
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The BigNum addon for the Io language
+ The BigNum addon for the Io programming language
+
+Package: iolanguage-blowfish
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Blowfish addon for the Io language
+ Addon providing Blowfish encryption for the Io language
+
+Package: iolanguage-box
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Box addon for the Io language
+ The Box addon for the Io programming language
+
+Package: iolanguage-cgi
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The CGI addon for the Io language
+ An addon adding support for writing CGI scripts
+ for internet services
+
+Package: iolanguage-continuedfraction
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The ContinuedFraction addon for the Io language
+ The ContinuedFraction addon for the Io programming language
+
+Package: iolanguage-curses
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Curses addon for the Io language
+ The Curses addon for the Io programming language adds
+ support for writing and reading at arbitrary positions on the terminal
+
+Package: iolanguage-dbi
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The DBI addon for the Io language
+ The DBI addon for the Io programming language,
+ providing database access to Io programs
+
+Package: iolanguage-editline
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The EditLine addon for the Io language
+ The EditLine addon providing interactive command-line editing
+ using libedit
+
+Package: iolanguage-flux
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Flux addon for the Io language
+ Flux is a simple themeable user interface toolkit for the Io programming
+ language. It is based on OpenGL.
+
+Package: iolanguage-fnmatch
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Fnmatch addon for the Io language
+ The fnmatch addon adds support for file-name matching using the unix fnmatch
+ function to for the Io programming language
+
+Package: iolanguage-font
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Font addon for the Io language
+ Addon providing loading and rendering of TrueType fonts for
+ the Io programming language
+
+Package: iolanguage-hdb
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The HDB addon for the Io language
+ The HDB addon for the Io programming language
+
+Package: iolanguage-image
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Image addon for the Io language
+ The Image addon for the Io programming language, providing
+ support for reading and drawing images access to the image data as a buffer
+
+Package: iolanguage-libxml2
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The LibSndFile addon for the Io language
+ The LibSndFile addon for the Io programming language
+
+Package: iolanguage-libsndfile
+Architecture: any
+Depends: ${shlibs:Depends}, iolanguage-samplerateconverter
+Description: The Libxml2 addon for the Io language
+ The Libxml2 addon for the Io programming language
+
+Package: iolanguage-lzo
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The LZO addon for the Io language
+ The LZO addon for the Io programming language, providing
+ a very fast compression/decompression service
+
+Package: iolanguage-md5
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The MD5 addon for the Io language
+ The MD5 addon for the Io programming language, providing
+ a way to generate MD5 checksums
+
+Package: iolanguage-mysql
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The MySQL addon for the Io language
+ The MySQL addon for the Io programming language, providing
+ access to MySQL databases
+
+Package: iolanguage-notificationcenter
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The NotificationCenter addon for the Io language
+ The NotificationCenter addon for the Io programming language, a small
+ addon providing a signals-like callback mechanism
+
+Package: iolanguage-python
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Python addon for the Io language
+ The Python addon for the Io programming language, providing access
+ to the world of the Python programming language from within Io
+
+Package: iolanguage-opengl
+Architecture: any
+Depends: ${shlibs:Depends}, iolanguage-image, iolanguage-box, iolanguage-font
+Description: The OpenGL addon for the Io language
+ The OpenGL addon for the Io programming language, providing
+ accelerated 3D graphics support.
+
+Package: iolanguage-postgres
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Postgres addon for the Io language
+ The Postgres addon for the Io programming language,
+ another addon providing access to PostgreSQL databases
+
+Package: iolanguage-postgresql
+Architecture: any
+Depends: ${shlibs:Depends}, iolanguage-sqldatabase
+Description: The PostgreSQL addon for the Io language
+ The PostgreSQL addon for the Io programming language, providing
+ access to PostgreSQL databases
+
+Package: iolanguage-qdbm
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The QDBM addon for the Io language
+ The QDBM addon for the Io programming language, providing
+ support for QDBM databases
+
+Package: iolanguage-random
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Random addon for the Io language
+ Addon providing random number generation for the Io programming language
+
+Package: iolanguage-range
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Range addon for the Io language
+ Addon providing a Range datatype for the Io programming language
+
+Package: iolanguage-rational
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Rational addon for the Io language
+ The Rational addon for the Io programming language, providing
+ rational numbers to Io programs
+
+Package: iolanguage-readline
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The ReadLine addon for the Io language
+ The ReadLine addon providing interactive command-line editing
+ using GNU readline
+
+Package: iolanguage-regex
+Architecture: any
+Depends: ${shlibs:Depends}, iolanguage-range
+Description: The Regex addon for the Io language
+ The Regex addon for Perl-compatible regular expression support (pcre)
+
+Package: iolanguage-samplerateconverter
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The SampleRateConverter addon for the Io language
+ The SampleRateConverter addon for the Io programming language, providing
+ support for resampling audio data
+
+Package: iolanguage-sha1
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The SHA1 addon for the Io language
+ The SHA1 addon for the Io programming language, providing a
+ way to generate SHA-1 cryptographic checksums
+
+Package: iolanguage-socket
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Socket addon for the Io language
+ The Socket addon for the Io programming language, providing
+ a standard interface to network communication
+
+Package: iolanguage-sqldatabase
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The SqlDatabase addon for the Io language
+ The SqlDatabase addon for the Io programming language
+
+Package: iolanguage-sqlite
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The SQLite addon for the Io language
+ The SQLite addon for the Io programming language, providing
+ an in-process SQL database using SQLite (version 2)
+
+Package: iolanguage-sqlite3
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The SQLite3 addon for the Io language
+ The SQLite3 addon for the Io programming language, providing
+ an in-process SQL database using SQLite (version 3)
+
+Package: iolanguage-soundtouch
+Architecture: any
+Depends: ${shlibs:Depends}, iolanguage-samplerateconverter
+Description: The SoundTouch addon for the Io language
+ The SoundTouch addon for the Io programming language, providing
+ support to change the tempo and/or pitch of an audio stream
+
+Package: iolanguage-syslog
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Syslog addon for the Io language
+ The Syslog addon for the Io programming language
+
+Package: iolanguage-systemcall
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The SystemCall addon for the Io language
+ The SystemCall addon for the Io programming language
+
+Package: iolanguage-taglib
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The TagLib addon for the Io language
+ The TagLib addon for the Io programming language
+
+Package: iolanguage-thread
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Thread addon for the Io language
+ The Thread addon for the Io programming language
+
+Package: iolanguage-user
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The User addon for the Io language
+ The User addon for the Io programming language, providing access
+ to the local operating system's information about the current user
+
+Package: iolanguage-uuid
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The UUID addon for the Io language
+ The UUID addon for the Io programming language
+
+Package: iolanguage-zlib
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Zlib addon for the Io language
+ The Zlib addon for the Io programming language,
+ providing compression to and decompression from gzip
+ format
+
--- iolanguage-20080107.orig/debian/copyright
+++ iolanguage-20080107/debian/copyright
@@ -0,0 +1,48 @@
+Debianization by:
+	* Danya Alexeyevsky <me.dendik@gmail.com>
+	* Jonas Eschenburg <indyjo@gmx.de>
+	* based on the work of A. Bram Neijt <bneijt@gmail.com>
+
+It was downloaded from http://www.iolanguage.com
+
+Upstream Author: Steve Dekorte <steve@dekorte.com>
+
+Copyright (out of date now):
+The Io Programming Lanuage interperter
+	2002,2003,2004,2005,2006 Steve Dekorte
+	1986-2002, Hiram Clawson - curator@hiram.ws.NoSpam
+	2001-2004 Unicode, Inc. (basekit/source/ConvertUTF.c)
+	2005 __MyCompanyName__ (basekit/source/_new/Array/Array_math.c)
+	1994 Powerdog Industries.
+	2004, Kentaro A. Kurahone
+	2007, Marc Fauconneau
+	1995, Patrick Powell
+	2001, Mike Barcroft <mike@FreeBSD.org>
+	1998, Todd C. Miller <Todd.Miller@courtesan.com>
+	1994, Powerdog Industries (basekit/source/PortableStrptime.c)
+	1997--2004, Makoto Matsumoto, Takuji Nishimura, and Eric Landry (basekit/source/RandomGen.c)
+	1999, Marcel Moolenaar
+	2005-2006, Russ Cox
+	2006, Jonathan Wright
+
+License:
+
+The sourcecode is licensed under the BSD License.
+On Debian GNU/Linux systems you can find the complete BSD licence in
+/usr/share/common-licenses/BSD
+
+
+LibSGML:
+
+A copy of libSGML is included in the source code of Io.
+Its license can be found in addons/SGML/source/libsgml/License.
+
+
+Packaging:
+
+The Debian packaging is
+	* copyright (C) 2007, Danya Alexeyevsky <me.dendik@gmail.com>
+	* copyright (C) 2007, Jonas Eschenburg <indyjo@gmx.de>
+	* copyright (C) 2007, A. Bram Neijt <bneijt@gmail.com>
+and is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
+
--- iolanguage-20080107.orig/debian/io.sgml
+++ iolanguage-20080107/debian/io.sgml
@@ -0,0 +1,142 @@
+<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.3//EN" [
+	<!ENTITY manfirstname "<firstname>Danya</firstname>">
+	<!ENTITY mansurname	"<surname>Alexeyevsky</surname>">
+	<!ENTITY manfullname	"&manfirstname; &mansurname;">
+	<!ENTITY mandate	"2007-12-17">
+	<!ENTITY manemail	"<email>me.dendik@gmail.com</email>">
+	<!ENTITY manbinary	"io">
+	<!ENTITY manio	"Io">
+	<!ENTITY manpackage	"iolanguage">
+]>
+
+<refentry>
+
+	<refentryinfo>
+		<address>&manemail;</address>
+		<author>&manfullname;</author>
+		<!--
+		<copyright><year>2007</year> <holder>&manfullname;</holder></copyright>
+		-->
+		<date>&mandate;</date>
+	</refentryinfo>
+
+	<refmeta>
+		<refentrytitle>&manbinary;</refentrytitle>
+		<manvolnum>1</manvolnum>
+	</refmeta>
+
+	<refnamediv>
+		<refname>&manpackage;</refname>
+		<refpurpose>Io Programming Lanuage interperter</refpurpose>
+	</refnamediv>
+
+	<refsynopsisdiv>
+		<cmdsynopsis>
+			<command>&manbinary;</command>
+			<arg><option>-i</option></arg>
+			<arg rep="repeat" choice="opt"><replaceable>input file</replaceable></arg>
+		</cmdsynopsis>
+		<cmdsynopsis>
+			<command>&manbinary;</command>
+			<arg choice="req"><option>-e</option></arg>
+			<arg rep="repeat" choice="opt"><replaceable>expression</replaceable></arg>
+		</cmdsynopsis>
+	</refsynopsisdiv>
+
+	<refsect1>
+		<title>DESCRIPTION</title>
+		<para><command>&manbinary;</command> is the &manio;
+		Programming Language interperter and the main entry point for
+		the iovm.</para>
+		<para>In the first form &manbinary; executes each of the
+		files specified on the command line.</para>
+		<para>If <option>-i</option> is specified or no input files
+		are given, &manbinary; then runs interactive interpreter.</para>
+		<para>If &manbinary; goes interactive given input files, it
+		attempts to load <filename>main.io</filename> before
+		displaying the command prompt. It may be useful for some
+		common setup for interactive sessions.</para>
+		<para>In the second form &manbinary; evaluates the expression
+		given on the command line and prints the resulting
+		value.</para>
+	</refsect1>
+
+	<refsect1>
+		<title>OPTIONS</title>
+		<variablelist>
+			<varlistentry>
+				<term><option>-i</option></term>
+				<listitem><para>Go interactive after executing the files
+				on the command line.</para></listitem>
+			</varlistentry>
+			<varlistentry>
+				<term><option>-e</option></term>
+				<listitem><para>Treat arguments as an &manio; expression
+				and evaluate it. Print the result on the standard
+				output.</para></listitem>
+			</varlistentry>
+		</variablelist>
+	</refsect1>
+
+	<refsect1>
+		<title>FILES</title>
+		<variablelist>
+			<varlistentry>
+				<term><filename>main.io</filename></term>
+				<listitem><para>If exists, this file is sourced if
+				&manio; is going interactive and no files are specified
+				on the command line.</para></listitem>
+			</varlistentry>
+			<varlistentry>
+				<term><filename>~/.iorc</filename></term>
+				<listitem><para>If exists, this file is executed first,
+				before executing any other files or expressions on the
+				command line.</para></listitem>
+			</varlistentry>
+		</variablelist>
+	</refsect1>
+
+<!--
+	<refsect1>
+		<title>ENVIRONMENT</title>
+		<para></para>
+	</refsect1>
+-->
+
+	<refsect1>
+		<title>RETURN VALUE</title>
+		<para>Return value is determined by program code. Unless call to
+		exit is explicitly made, return code is always 0.</para>
+	</refsect1>
+
+	<refsect1>
+		<title>AUTHOR</title>
+		<para>Steve Dekorte. For more information on the io interperter, please
+		visit <uri>http://www.iolanguage.com/</uri>. </para>
+	</refsect1>
+
+<!--
+	<refsect1>
+		<title>SEE ALSO</title>
+		<para></para>
+	</refsect1>
+-->
+
+</refentry>
+
+<!-- Keep this comment at the end of the file
+Local variables:
+mode: sgml
+sgml-omittag:t
+sgml-shorttag:t
+sgml-minimize-attributes:nil
+sgml-always-quote-attributes:t
+sgml-indent-step:2
+sgml-indent-data:t
+sgml-parent-document:nil
+sgml-default-dtd-file:nil
+sgml-exposed-tags:nil
+sgml-local-catalogs:nil
+sgml-local-ecat-files:nil
+End:
+-->
--- iolanguage-20080107.orig/debian/manpages
+++ iolanguage-20080107/debian/manpages
@@ -0,0 +1 @@
+debian/io.1
--- iolanguage-20080107.orig/debian/outtakes
+++ iolanguage-20080107/debian/outtakes
@@ -0,0 +1,32 @@
+# These packages were removed from control. I put them here to preserve the
+# description lines
+
+Package: iolanguage-avcodec
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The AVCodec addon for the Io language
+ The AVCodec addon for the Io programming language providing
+ coding/decoding of video files using libavcodec
+
+Package: iolanguage-cffi
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The CFFI addon for the Io language
+ The CFFI addon provides a foreign function interface
+ to arbitrary C functions
+
+Package: iolanguage-loki
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The Loki addon for the Io language
+ The Loki addon for the Io programming language, providing
+ low-level introspection into a running Io VM
+
+Package: iolanguage-ode
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: The ODE addon for the Io language
+ The ODE addon for the Io programming language, providing physics
+ simulation using the open-source ODE physics engine
+
+
--- iolanguage-20080107.orig/debian/iolanguage-doc.docs
+++ iolanguage-20080107/debian/iolanguage-doc.docs
@@ -0,0 +1,3 @@
+docs/guide_files/
+docs/guide.html
+docs/guide.pdf
--- iolanguage-20080107.orig/debian/rules
+++ iolanguage-20080107/debian/rules
@@ -0,0 +1,203 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+# debian/rules for the iolanguage packages.
+# Adapted by Bram Neijt.
+# Maintained by Jonas Eschenburg.
+
+# This file was originally written by Joey Hess and Craig Small.
+#
+# Modified to make a template file for a multi-binary package with separated
+# build-arch and build-indep targets  by Bill Allombert 2001
+
+# Use pack/unpack targets from dpatch
+include /usr/share/dpatch/dpatch.make
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This has to be exported to make some magic below work.
+export DH_OPTIONS
+
+CFLAGS = -Wall
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+	CFLAGS += -O0 -g
+else
+	CFLAGS += -O2
+endif
+
+configure: configure-stamp
+configure-stamp: patch-stamp
+	dh_testdir
+	touch configure-stamp
+
+#Architecture 
+build: build-arch build-indep
+
+build-arch: build-arch-stamp
+build-arch-stamp: configure-stamp
+	# The addons depend on the vm, but it's nice to call them seperately
+	# just for clearity	
+	$(MAKE) vm INSTALL_PREFIX=/usr
+	# 
+	# ADDONS
+	# (Addon HDB is missing because it has no build.io file and does not need to be built)
+	#
+	$(MAKE) buildAddon ADDON_NAME=AsyncRequest
+	$(MAKE) buildAddon ADDON_NAME=BigNum
+	$(MAKE) buildAddon ADDON_NAME=Blowfish
+	$(MAKE) buildAddon ADDON_NAME=Box
+	$(MAKE) buildAddon ADDON_NAME=CGI
+	$(MAKE) buildAddon ADDON_NAME=ContinuedFraction
+	$(MAKE) buildAddon ADDON_NAME=Curses
+	$(MAKE) buildAddon ADDON_NAME=DBI
+	$(MAKE) buildAddon ADDON_NAME=EditLine
+	$(MAKE) buildAddon ADDON_NAME=Flux
+	$(MAKE) buildAddon ADDON_NAME=Fnmatch
+	$(MAKE) buildAddon ADDON_NAME=Font
+	$(MAKE) buildAddon ADDON_NAME=Image
+	$(MAKE) buildAddon ADDON_NAME=Libxml2
+	$(MAKE) buildAddon ADDON_NAME=LibSndFile
+	$(MAKE) buildAddon ADDON_NAME=LZO
+	$(MAKE) buildAddon ADDON_NAME=MD5
+	$(MAKE) buildAddon ADDON_NAME=MySQL
+	$(MAKE) buildAddon ADDON_NAME=NotificationCenter
+	$(MAKE) buildAddon ADDON_NAME=OpenGL
+	$(MAKE) buildAddon ADDON_NAME=Postgres
+	$(MAKE) buildAddon ADDON_NAME=PostgreSQL
+	$(MAKE) buildAddon ADDON_NAME=Python
+	$(MAKE) buildAddon ADDON_NAME=QDBM
+	$(MAKE) buildAddon ADDON_NAME=Random
+	$(MAKE) buildAddon ADDON_NAME=Range
+	$(MAKE) buildAddon ADDON_NAME=Rational
+	$(MAKE) buildAddon ADDON_NAME=ReadLine
+	$(MAKE) buildAddon ADDON_NAME=Regex
+	$(MAKE) buildAddon ADDON_NAME=SampleRateConverter
+	$(MAKE) buildAddon ADDON_NAME=SHA1
+	$(MAKE) buildAddon ADDON_NAME=Socket
+	$(MAKE) buildAddon ADDON_NAME=SqlDatabase
+	$(MAKE) buildAddon ADDON_NAME=SQLite
+	$(MAKE) buildAddon ADDON_NAME=SQLite3
+	$(MAKE) buildAddon ADDON_NAME=SoundTouch
+	$(MAKE) buildAddon ADDON_NAME=Syslog
+	$(MAKE) buildAddon ADDON_NAME=SystemCall
+	$(MAKE) buildAddon ADDON_NAME=Thread
+	$(MAKE) buildAddon ADDON_NAME=User
+	$(MAKE) buildAddon ADDON_NAME=UUID
+	$(MAKE) buildAddon ADDON_NAME=Zlib
+
+build-indep: build-indep-stamp
+build-indep-stamp: configure-stamp
+	docbook-to-man debian/io.sgml > debian/io.1
+	# Create symlink for io_static
+	ln -s io.1 debian/io_static.1
+	touch $@
+
+clean-before-unpatch:
+	dh_testdir
+	dh_testroot
+	rm -f build-arch-stamp build-indep-stamp build-addons-stamp configure-stamp
+	$(MAKE) clean
+	dh_clean 
+
+clean: clean-before-unpatch unpatch
+	rm -f debian/io.1 debian/io_static.1
+
+install: install-indep install-arch
+install-indep:
+	dh_testdir
+	dh_testroot
+	dh_clean -k -i 
+	dh_installdirs -i
+
+	dh_install -i
+
+install-arch:
+	dh_testdir
+	dh_testroot
+	dh_clean -k -s 
+	dh_installdirs -s
+
+	# libiovmall.so library
+	$(MAKE) installSharedLibrary INSTALL_PREFIX=$(CURDIR)/debian/libiovmall0/usr
+	# libiovmall.so development files
+	$(MAKE) installDevelopmentFiles INSTALL_PREFIX=$(CURDIR)/debian/libiovmall0-dev/usr
+	# io binary
+	$(MAKE) installInterpreter INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-interpreter/usr
+	$(MAKE) installStandaloneInterpreter INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-standalone/usr
+	# ADDONS
+	$(MAKE) installAddon ADDON_NAME=AsyncRequest INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-asyncrequest/usr
+	$(MAKE) installAddon ADDON_NAME=BigNum INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-bignum/usr
+	$(MAKE) installAddon ADDON_NAME=Blowfish INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-blowfish/usr
+	$(MAKE) installAddon ADDON_NAME=Box INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-box/usr
+	$(MAKE) installAddon ADDON_NAME=CGI INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-cgi/usr
+	$(MAKE) installAddon ADDON_NAME=ContinuedFraction INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-continuedfraction/usr
+	$(MAKE) installAddon ADDON_NAME=Curses INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-curses/usr
+	$(MAKE) installAddon ADDON_NAME=DBI INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-dbi/usr
+	$(MAKE) installAddon ADDON_NAME=EditLine INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-editline/usr
+	$(MAKE) installAddon ADDON_NAME=Flux INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-flux/usr
+	$(MAKE) installAddon ADDON_NAME=Fnmatch INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-fnmatch/usr
+	$(MAKE) installAddon ADDON_NAME=Font INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-font/usr
+	$(MAKE) installAddon ADDON_NAME=HDB INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-hdb/usr
+	$(MAKE) installAddon ADDON_NAME=Image INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-image/usr
+	$(MAKE) installAddon ADDON_NAME=Libxml2 INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-libxml2/usr
+	$(MAKE) installAddon ADDON_NAME=LibSndFile INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-libsndfile/usr
+	$(MAKE) installAddon ADDON_NAME=LZO INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-lzo/usr
+	$(MAKE) installAddon ADDON_NAME=MD5 INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-md5/usr
+	$(MAKE) installAddon ADDON_NAME=MySQL INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-mysql/usr
+	$(MAKE) installAddon ADDON_NAME=NotificationCenter INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-notificationcenter/usr
+	$(MAKE) installAddon ADDON_NAME=OpenGL INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-opengl/usr
+	$(MAKE) installAddon ADDON_NAME=Postgres INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-postgres/usr
+	$(MAKE) installAddon ADDON_NAME=PostgreSQL INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-postgresql/usr
+	$(MAKE) installAddon ADDON_NAME=Python INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-python/usr
+	$(MAKE) installAddon ADDON_NAME=QDBM INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-qdbm/usr
+	$(MAKE) installAddon ADDON_NAME=Random INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-random/usr
+	$(MAKE) installAddon ADDON_NAME=Range INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-range/usr
+	$(MAKE) installAddon ADDON_NAME=Rational INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-rational/usr
+	$(MAKE) installAddon ADDON_NAME=ReadLine INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-readline/usr
+	$(MAKE) installAddon ADDON_NAME=Regex INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-regex/usr
+	$(MAKE) installAddon ADDON_NAME=SampleRateConverter INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-samplerateconverter/usr
+	$(MAKE) installAddon ADDON_NAME=SHA1 INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-sha1/usr
+	$(MAKE) installAddon ADDON_NAME=Socket INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-socket/usr
+	$(MAKE) installAddon ADDON_NAME=SqlDatabase INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-sqldatabase/usr
+	$(MAKE) installAddon ADDON_NAME=SQLite INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-sqlite/usr
+	$(MAKE) installAddon ADDON_NAME=SQLite3 INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-sqlite3/usr
+	$(MAKE) installAddon ADDON_NAME=SoundTouch INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-soundtouch/usr
+	$(MAKE) installAddon ADDON_NAME=Syslog INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-syslog/usr
+	$(MAKE) installAddon ADDON_NAME=SystemCall INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-systemcall/usr
+	$(MAKE) installAddon ADDON_NAME=Thread INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-thread/usr
+	$(MAKE) installAddon ADDON_NAME=User INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-user/usr
+	$(MAKE) installAddon ADDON_NAME=UUID INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-uuid/usr
+	$(MAKE) installAddon ADDON_NAME=Zlib INSTALL_PREFIX=$(CURDIR)/debian/iolanguage-zlib/usr
+	
+	dh_install -s
+
+binary-common:
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs 
+	# install docs but exlude that stray ".htmle" file
+	dh_installdocs -Xhtmle
+	dh_installman
+	dh_link
+	dh_strip
+	dh_compress 
+	dh_fixperms
+	dh_makeshlibs
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+# Build architecture independant packages using the common target.
+binary-indep: build-indep install-indep
+	$(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
+
+# Build architecture dependant packages using the common target.
+binary-arch: build-arch install-arch
+	$(MAKE) -f debian/rules DH_OPTIONS=-s binary-common
+
+binary: binary-arch binary-indep
+.PHONY: build clean clean-before-unpatch binary-indep binary-arch binary install install-indep install-arch configure
--- iolanguage-20080107.orig/debian/iolanguage-interpreter.manpages
+++ iolanguage-20080107/debian/iolanguage-interpreter.manpages
@@ -0,0 +1,2 @@
+debian/io.1
+
--- iolanguage-20080107.orig/debian/iolanguage-standalone.manpages
+++ iolanguage-20080107/debian/iolanguage-standalone.manpages
@@ -0,0 +1,2 @@
+debian/io_static.1
+
--- iolanguage-20080107.orig/debian/shlibs.local
+++ iolanguage-20080107/debian/shlibs.local
@@ -0,0 +1 @@
+libdbi 0 libdbi0 (>= 0.8)
--- iolanguage-20080107.orig/debian/TODO.Debian
+++ iolanguage-20080107/debian/TODO.Debian
@@ -0,0 +1,27 @@
+Format:
+	. tabs+star means an entry
+	. add [name] before description to grab the task
+	. delete the line when the task is done
+	. tabs+dot means comment to an entry
+	. items with same indent refer to item with less indent, not each other
+----
+	* fix lintian warnings
+		* #!io scripts in samples
+		* io scripts not executable in samples
+		* additional licences need special care
+		* RPATH in .so: opengl, regex
+			. changed the RPATHs to $ORIGIN/../../../<addon>/build/_dll
+			. Doesn't keep lintian from complaining but it won't cause the errors
+			  mentioned in <http://wiki.debian.org/RpathIssue>
+	* build all of the addons
+		* fix the build system to signal failure if any addons fail to build
+	* move addon installation to build.io
+		. let addons have specific installation hooks
+	* fix io_static
+		* make io_static a Debian alternative to io
+		. problem1: executable is named io in io_static.1
+		. porblem2: io_static.1 is a symlink to a file in another package
+	* fix copyright list
+		* patch copyright notices
+		* push copyright notices to upstream
+		* create a script to extract notices to copyright file
--- iolanguage-20080107.orig/debian/source.lintian-overrides
+++ iolanguage-20080107/debian/source.lintian-overrides
@@ -0,0 +1,3 @@
+# We have a dpatch that removes that file
+iolanguage source: configure-generated-file-in-source addons/SGML/source/libsgml/config.cache
+
--- iolanguage-20080107.orig/debian/iolanguage-doc.copyright
+++ iolanguage-20080107/debian/iolanguage-doc.copyright
@@ -0,0 +1,17 @@
+Copyright 2006 Steve Dekorte. All rights reserved.
+ 
+Redistribution and use of this document with or without modification, are
+permitted provided that the copies reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+ 
+This documentation is provided "as is" and any express or implied warranties,
+including, but not limited to, the implied warranties of merchantability and
+fitness for a particular purpose are disclaimed. In no event shall the Io
+documentation project be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to, procurement
+of substitute goods or services; loss of use, data, or profits; or business
+interruption) however caused and on any theory of liability, whether in
+contract, strict liability, or tort (including negligence or otherwise) arising
+in any way out of the use of this documentation, even if advised of the
+possibility of such damage.
